socket lock

Son, Sonny Sonny.Son at netapp.com
Wed Feb 26 23:53:04 UTC 2014


Thanks John-Mark. That explains. I will do more research and bug you guys again if I need help.

Regards...

-----Original Message-----
From: John-Mark Gurney [mailto:jmg at funkthat.com] 
Sent: Wednesday, February 26, 2014 2:54 PM
To: Son, Sonny
Cc: freebsd-net (freebsd-net at freebsd.org)
Subject: Re: socket lock

Son, Sonny wrote this message on Wed, Feb 26, 2014 at 22:47 +0000:
> Can somebody explain me how socket data structure-i.e. 'struct socket'-is protected in FreeBSD? It seems that socket is accessed and modified without lock in some places. As an instance, the following code reads and/or modifies various socket fields including so_error without socket lock held:

Have you seen this in sys/socketvar.h?
/*-
 * Locking key to struct socket:
 * (a) constant after allocation, no locking required.
 * (b) locked by SOCK_LOCK(so).
 * (c) locked by SOCKBUF_LOCK(&so->so_rcv).
 * (d) locked by SOCKBUF_LOCK(&so->so_snd).
 * (e) locked by ACCEPT_LOCK().
 * (f) not locked since integer reads/writes are atomic.
 * (g) used only as a sleep/wakeup address, no value.
 * (h) locked by global mutex so_global_mtx.
 */

> int
> sosend_dgram(struct socket *so, struct sockaddr *addr, struct uio *uio,
>     struct mbuf *top, struct mbuf *control, int flags, struct thread 
> *td) {

[...]

>         if (so->so_error) {
>                 error = so->so_error;
>                 so->so_error = 0;       <=========== we do have socket's send buffer lock but not socket lock (, which is socket recv buffer lock)
>                 SOCKBUF_UNLOCK(&so->so_snd);
>                 goto out;
>         }

So, so_error is:
        u_short so_error;               /* (f) error affecting connection */

and f is:
 * (f) not locked since integer reads/writes are atomic.

Though, I'm not so sure u_short counts as an integer.. it maybe should be something like u_register_t, but not sure about this...

-- 
  John-Mark Gurney				Voice: +1 415 225 5579

     "All that I will do, has been done, All that I have, has not."


More information about the freebsd-net mailing list