Page MenuHomeFreeBSD

D35492.id106945.diff
No OneTemporary

D35492.id106945.diff

Index: sys/kern/uipc_socket.c
===================================================================
--- sys/kern/uipc_socket.c
+++ sys/kern/uipc_socket.c
@@ -4273,10 +4273,17 @@
{
struct socket *so = arg;
- if (SOLISTENING(so))
- SOCK_LOCK(so);
- else
- SOCK_RECVBUF_LOCK(so);
+ for (;;) {
+ if (SOLISTENING(so)) {
+ SOLISTEN_LOCK(so);
+ break;
+ } else {
+ SOCK_RECVBUF_LOCK(so);
+ if (__predict_true(!SOLISTENING(so)))
+ break;
+ SOCK_RECVBUF_UNLOCK(so);
+ }
+ }
}
static void
@@ -4285,7 +4292,7 @@
struct socket *so = arg;
if (SOLISTENING(so))
- SOCK_UNLOCK(so);
+ SOLISTEN_UNLOCK(so);
else
SOCK_RECVBUF_UNLOCK(so);
}
@@ -4297,12 +4304,12 @@
if (what == LA_LOCKED) {
if (SOLISTENING(so))
- SOCK_LOCK_ASSERT(so);
+ SOLISTEN_LOCK_ASSERT(so);
else
SOCK_RECVBUF_LOCK_ASSERT(so);
} else {
if (SOLISTENING(so))
- SOCK_UNLOCK_ASSERT(so);
+ SOLISTEN_UNLOCK_ASSERT(so);
else
SOCK_RECVBUF_UNLOCK_ASSERT(so);
}
@@ -4313,10 +4320,17 @@
{
struct socket *so = arg;
- if (SOLISTENING(so))
- SOCK_LOCK(so);
- else
- SOCK_SENDBUF_LOCK(so);
+ for (;;) {
+ if (SOLISTENING(so)) {
+ SOLISTEN_LOCK(so);
+ break;
+ } else {
+ SOCK_SENDBUF_LOCK(so);
+ if (__predict_true(!SOLISTENING(so)))
+ break;
+ SOCK_SENDBUF_UNLOCK(so);
+ }
+ }
}
static void
@@ -4325,7 +4339,7 @@
struct socket *so = arg;
if (SOLISTENING(so))
- SOCK_UNLOCK(so);
+ SOLISTEN_UNLOCK(so);
else
SOCK_SENDBUF_UNLOCK(so);
}
@@ -4337,12 +4351,12 @@
if (what == LA_LOCKED) {
if (SOLISTENING(so))
- SOCK_LOCK_ASSERT(so);
+ SOLISTEN_LOCK_ASSERT(so);
else
SOCK_SENDBUF_LOCK_ASSERT(so);
} else {
if (SOLISTENING(so))
- SOCK_UNLOCK_ASSERT(so);
+ SOLISTEN_UNLOCK_ASSERT(so);
else
SOCK_SENDBUF_UNLOCK_ASSERT(so);
}
Index: sys/sys/socketvar.h
===================================================================
--- sys/sys/socketvar.h
+++ sys/sys/socketvar.h
@@ -254,6 +254,11 @@
KASSERT(SOLISTENING(sol), \
("%s: %p not listening", __func__, (sol))); \
} while (0)
+#define SOLISTEN_UNLOCK_ASSERT(sol) do { \
+ mtx_assert(&(sol)->so_lock, MA_NOTOWNED); \
+ KASSERT(SOLISTENING(sol), \
+ ("%s: %p not listening", __func__, (sol))); \
+} while (0)
/*
* Socket buffer locks. These are strongly preferred over SOCKBUF_LOCK(sb)

File Metadata

Mime Type
text/plain
Expires
Fri, Mar 7, 8:15 AM (19 h, 46 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
17028167
Default Alt Text
D35492.id106945.diff (2 KB)

Event Timeline