aboutsummaryrefslogtreecommitdiffstats
path: root/tools/libxc/xc_offline_page.c
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2009-10-07 07:46:36 +0100
committerKeir Fraser <keir.fraser@citrix.com>2009-10-07 07:46:36 +0100
commita98dc13703e091bb94e86a537d5c7a0ef9ffb62f (patch)
treebaddf36a6fe54f4d3ea1bc0238b69a3e5f0de4bc /tools/libxc/xc_offline_page.c
parent1766cdc32b025ecea48d880370ddd78ece9bfc71 (diff)
downloadxen-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.c45
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);