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

Re: [Xen-devel] [PATCH 02 of 12] x86/mm: Update mem sharing interface to (re)allow sharing of grants



Hi,

At 21:56 -0500 on 15 Jan (1326664582), Andres Lagar-Cavilla wrote:
> Previosuly, the mem sharing code would return an opaque handle to
> index shared pages (and nominees) in its global hash table.  By
> removing the hash table, the new interfaces requires a gfn and a
> version. However, when sharing grants, the caller provides a grant ref
> and a version. Update interface to handle this case.

I'm not sure I understand the motivation.  Is the idea that some HVM
domUs have granted memory to, let's call it domS, and domS then notices
that the contents are the same and tells Xen to share the original
frames?

In any case, the interface change should have some docuentation to match
it. :)

> Signed-off-by: Andres Lagar-Cavilla <andres@xxxxxxxxxxxxxxxx>
> Signed-off-by: Adin Scannell <adin@xxxxxxxxxxx>
> 
> diff -r 2a4112172e44 -r e0d8333e4725 xen/arch/x86/mm/mem_sharing.c
> --- a/xen/arch/x86/mm/mem_sharing.c
> +++ b/xen/arch/x86/mm/mem_sharing.c
> @@ -733,18 +733,57 @@ int mem_sharing_domctl(struct domain *d,
>  
>          case XEN_DOMCTL_MEM_EVENT_OP_SHARING_SHARE:
>          {
> -            unsigned long sgfn  = mec->u.share.source_gfn;
> -            shr_handle_t sh     = mec->u.share.source_handle;
> -            struct domain *cd   = 
> get_domain_by_id(mec->u.share.client_domain);
> -            if ( cd )
> +            unsigned long sgfn, cgfn;
> +            struct domain *cd;
> +            shr_handle_t sh, ch;
> +
> +            if ( !mem_sharing_enabled(d) )
> +                return -EINVAL;
> +
> +            cd = get_domain_by_id(mec->u.share.client_domain);
> +            if ( !cd )
> +                return -ESRCH;
> +
> +            if ( !mem_sharing_enabled(cd) )
>              {
> -                unsigned long cgfn  = mec->u.share.client_gfn;
> -                shr_handle_t ch     = mec->u.share.client_handle;
> -                rc = mem_sharing_share_pages(d, sgfn, sh, cd, cgfn, ch); 
>                  put_domain(cd);
> +                return -EINVAL;
>              }
> -            else
> -                return -EEXIST;
> +
> +            if ( 
> XEN_DOMCTL_MEM_SHARING_FIELD_IS_GREF(mec->u.share.source_gfn) )
> +            {
> +                grant_ref_t gref = (grant_ref_t) 
> +                                    (XEN_DOMCTL_MEM_SHARING_FIELD_GET_GREF(
> +                                        mec->u.share.source_gfn));
> +                if ( mem_sharing_gref_to_gfn(d, gref, &sgfn) < 0 )
> +                {
> +                    put_domain(cd);
> +                    return -EINVAL;
> +                }
> +            } else {
> +                sgfn  = mec->u.share.source_gfn;
> +            }
> +
> +            if ( 
> XEN_DOMCTL_MEM_SHARING_FIELD_IS_GREF(mec->u.share.client_gfn) )
> +            {
> +                grant_ref_t gref = (grant_ref_t) 
> +                                    (XEN_DOMCTL_MEM_SHARING_FIELD_GET_GREF(
> +                                        mec->u.share.client_gfn));
> +                if ( mem_sharing_gref_to_gfn(cd, gref, &cgfn) < 0 )
> +                {
> +                    put_domain(cd);
> +                    return -EINVAL;
> +                }
> +            } else {
> +                cgfn  = mec->u.share.client_gfn;
> +            }
> +
> +            sh = mec->u.share.source_handle;
> +            ch = mec->u.share.client_handle;
> +
> +            rc = mem_sharing_share_pages(d, sgfn, sh, cd, cgfn, ch); 
> +
> +            put_domain(cd);
>          }
>          break;
>  
> diff -r 2a4112172e44 -r e0d8333e4725 xen/include/public/domctl.h
> --- a/xen/include/public/domctl.h
> +++ b/xen/include/public/domctl.h
> @@ -775,6 +775,15 @@ DEFINE_XEN_GUEST_HANDLE(xen_domctl_mem_e
>  #define XEN_DOMCTL_MEM_SHARING_S_HANDLE_INVALID  (-10)
>  #define XEN_DOMCTL_MEM_SHARING_C_HANDLE_INVALID  (-9)
>  
> +#define XEN_DOMCTL_MEM_SHARING_FIELD_IS_GREF_FLAG   (1ULL << 62)
> +
> +#define XEN_DOMCTL_MEM_SHARING_FIELD_MAKE_GREF(field, val)  \
> +    (field) = (XEN_DOMCTL_MEM_SHARING_FIELD_IS_GREF_FLAG | val)
> +#define XEN_DOMCTL_MEM_SHARING_FIELD_IS_GREF(field)         \
> +    ((field) & XEN_DOMCTL_MEM_SHARING_FIELD_IS_GREF_FLAG)
> +#define XEN_DOMCTL_MEM_SHARING_FIELD_GET_GREF(field)        \
> +    ((field) & (~XEN_DOMCTL_MEM_SHARING_FIELD_IS_GREF_FLAG))
> +
>  struct xen_domctl_mem_sharing_op {
>      uint8_t op; /* XEN_DOMCTL_MEM_EVENT_OP_* */
>  
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxxxxxxxx
> http://lists.xensource.com/xen-devel

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

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