[netmp] socket accesses
Aggelos Economopoulos
aoiko at cc.ece.ntua.gr
Sat Aug 9 07:40:14 PDT 2008
On Saturday 09 August 2008, Matthew Dillon wrote:
[...]
> Ok, here are my suggestions:
[...]
I think I'm going to postpone answering to your suggestions until I start
writing the relevant code (that would be ASAP), so that we can talk specifics.
> :WRT SS_NOFDREF:
> :
> :- it is set on error by socreate(), but at this point the socket is not
> : reachable yet
> :...
> :So, unless I'm missing something, SS_NOFDREF is only modified before the socket
> :becomes relevant or after the socket is no longer reachable.
>
> Not sure about this one.
I'm going to recheck that.
> :Moving to so_incomp:
> :
> :it's modified by sofree() (only called by protocol thread), sonewconn (same) and
> :soisconnected(). The latter is called from process context (fifo_open,
> :portal_connect at least, maybe sctp too) and from the bluetooth netisr.
> :
> :->so_comp is modified by soclose (called from process context), soisconnected,
> :sonewconn (see above), soaccept_predicate, sctp_get_peeloff (of course!),
> :ng_ksocket_finish_accept().
> :
> :Assuming we can move all list modification in protocol thread context, the
> :list traversal would still be tricky. Maybe a spinlock protecting the lists and
> :queue lengths is in order for now? The same lock could be reused for protecting
> :SS_INCOMP, SS_COMP. In the future we might try something more clever if this
> :becomes a performance issue. Opinions?
[...]
> I think so_incomp is just used on listening sockets, right? Protecting
> it with a spinlock is probably just fine.
For now :)
> The so_state flags themselves would have to be set and cleared with
> atomic ops. Any situation which requires notifying the protocol stack,
> such as when userland sets CANTRCVMORE, can be done with a 'checkstate'
> style message to the protocol stack. The message would not contain the
> flag, userland would simply set the flag and then tell the protocol
> stack to check its flags state and do whatever needs to be done.
Not sure how to decide "what needs to be done".
> How about read()/write()/send()/recv()/etc? That is, so_rcvbuf and
> so_sndbuf operation? I'm thinking the mbuf chains are going to have
> to be protected with a lock of some sort. It seems like it should work,
> except when an mbuf must be split up... I think even that could be made
> to work if the new mbuf is pre-allocated/pre-cached so the split can
> occur inside the spinlock protection.
Quoting my self:
> If you haven't been paying attention, see here too
>
> http://wiki.dragonflybsd.org/index.cgi/NetMP
Which will point you to
http://leaf.dragonflybsd.org/mailarchive/kernel/2008-05/msg00003.html
and
http://leaf.dragonflybsd.org/mailarchive/kernel/2008-06/msg00085.html
You can use the web interface at
http://repo.or.cz/w/dragonfly/netmp.git?a=shortlog;h=refs/heads/sockbuf
to browse the code or try
git clone git://repo.or.cz/dragonfly/netmp.git
cd netmp
git branch sockbuf origin/sockbuf
git checkout sockbuf
to get an on-disk copy. The code needs a simplification pass, but mostly
works now (known issues at http://wiki.dragonflybsd.org/index.cgi/NetMP).
That should take care of the so_rcvbuf, so_sndbuf issues.
Aggelos
More information about the Kernel
mailing list