[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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.