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

Re: [Xen-devel] [PATCH v20 1/2] common: add a new mappable resource type: XENMEM_resource_grant_table



> -----Original Message-----
> From: Jan Beulich [mailto:JBeulich@xxxxxxxx]
> Sent: 07 August 2018 14:38
> To: Paul Durrant <Paul.Durrant@xxxxxxxxxx>
> Cc: Andrew Cooper <Andrew.Cooper3@xxxxxxxxxx>; Wei Liu
> <wei.liu2@xxxxxxxxxx>; George Dunlap <George.Dunlap@xxxxxxxxxx>; Ian
> Jackson <Ian.Jackson@xxxxxxxxxx>; Stefano Stabellini
> <sstabellini@xxxxxxxxxx>; xen-devel <xen-devel@xxxxxxxxxxxxxxxxxxxx>;
> Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>; Tim (Xen.org)
> <tim@xxxxxxx>
> Subject: Re: [PATCH v20 1/2] common: add a new mappable resource type:
> XENMEM_resource_grant_table
> 
> >>> On 06.08.18 at 14:54, <paul.durrant@xxxxxxxxxx> wrote:
> > --- a/xen/common/grant_table.c
> > +++ b/xen/common/grant_table.c
> > @@ -3860,6 +3860,38 @@ int mem_sharing_gref_to_gfn(struct
> grant_table *gt, grant_ref_t ref,
> >  }
> >  #endif
> >
> > +/* caller must hold read or write lock */
> > +static int gnttab_get_status_frame_mfn(struct domain *d,
> > +                                       unsigned long idx, mfn_t *mfn)
> > +{
> > +    struct grant_table *gt = d->grant_table;
> > +
> > +    if ( idx >= nr_status_frames(gt) )
> > +        return -EINVAL;
> > +
> > +    *mfn = _mfn(virt_to_mfn(gt->status[idx]));
> > +    return 0;
> > +}
> > +
> > +/* caller must hold write lock */
> > +static int gnttab_get_shared_frame_mfn(struct domain *d,
> > +                                       unsigned long idx, mfn_t *mfn)
> > +{
> > +    struct grant_table *gt = d->grant_table;
> > +
> > +    if ( gt->gt_version == 0 )
> > +        gt->gt_version = 1;
> > +
> > +    if ( (idx >= nr_grant_frames(gt)) && (idx < gt->max_grant_frames) )
> > +        gnttab_grow_table(d, idx + 1);
> 
> I guess I had commented on this before, but it has been a while:
> While I realize that you're just moving code, I dislike the resulting
> asymmetry between the two functions: Why would the former
> not want to grow the grant table? And why would a version
> adjustment be needed (only) here (I've put "only" in parentheses
> because it's not obvious to me why this is needed)?
> 
> And this asymmetry would surely be coming as surprise at least
> to callers of the new interface you add.
> 

I'm happy to have get_status_frame() grow the table too but it does mean a 
change in behaviour to callers of gnttab_map_frame(). If that's not a problem 
then I'll make the change.

The version adjustment may be a hangover from the previous code base. Juergen's 
per-domain gnttab adjustments have probably rendered this unnecessary so I'll 
drop it as long as nothing breaks.

> > +int gnttab_get_status_frame(struct domain *d, unsigned long idx,
> > +                            mfn_t *mfn)
> > +{
> > +    struct grant_table *gt = d->grant_table;
> > +    int rc;
> > +
> > +    grant_read_lock(gt);
> > +    rc = gnttab_get_status_frame_mfn(d, idx, mfn);
> > +    grant_read_unlock(gt);
> > +
> > +    return rc;
> > +}
> 
> Along the lines of what gnttab_map_frame() does, I'd expect a
> check for gt_version to be 2 here. Or well, maybe that's implicit
> by there not being any status entries/pages for version 1 tables.

Yes, that should be the case.

> But it would become a requirement if gnttab_grow_table() was to
> be called from gnttab_get_status_frame_mfn().
> 

Yes, so making that change will certainly add complexity.

> > @@ -982,6 +983,54 @@ static long xatp_permission_check(struct domain
> *d, unsigned int space)
> >      return xsm_add_to_physmap(XSM_TARGET, current->domain, d);
> >  }
> >
> > +static int acquire_grant_table(struct domain *d, unsigned int id,
> > +                               unsigned long frame,
> > +                               unsigned int nr_frames,
> > +                               xen_pfn_t mfn_list[])
> > +{
> > +    unsigned int i = nr_frames;
> > +
> > +    /*
> > +     * FIXME: It is not currently safe to map grant status frames if they
> > +     *        will be inserted into the caller's P2M, because these
> > +     *        insertions are not yet properly reference counted.
> > +     *        This restriction can be removed when appropriate reference
> > +     *        counting is added.
> > +     */
> > +    if ( paging_mode_translate(current->domain) &&
> > +         (id == XENMEM_resource_grant_table_id_status) )
> > +        return -EOPNOTSUPP;
> 
> Would you mind reminding me why the P2M insertions are safe for
> the "ordinary" (shared) grant frames? I'm puzzled because P2M
> management in general lacks refcounting, yet I have the vague
> feeling that we had discussed this before and there was a reason.
> (If there is, perhaps slightly extending the comment above would
> be helpful.)

My memory is hazy too so I'll have to mine back down the email traffic. Without 
having done that I can only assume it is because there is the possibility of 
mapping the status frames and then setting the version back to 1 thus causing 
the status frames to evaporate whilst still being present in the P2M. This 
clearly won't happen to the shared frames.

> 
> > --- a/xen/include/public/memory.h
> > +++ b/xen/include/public/memory.h
> > @@ -611,16 +611,21 @@ struct xen_mem_acquire_resource {
> >      uint16_t type;
> >
> >  #define XENMEM_resource_ioreq_server 0
> > +#define XENMEM_resource_grant_table 1
> >
> >      /*
> >       * IN - a type-specific resource identifier, which must be zero
> >       *      unless stated otherwise.
> >       *
> >       * type == XENMEM_resource_ioreq_server -> id == ioreq server id
> > +     * type == XENMEM_resource_grant_table -> id defined below
> >       */
> >      uint32_t id;
> > -    /*
> > -     * IN/OUT - As an IN parameter number of frames of the resource
> > +
> > +#define XENMEM_resource_grant_table_id_shared 0
> > +#define XENMEM_resource_grant_table_id_status 1
> > +
> > +    /* IN/OUT - As an IN parameter number of frames of the resource
> 
> Please don't break previously correct comment style here.
> 

Oh yes. Missed that bit of rebase breakage.

  Paul

> Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

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