diff options
author | rwatson <rwatson@FreeBSD.org> | 2004-06-17 22:48:11 +0000 |
---|---|---|
committer | rwatson <rwatson@FreeBSD.org> | 2004-06-17 22:48:11 +0000 |
commit | 855c4bb01f3e0dbfe6a96552fcb25a1aaf5de4cc (patch) | |
tree | 743d1903dca8bb885b1a5cafc69c5ea6ff190d62 /sys/netgraph | |
parent | 86c6c2575ccb9879f7db6d97a9a2b4b620e792d6 (diff) | |
download | FreeBSD-src-855c4bb01f3e0dbfe6a96552fcb25a1aaf5de4cc.zip FreeBSD-src-855c4bb01f3e0dbfe6a96552fcb25a1aaf5de4cc.tar.gz |
Merge additional socket buffer locking from rwatson_netperf:
- Lock down low hanging fruit use of sb_flags with socket buffer
lock.
- Lock down low hanging fruit use of so_state with socket lock.
- Lock down low hanging fruit use of so_options.
- Lock down low-hanging fruit use of sb_lowwat and sb_hiwat with
socket buffer lock.
- Annotate situations in which we unlock the socket lock and then
grab the receive socket buffer lock, which are currently actually
the same lock. Depending on how we want to play our cards, we
may want to coallesce these lock uses to reduce overhead.
- Convert a if()->panic() into a KASSERT relating to so_state in
soaccept().
- Remove a number of splnet()/splx() references.
More complex merging of socket and socket buffer locking to
follow.
Diffstat (limited to 'sys/netgraph')
-rw-r--r-- | sys/netgraph/bluetooth/socket/ng_btsocket_rfcomm.c | 12 | ||||
-rw-r--r-- | sys/netgraph/ng_ksocket.c | 14 |
2 files changed, 26 insertions, 0 deletions
diff --git a/sys/netgraph/bluetooth/socket/ng_btsocket_rfcomm.c b/sys/netgraph/bluetooth/socket/ng_btsocket_rfcomm.c index 09cb139..c4c29a3 100644 --- a/sys/netgraph/bluetooth/socket/ng_btsocket_rfcomm.c +++ b/sys/netgraph/bluetooth/socket/ng_btsocket_rfcomm.c @@ -997,8 +997,12 @@ ng_btsocket_rfcomm_sessions_task(void *ctx, int pending) /* Close L2CAP socket */ s->l2so->so_upcallarg = NULL; s->l2so->so_upcall = NULL; + SOCKBUF_LOCK(&s->l2so->so_rcv); s->l2so->so_rcv.sb_flags &= ~SB_UPCALL; + SOCKBUF_UNLOCK(&s->l2so->so_rcv); + SOCKBUF_LOCK(&s->l2so->so_snd); s->l2so->so_snd.sb_flags &= ~SB_UPCALL; + SOCKBUF_UNLOCK(&s->l2so->so_snd); soclose(s->l2so); mtx_unlock(&s->session_mtx); @@ -1237,8 +1241,12 @@ ng_btsocket_rfcomm_session_create(ng_btsocket_rfcomm_session_p *sp, /* Prepare L2CAP socket */ l2so->so_upcallarg = NULL; l2so->so_upcall = ng_btsocket_rfcomm_upcall; + SOCKBUF_LOCK(&l2so->so_rcv); l2so->so_rcv.sb_flags |= SB_UPCALL; + SOCKBUF_UNLOCK(&l2so->so_rcv); + SOCKBUF_LOCK(&l2so->so_snd); l2so->so_snd.sb_flags |= SB_UPCALL; + SOCKBUF_UNLOCK(&l2so->so_snd); l2so->so_state |= SS_NBIO; s->l2so = l2so; @@ -1317,8 +1325,12 @@ bad: /* Return L2CAP socket back to its original state */ l2so->so_upcallarg = NULL; l2so->so_upcall = NULL; + SOCKBUF_LOCK(&l2so->so_rcv); l2so->so_rcv.sb_flags &= ~SB_UPCALL; + SOCKBUF_LOCK(&l2so->so_rcv); + SOCKBUF_LOCK(&l2so->so_snd); l2so->so_snd.sb_flags &= ~SB_UPCALL; + SOCKBUF_LOCK(&l2so->so_snd); l2so->so_state &= ~SS_NBIO; mtx_destroy(&s->session_mtx); diff --git a/sys/netgraph/ng_ksocket.c b/sys/netgraph/ng_ksocket.c index f243318..458bbde 100644 --- a/sys/netgraph/ng_ksocket.c +++ b/sys/netgraph/ng_ksocket.c @@ -609,9 +609,15 @@ ng_ksocket_connect(hook_p hook) /* Add our hook for incoming data and other events */ priv->so->so_upcallarg = (caddr_t)node; priv->so->so_upcall = ng_ksocket_incoming; + SOCKBUF_LOCK(&priv->so->so_rcv); priv->so->so_rcv.sb_flags |= SB_UPCALL; + SOCKBUF_UNLOCK(&priv->so->so_rcv); + SOCKBUF_LOCK(&priv->so->so_snd); priv->so->so_snd.sb_flags |= SB_UPCALL; + SOCKBUF_UNLOCK(&priv->so->so_snd); + SOCK_LOCK(priv->so); priv->so->so_state |= SS_NBIO; + SOCK_UNLOCK(priv->so); /* * --Original comment-- * On a cloned socket we may have already received one or more @@ -941,8 +947,12 @@ ng_ksocket_shutdown(node_p node) /* Close our socket (if any) */ if (priv->so != NULL) { priv->so->so_upcall = NULL; + SOCKBUF_LOCK(&priv->so->so_rcv); priv->so->so_rcv.sb_flags &= ~SB_UPCALL; + SOCKBUF_UNLOCK(&priv->so->so_rcv); + SOCKBUF_LOCK(&priv->so->so_snd); priv->so->so_snd.sb_flags &= ~SB_UPCALL; + SOCKBUF_UNLOCK(&priv->so->so_snd); soclose(priv->so); priv->so = NULL; } @@ -1257,8 +1267,12 @@ ng_ksocket_finish_accept(priv_p priv) so->so_upcallarg = (caddr_t)node; so->so_upcall = ng_ksocket_incoming; + SOCKBUF_LOCK(&so->so_rcv); so->so_rcv.sb_flags |= SB_UPCALL; + SOCKBUF_UNLOCK(&so->so_rcv); + SOCKBUF_LOCK(&so->so_snd); so->so_snd.sb_flags |= SB_UPCALL; + SOCKBUF_UNLOCK(&so->so_snd); /* Fill in the response data and send it or return it to the caller */ resp_data = (struct ng_ksocket_accept *)resp->data; |