diff options
author | Keir Fraser <keir.fraser@citrix.com> | 2009-10-07 07:46:36 +0100 |
---|---|---|
committer | Keir Fraser <keir.fraser@citrix.com> | 2009-10-07 07:46:36 +0100 |
commit | a98dc13703e091bb94e86a537d5c7a0ef9ffb62f (patch) | |
tree | baddf36a6fe54f4d3ea1bc0238b69a3e5f0de4bc /tools/libxc/xc_offline_page.c | |
parent | 1766cdc32b025ecea48d880370ddd78ece9bfc71 (diff) | |
download | xen-a98dc13703e091bb94e86a537d5c7a0ef9ffb62f.tar.gz xen-a98dc13703e091bb94e86a537d5c7a0ef9ffb62f.tar.bz2 xen-a98dc13703e091bb94e86a537d5c7a0ef9ffb62f.zip |
Introduce a grant_entry_v2 structure.
Signed-off-by: Steven Smith <steven.smith@citrix.com>
Diffstat (limited to 'tools/libxc/xc_offline_page.c')
-rw-r--r-- | tools/libxc/xc_offline_page.c | 45 |
1 files changed, 35 insertions, 10 deletions
diff --git a/tools/libxc/xc_offline_page.c b/tools/libxc/xc_offline_page.c index 57ff5f05c9..21d26bd783 100644 --- a/tools/libxc/xc_offline_page.c +++ b/tools/libxc/xc_offline_page.c @@ -132,8 +132,8 @@ int xc_query_page_offline_status(int xc, unsigned long start, /* * There should no update to the grant when domain paused */ -static int xc_is_page_granted(int xc_handle, xen_pfn_t gpfn, - struct grant_entry_v1 *gnttab, int gnt_num) +static int xc_is_page_granted_v1(int xc_handle, xen_pfn_t gpfn, + struct grant_entry_v1 *gnttab, int gnt_num) { int i = 0; @@ -148,6 +148,22 @@ static int xc_is_page_granted(int xc_handle, xen_pfn_t gpfn, return (i != gnt_num); } +static int xc_is_page_granted_v2(int xc_handle, xen_pfn_t gpfn, + struct grant_entry_v2 *gnttab, int gnt_num) +{ + int i = 0; + + if (!gnttab) + return 0; + + for (i = 0; i < gnt_num; i++) + if ( ((gnttab[i].hdr.flags & GTF_type_mask) != GTF_invalid) && + (gnttab[i].frame == gpfn) ) + break; + + return (i != gnt_num); +} + static xen_pfn_t pfn_to_mfn(xen_pfn_t pfn, xen_pfn_t *p2m, int gwidth) { return ((xen_pfn_t) ((gwidth==8)? @@ -549,7 +565,8 @@ int xc_exchange_page(int xc_handle, int domid, xen_pfn_t mfn) struct domain_mem_info minfo; struct xc_mmu *mmu = NULL; struct pte_backup old_ptes = {NULL, 0, 0}; - struct grant_entry_v1 *gnttab = NULL; + struct grant_entry_v1 *gnttab_v1 = NULL; + struct grant_entry_v2 *gnttab_v2 = NULL; struct mmuext_op mops; int gnt_num, unpined = 0; void *old_p, *backup = NULL; @@ -588,14 +605,20 @@ int xc_exchange_page(int xc_handle, int domid, xen_pfn_t mfn) goto failed; } - gnttab = xc_gnttab_map_table(xc_handle, domid, &gnt_num); - if (!gnttab) + gnttab_v2 = xc_gnttab_map_table_v2(xc_handle, domid, &gnt_num); + if (!gnttab_v2) { - ERROR("Failed to map grant table\n"); - goto failed; + gnttab_v1 = xc_gnttab_map_table_v1(xc_handle, domid, &gnt_num); + if (!gnttab_v1) + { + ERROR("Failed to map grant table\n"); + goto failed; + } } - if (xc_is_page_granted(xc_handle, mfn, gnttab, gnt_num)) + if (gnttab_v1 + ? xc_is_page_granted_v1(xc_handle, mfn, gnttab_v1, gnt_num) + : xc_is_page_granted_v2(xc_handle, mfn, gnttab_v2, gnt_num)) { ERROR("Page %lx is granted now\n", mfn); goto failed; @@ -755,8 +778,10 @@ failed: if (backup) free(backup); - if (gnttab) - munmap(gnttab, gnt_num / (PAGE_SIZE/sizeof(struct grant_entry_v1))); + if (gnttab_v1) + munmap(gnttab_v1, gnt_num / (PAGE_SIZE/sizeof(struct grant_entry_v1))); + if (gnttab_v2) + munmap(gnttab_v2, gnt_num / (PAGE_SIZE/sizeof(struct grant_entry_v2))); close_mem_info(xc_handle, &minfo); |