[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH 06/12] xen: mark grant mapped pages as foreign



On Tue, 6 Jan 2015, David Vrabel wrote:
> 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);
> +}

Given that get_page_grant_ref is used by netback, these functions need
to be made arch-independent, moved to an arch-independent code location
and called appropriately.


>  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®.