[ofa-general] Re: [PATCH 8/11] core: XRC receive-only QPs
Jack Morgenstein
jackm at dev.mellanox.co.il
Thu Jul 3 00:09:23 PDT 2008
On Wednesday 02 July 2008 18:04, Jack Morgenstein wrote:
> On Tuesday 24 June 2008 00:53, Roland Dreier wrote:
> > > @@ -769,6 +775,7 @@ struct ib_ucontext {
> > > struct list_head srq_list;
> > > struct list_head ah_list;
> > > struct list_head xrc_domain_list;
> > > + struct list_head xrc_reg_qp_list;
> > > int closing;
> > > };
> >
> > Wouldn't it be cleaner to keep the like of recv QPs per xrcd? Then you
> > wouldn't have to do stuff like:
> >
> > > + list_for_each_entry(tmp, &file->ucontext->xrc_reg_qp_list, list)
> > > + if (cmd.xrcd_handle == tmp->domain_handle) {
> >
> > instead you could just do a list_empty() test.
> >
> Currently, there is no per-process object for xrc domains. I needed a list
> of qp's registered ***per-process***, so that I could prevent closing a domain (for that process)
> while that process still had registered QPs on that domain. This was especially true if
> the current process was the last one using the domain -- so that the domain itself would be deleted
> when close_domain was invoked.
>
> With the check in place, if the user tried to close the domain while there were QPs registered,
> he gets an error. If the user does not close the domain, and does not unregister all the QPs
> for that process, this gets done in ib_uverbs_cleanup_ucontext() (in the proper order), so there
> are no resource leaks.
>
> I think that here we have "6 of one, half a dozen of the other":
> If I register QPs per xrcd, I either have to create and manage an xrcd
> user-space specific object (e.g., struct ib_uxrcd_object) -- instead of the generic ib_uobject,
> or I need to save the process ID per QP in an xrcd list of QPs -- and then I would need to
> check for equality of PIDs, rather than domain handles.
>
> I think the way things are now is relatively simpler.
On second thought, I'll look at this again for a day or two. It is a medium-complexity code change, which
needs to be thoroughly tested out.
I'll need to define an ib_uxrcd_object, and place the xrc_reg_qp_list in that uobject. When cleaning up the
process, I'll just need to unregister all the xrc_rcv_qp's in a loop within the xrc domain cleanup loop
(i.e. list_for_each_entry_safe(uobj, tmp, &context->xrc_domain_list, list) {
struct ib_xrcd *xrcd = uobj->object;
===> xrc_rcv_qp list cleanup here, in a "for each" loop
idr_remove_uobj(&ib_uverbs_xrc_domain_idr, uobj);
ib_uverbs_dealloc_xrcd(file->device->ib_dev, xrcd);
kfree(uobj);
}
mutex_unlock(&file->device->ib_dev->xrcd_table_mutex);
)
When registering/unregistering xrc_rcv_qp's, I need to manage the qp list within the ib_uxrcd_object.
I do agree that this would be logically cleaner, since this way the receive qp's per process xrc domain
are contained in the process' xrc domain object.
- Jack
More information about the general
mailing list