summaryrefslogtreecommitdiffstats
path: root/sys/kern/uipc_socket.c
diff options
context:
space:
mode:
authorrwatson <rwatson@FreeBSD.org>2008-02-04 12:25:13 +0000
committerrwatson <rwatson@FreeBSD.org>2008-02-04 12:25:13 +0000
commitf23198af5c5d671548e3ad76cf9a569dbc55bd0d (patch)
tree07b631ecc21ddad4957ba8b20d818e81af4c6e1f /sys/kern/uipc_socket.c
parentce24cd825a8e9934cab77ec673e88f417d5afab1 (diff)
downloadFreeBSD-src-f23198af5c5d671548e3ad76cf9a569dbc55bd0d.zip
FreeBSD-src-f23198af5c5d671548e3ad76cf9a569dbc55bd0d.tar.gz
Further clean up sorflush:
- Expose sbrelease_internal(), a variant of sbrelease() with no expectations about the validity of locks in the socket buffer. - Use sbrelease_internel() in sorflush(), and as a result avoid intializing and destroying a socket buffer lock for the temporary stack copy of the actual buffer, asb. - Add a comment indicating why we do what we do, and remove an XXX since things have gotten less ugly in sorflush() lately. This makes socket close cleaner, and possibly also marginally faster. MFC after: 3 weeks
Diffstat (limited to 'sys/kern/uipc_socket.c')
-rw-r--r--sys/kern/uipc_socket.c24
1 files changed, 12 insertions, 12 deletions
diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c
index 0de6d29..bbb4f89 100644
--- a/sys/kern/uipc_socket.c
+++ b/sys/kern/uipc_socket.c
@@ -1877,15 +1877,13 @@ sorflush(struct socket *so)
struct sockbuf asb;
/*
- * XXXRW: This is quite ugly. Previously, this code made a copy of
- * the socket buffer, then zero'd the original to clear the buffer
- * fields. However, with mutexes in the socket buffer, this causes
- * problems. We only clear the zeroable bits of the original;
- * however, we have to initialize and destroy the mutex in the copy
- * so that dom_dispose() and sbrelease() can lock t as needed.
- */
-
- /*
+ * In order to avoid calling dom_dispose with the socket buffer mutex
+ * held, and in order to generally avoid holding the lock for a long
+ * time, we make a copy of the socket buffer and clear the original
+ * (except locks, state). The new socket buffer copy won't have
+ * initialized locks so we can only call routines that won't use or
+ * assert those locks.
+ *
* Dislodge threads currently blocked in receive and wait to acquire
* a lock against other simultaneous readers before clearing the
* socket buffer. Don't let our acquire be interrupted by a signal
@@ -1907,11 +1905,13 @@ sorflush(struct socket *so)
SOCKBUF_UNLOCK(sb);
sbunlock(sb);
- SOCKBUF_LOCK_INIT(&asb, "so_rcv");
+ /*
+ * Dispose of special rights and flush the socket buffer. Don't call
+ * any unsafe routines (that rely on locks being initialized) on asb.
+ */
if (pr->pr_flags & PR_RIGHTS && pr->pr_domain->dom_dispose != NULL)
(*pr->pr_domain->dom_dispose)(asb.sb_mb);
- sbrelease(&asb, so);
- SOCKBUF_LOCK_DESTROY(&asb);
+ sbrelease_internal(&asb, so);
}
/*
OpenPOWER on IntegriCloud