>>> On 06.10.17 at 14:25, <paul.durr...@citrix.com> wrote:
> --- a/xen/common/grant_table.c
> +++ b/xen/common/grant_table.c
> @@ -3756,14 +3756,13 @@ int mem_sharing_gref_to_gfn(struct grant_table *gt, 
> grant_ref_t ref,
>  }
>  #endif
>  
> -int gnttab_map_frame(struct domain *d, unsigned long idx, gfn_t gfn,
> -                     mfn_t *mfn)
> +/* Caller must hold write lock as version may change and table may grow */
> +static int gnttab_get_frame_locked(struct domain *d, unsigned long idx,
> +                                   mfn_t *mfn)

I don't think this helper function needs to be passed d; gt appears
to suffice.

> @@ -3787,6 +3786,19 @@ int gnttab_map_frame(struct domain *d, unsigned long 
> idx, gfn_t gfn,
>              rc = -EINVAL;
>      }
>  
> +    return rc;
> +}
> +
> +int gnttab_map_frame(struct domain *d, unsigned long idx, gfn_t gfn,
> +                     mfn_t *mfn)
> +{
> +    struct grant_table *gt = d->grant_table;
> +    int rc;
> +
> +    grant_write_lock(gt);
> +
> +    rc = gnttab_get_frame_locked(d, idx, mfn);
> +
>      if ( !rc )
>          gnttab_set_frame_gfn(gt, idx, gfn);
>  
> @@ -3795,6 +3807,18 @@ int gnttab_map_frame(struct domain *d, unsigned long 
> idx, gfn_t gfn,
>      return rc;
>  }
>  
> +int gnttab_get_frame(struct domain *d, unsigned long idx, mfn_t *mfn)

const struct domain * (I realize now that the same should have
been done for gnttab_map_frame() when it was introduced;
perhaps you could change that at the same time).

> @@ -966,6 +967,30 @@ static long xatp_permission_check(struct domain *d, 
> unsigned int space)
>  }
>  
>  #ifdef CONFIG_X86
> +static int acquire_grant_table(struct domain *d, unsigned int id,

This clearly isn't x86-specific code.

> +                               unsigned long frame,
> +                               unsigned long nr_frames,
> +                               unsigned long mfn_list[])
> +{
> +    unsigned int i = nr_frames;

Silent truncation just like in the earlier patch.

> +    if ( id != 0 )

Do we want a constant here again? Also acquiring the status page
MFNs via separate ID would seem better than re-using
XENMAPIDX_grant_table_status here, the more that this uses bit
31 while right now your interface structure field is still 64 bits wide.

> @@ -993,6 +1018,11 @@ static int acquire_resource(const 
> xen_mem_acquire_resource_t *xmar)
>                                           xmar->nr_frames, mfn_list);
>          break;
>  
> +    case XENMEM_resource_grant_table:
> +        rc = acquire_grant_table(d, xmar->id, xmar->frame,
> +                                 xmar->nr_frames, mfn_list);
> +        break;

Is this really generally useful with mfn_list[] having just two entries?

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

Reply via email to