[ofa-general] Re: [PATCH RFC] sharing userspace IB objects
Roland Dreier
rdreier at cisco.com
Mon Jul 2 09:36:54 PDT 2007
> Generally, I think it would be nice if this could work
> in the same way as with multiple threads: a single process does
> destroy, the rest must not use the same object after this,
> synchronisation it up to the app.
>
> But you made me realise that we need an API for non-controlling processes to
> release the userspace resources without destroying the kernel-level object.
What is a non-controlling process? To the uverbs code in the kernel
there is only one file structure that happens to be shared by multiple
processes. But they are all equal.
> > I think there are probably bugs
> > in the locked_vm accounting in the kernel right now -- it doesn't take
> > into account the possibility of passing context fds from one process
> > to another.
>
> Hmm, might be a good idea to fix the bugs anyway, no?
Yes, I guess we need to take a reference on the mm structure in
ib_umem_get() and only drop it after we free the umem.
> > Should process B be
> > able to destroy it? What if process A is still alive -- should
> > process B be able to destroy the QP?
>
> I think in practice a single process will do this.
> My approach generally is: let's have same rules as for multiple threads.
I don't think it's quite as simple as saying that it's just like
multiple threads. Creating/destroying QPs from a PD shared by
multiple processes opens lots of problems. Let's take the mthca case:
the userspace driver needs to have a table of QPN -> QP struct so that
it can look up which QP a completion belongs to.
This means that if process A and process B share QP X, then X has to
be in the QP table of both processes. OK, that's fine, when QP X gets
passed from A to B, then B can put it in the table. But what happens
when B destroys QP X? How does process A know to take X out of its table?
What if process A has died in the meantime?
Or what if process A and process B share CQ 1, and process B creates
QP Y in a non-shared PD but attaches it to CQ 1? What happens when
process A polls a completion for QP Y from CQ 1?
> > I guess we need this to be able to re-mmap doorbell pages etc, right?
> > I wonder if there's a better way around that... maybe extending the
> > kernel interface so that unrelated processes can share a context, eg
> > by putting contexts in a filesystem or something like that.
>
> Hmm, I don't have principal objection, however this would mean
> we'd have to change kernel-user interface again. the proposed
> API extensions can mostly be done in userspace only.
>
> And it seems to me like much more work that just let the app
> use unix domain sockets, for me. What are the advantages of this approach?
>
> Further, since there is already an existing kernel interface for this,
> should we be inventing our own?
The advantage is that sharing objects in a filesystem by doing open(),
protected by permissions etc. is much more familiar than passing fds
through sockets. I'm not sure it makes sense but shared memory + unix
domain socket fd passing is not a very natural way for most people to
program.
- R.
More information about the general
mailing list