Re: [PATCH for-next 1/1] IB/{hw,sw}: remove 'uobject->context' dependency in object creation APIs

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

 



On Mon, Jan 28, 2019 at 07:03:47PM +0200, Shamir Rabinovitch wrote:
> On Tue, Jan 22, 2019 at 09:02:18AM -0700, Jason Gunthorpe wrote:
> > On Tue, Jan 22, 2019 at 05:43:42PM +0200, Shamir Rabinovitch wrote:
> > > > @@ -316,6 +317,7 @@ static int uverbs_process_attr(struct bundle_priv *pbundle,
> > > >                 if (IS_ERR(o_attr->uobject))
> > > >                         return PTR_ERR(o_attr->uobject);
> > > >                 __set_bit(attr_bkey, pbundle->uobj_finalize);
> > > > +               pbundle->bundle.ucontext = o_attr->uoboject.ucontext;
> > > >  
> > > >                 if (spec->u.obj.access == UVERBS_ACCESS_NEW) {
> > > >                         unsigned int uattr_idx = uattr - pbundle->uattrs;
> > > > 
> > > > And the cmd path needs some editing of its alloc/get macros
> > > 
> > > 
> > > OK. If I take ib_uverbs_alloc_pd as example I see:
> > > 
> > > ib_uverbs_write -> ib_uverbs_alloc_pd -> uobj_alloc -> __uobj_alloc ->
> > > rdma_alloc_begin_uobject -> alloc_begin_idr_uobject -> alloc_uobj -> 
> > > ib_uverbs_get_ucontext_file
> > > 
> > > So it seems that the best place to pass the ib_ucontext to
> > > uverbs_attr_bundle is in __uobj_alloc in this call chain.
> > 
> > Probably yes
> > 
> > > I have this question about ib_ucontext in ib_uobject:
> > > 
> > > I see this comment above ib_uverbs_get_ucontext_file:
> > > "
> > > * Must be called with the ufile->device->disassociate_srcu held, and the lock
> > > * must be held until use of the ucontext is finished.
> > > "
> > > 
> > > Surly, when ib_uobject has pointer to ib_ucontext the above lock is
> > > not held for all the duration.
> > 
> > The comment is only for ib_uverbs_get_ucontext_file() callers.
> > 
> > But for the ucontext in the ib_uobject - all accesses to it have to be
> > covered under a srcu & UVERBS_LOOKUP_READ/WRITE or the
> > hw_destroy_rwsem to make sure the pointer is still
> > alive. uverbs_destroy_uobject() sets the ucontext to NULL during
> > disassociate, so every reader must have locking against that set.
> > 
> > > Is it the fact that ib_uobject are only accessed via ib_uverbs_write
> > > for commands which hold the disassociate_srcu and that
> > > uverbs_disassociate_api_pre disable the commands for uverbs_api for
> > > that ib_uverbs_device ?
> > 
> > Running under the commands is what provides the srcu lock, but this
> > test here in rdma_lookup_get_uobject:
> > 
> >         /*
> >          * If we have been disassociated block every command except for
> >          * DESTROY based commands.
> >          */
> >         if (mode != UVERBS_LOOKUP_DESTROY &&
> >             !srcu_dereference(ufile->device->ib_dev,
> >                               &ufile->device->disassociate_srcu)) {
> > 
> >         ret = uverbs_try_lock_object(uobj, mode);
> > 
> > Is what is excluding parallel dis-association. Once the per-uobject
> > read/write lock is obtained under the srcu the ucontext pointer cannot be
> > null'd.
> > 
> > > Are there any paths that touch ib_uobject but not with in
> > > ib_uverbs_write protection ?
> > 
> > Everything should use this system.
> > 
> > > Is this related to the point that you do not want to assume ib_udata
> > > (&context) in the ib_xxx destroy path ?
> > 
> > Not really.. the destroy path will still have a ucontext since
> > ucontext cannot be destroyed until all of the ubojects are destroyed,
> > but under sharing it might not be the same ucontext that was used to
> > create the object - so what use could destroy have of it?
> 
> Create path can have same issue... If driver object hold information on
> the context and we want to share it to another context we have problem
> that we cannot duplicate per context information (we might have more
> then 2 context at that point so who is the up-to-date..?)

Well, a driver might be able to get by if it was syemmtric (ie always release
the resource against the allocating PD) but it complicates ucontext
destruction.

> Will it be acceptable to eliminate the use of ib_uobject in destroy APIs
> via the use of ib_udata embedded in attr bundle as next step?

Yes, we can do that.. For non-sharable objects it would be no change
in behavior.
 
> I think we need some way the rdma & uverbs could query the driver and
> ask if specific object type can be shared or not within that driver.
> Sound like that each driver need to supply this:
> 
> bool is_shareable(enum uverbs_default_objects object)

I think drivers will need to have a flags that says what objects they
can allow for sharing. Each driver will have to be audited before they
can support sharing unfortunately.

> At same time I think that all the interface between uverbs - rdma -
> driver need to support sharing. The meaning is that we need a way to 
> duplicate existing driver object and return the driver specific
> information to user. 

I don't think we should be duplicating the driver object, sharing
should be a uverbs thing where it just creates a new uobject and
points to the same driver object. Somehow this has to work out
a lifetime too.

> Probably if driver want to enable share of some object it first need to
> move all the related data of this object out of the ib_ucontext and then
> add the code that duplicate the object and only then enable the sharing
> via 'is_shareable'.

Most likely

Jason



[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Photo]     [Yosemite News]     [Yosemite Photos]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux