[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 |