|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 06/12] xen: mark grant mapped pages as foreign
From: Jenny Herbert <jennifer.herbert@xxxxxxxxxx>
Use the "foreign" page flag to mark pages that have a grant map. Use
page->private to store information of the grant (the granting domain
and the grant reference).
Signed-off-by: Jenny Herbert <jenny.herbert@xxxxxxxxxx>
Signed-off-by: David Vrabel <david.vrabel@xxxxxxxxxx>
---
arch/x86/xen/p2m.c | 50 ++++++++++++++++++++++++++++++++++++++-------
include/xen/grant_table.h | 13 ++++++++++++
2 files changed, 56 insertions(+), 7 deletions(-)
diff --git a/arch/x86/xen/p2m.c b/arch/x86/xen/p2m.c
index 0d70814..22624a3 100644
--- a/arch/x86/xen/p2m.c
+++ b/arch/x86/xen/p2m.c
@@ -648,6 +648,43 @@ bool set_phys_to_machine(unsigned long pfn, unsigned long
mfn)
return true;
}
+static int
+init_page_grant_ref(struct page *p, domid_t domid, grant_ref_t grantref)
+{
+#ifdef CONFIG_X86_64
+ uint64_t gref;
+ uint64_t* gref_p = &gref;
+#else
+ uint64_t* gref_p = kmalloc(sizeof(uint64_t), GFP_KERNEL);
+ if (!gref)
+ return -ENOMEM;
+ uint64_t* gref = gref_p;
+#endif
+
+ *gref_p = ((uint64_t) grantref << 32) | domid;
+ p->private = gref;
+
+ WARN_ON(PagePrivate(p));
+ WARN_ON(PageForeign(p));
+ SetPagePrivate(p);
+ SetPageForeign(p);
+ return 0;
+}
+
+static void
+clear_page_grant_ref(struct page *p)
+{
+ WARN_ON(!PagePrivate(p));
+ WARN_ON(!PageForeign(p));
+
+#ifndef CONFIG_X86_64
+ kfree(p->private);
+#endif
+ p->private = 0;
+ ClearPagePrivate(p);
+ ClearPageForeign(p);
+}
+
int set_foreign_p2m_mapping(struct gnttab_map_grant_ref *map_ops,
struct gnttab_map_grant_ref *kmap_ops,
struct page **pages, unsigned int count)
@@ -681,11 +718,12 @@ int set_foreign_p2m_mapping(struct gnttab_map_grant_ref
*map_ops,
}
pfn = page_to_pfn(pages[i]);
- WARN_ON(PagePrivate(pages[i]));
- WARN(pfn_to_mfn(pfn) != INVALID_P2M_ENTRY, "page must be
ballooned");
+ ret = init_page_grant_ref(pages[i],
+ map_ops[i].dom, map_ops[i].ref);
+ if (ret < 0)
+ goto out;
- SetPagePrivate(pages[i]);
- set_page_private(pages[i], mfn);
+ WARN(pfn_to_mfn(pfn) != INVALID_P2M_ENTRY, "page must be
ballooned");
if (unlikely(!set_phys_to_machine(pfn, FOREIGN_FRAME(mfn)))) {
ret = -ENOMEM;
@@ -716,9 +754,7 @@ int clear_foreign_p2m_mapping(struct gnttab_unmap_grant_ref
*unmap_ops,
goto out;
}
- set_page_private(pages[i], INVALID_P2M_ENTRY);
- WARN_ON(!PagePrivate(pages[i]));
- ClearPagePrivate(pages[i]);
+ clear_page_grant_ref(pages[i]);
set_phys_to_machine(pfn, INVALID_P2M_ENTRY);
}
if (kunmap_ops)
diff --git a/include/xen/grant_table.h b/include/xen/grant_table.h
index 7235d8f..381f007 100644
--- a/include/xen/grant_table.h
+++ b/include/xen/grant_table.h
@@ -45,6 +45,7 @@
#include <asm/xen/hypervisor.h>
#include <xen/features.h>
+#include <linux/mm_types.h>
#define GNTTAB_RESERVED_XENSTORE 1
@@ -182,4 +183,16 @@ int gnttab_unmap_refs(struct gnttab_unmap_grant_ref
*unmap_ops,
void gnttab_batch_map(struct gnttab_map_grant_ref *batch, unsigned count);
void gnttab_batch_copy(struct gnttab_copy *batch, unsigned count);
+static inline void
+get_page_grant_ref(struct page *p, domid_t* domid, grant_ref_t* grantref)
+{
+#ifdef CONFIG_X86_64
+ uint64_t gref = p->private;
+#else
+ uint64_t gref = *p->private;
+#endif
+ *domid = gref & 0xffff;
+ *grantref = gref >> 32;
+}
+
#endif /* __ASM_GNTTAB_H__ */
--
1.7.10.4
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |