Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F163357015
D28736.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
7 KB
Referenced Files
None
Subscribers
None
D28736.diff
View Options
Index: sys/amd64/conf/GENERIC
===================================================================
--- sys/amd64/conf/GENERIC
+++ sys/amd64/conf/GENERIC
@@ -395,3 +395,9 @@
options HID_DEBUG # enable debug msgs
device hid # Generic HID support
options IICHID_SAMPLING # Workaround missing GPIO INTR support
+
+
+# More debug
+options DEBUG_VFS_LOCKS # enable VFS lock debugging
+options SOCKBUF_DEBUG # enable sockbuf last record/mb tail checking
+options IFMEDIA_DEBUG # enable debugging in net/if_media.c
Index: sys/amd64/conf/GENERIC-KCSAN
===================================================================
--- sys/amd64/conf/GENERIC-KCSAN
+++ sys/amd64/conf/GENERIC-KCSAN
@@ -39,3 +39,8 @@
options NETSMB # Seems to be needed by SMBFS
options LIBMCHAIN # Also seems to be needed by SMBFS
options LIBICONV # Also seems to be needed by SMBFS
+
+# More debug
+options DEBUG_VFS_LOCKS # enable VFS lock debugging
+options SOCKBUF_DEBUG # enable sockbuf last record/mb tail checking
+options IFMEDIA_DEBUG # enable debugging in net/if_media.c
Index: sys/kern/sys_socket.c
===================================================================
--- sys/kern/sys_socket.c
+++ sys/kern/sys_socket.c
@@ -228,12 +228,14 @@
if (SOLISTENING(so)) {
error = EINVAL;
} else {
+ SOCKBUF_LOCK(&so->so_snd);
if ((so->so_snd.sb_hiwat < sbused(&so->so_snd)) ||
(so->so_snd.sb_mbmax < so->so_snd.sb_mbcnt)) {
*(int *)data = 0;
} else {
*(int *)data = sbspace(&so->so_snd);
}
+ SOCKBUF_UNLOCK(&so->so_snd);
}
break;
Index: sys/kern/uipc_sockbuf.c
===================================================================
--- sys/kern/uipc_sockbuf.c
+++ sys/kern/uipc_sockbuf.c
@@ -296,7 +296,7 @@
sbfree(struct sockbuf *sb, struct mbuf *m)
{
-#if 0 /* XXX: not yet: soclose() call path comes here w/o lock. */
+#if 1 /* XXX: not yet: soclose() call path comes here w/o lock. */
SOCKBUF_LOCK_ASSERT(sb);
#endif
@@ -366,7 +366,7 @@
sbfree_ktls_rx(struct sockbuf *sb, struct mbuf *m)
{
-#if 0 /* XXX: not yet: soclose() call path comes here w/o lock. */
+#if 1 /* XXX: not yet: soclose() call path comes here w/o lock. */
SOCKBUF_LOCK_ASSERT(sb);
#endif
@@ -745,13 +745,15 @@
void
sbdestroy(struct sockbuf *sb, struct socket *so)
{
-
+ MPASS(so->so_count == 0 || so->so_count == 1);
+ SOCKBUF_LOCK(sb); // XXX: not needed but silences assertions
sbrelease_internal(sb, so);
#ifdef KERN_TLS
if (sb->sb_tls_info != NULL)
ktls_free(sb->sb_tls_info);
sb->sb_tls_info = NULL;
#endif
+ SOCKBUF_UNLOCK(sb); // XXX: no needed
}
/*
Index: sys/netinet/tcp_input.c
===================================================================
--- sys/netinet/tcp_input.c
+++ sys/netinet/tcp_input.c
@@ -1450,10 +1450,12 @@
tp->t_srtt != 0 && tp->rfbuf_ts != 0 &&
TCP_TS_TO_TICKS(tcp_ts_getticks() - tp->rfbuf_ts) >
((tp->t_srtt >> TCP_RTT_SHIFT)/2)) {
+ SOCKBUF_LOCK(&so->so_rcv);
if (tp->rfbuf_cnt > ((so->so_rcv.sb_hiwat / 2)/ 4 * 3) &&
so->so_rcv.sb_hiwat < V_tcp_autorcvbuf_max) {
newsize = min((so->so_rcv.sb_hiwat + (so->so_rcv.sb_hiwat/2)), V_tcp_autorcvbuf_max);
}
+ SOCKBUF_UNLOCK(&so->so_rcv);
TCP_PROBE6(receive__autoresize, NULL, tp, m, tp, th, newsize);
/* Start over with next RTT. */
@@ -1864,7 +1866,7 @@
goto check_delack;
}
} else if (th->th_ack == tp->snd_una &&
- tlen <= sbspace(&so->so_rcv)) {
+ tlen <= sbspace_dolock(&so->so_rcv)) {
int newsize = 0; /* automatic sockbuf scaling */
/*
@@ -1941,7 +1943,7 @@
* Receive window is amount of space in rcv queue,
* but not less than advertised window.
*/
- win = sbspace(&so->so_rcv);
+ win = sbspace_dolock(&so->so_rcv);
if (win < 0)
win = 0;
tp->rcv_wnd = imax(win, (int)(tp->rcv_adv - tp->rcv_nxt));
@@ -2986,12 +2988,17 @@
* we should release the tp also, and use a
* compressed state.
*/
+ SOCKBUF_UNLOCK_ASSERT(&so->so_rcv);
+ SOCKBUF_LOCK(&so->so_rcv);
if (so->so_rcv.sb_state & SBS_CANTRCVMORE) {
+ SOCKBUF_UNLOCK(&so->so_rcv);
soisdisconnected(so);
tcp_timer_activate(tp, TT_2MSL,
(tcp_fast_finwait2_recycle ?
tcp_finwait2_timeout :
TP_MAXIDLE(tp)));
+ } else {
+ SOCKBUF_UNLOCK(&so->so_rcv);
}
tcp_state_change(tp, TCPS_FIN_WAIT_2);
}
@@ -3219,6 +3226,7 @@
* buffer size.
* XXX: Unused.
*/
+ SOCKBUF_LOCK_ASSERT(&so->so_rcv);
if (SEQ_GT(tp->rcv_adv, tp->rcv_nxt))
len = so->so_rcv.sb_hiwat - (tp->rcv_adv - tp->rcv_nxt);
else
Index: sys/netinet/tcp_output.c
===================================================================
--- sys/netinet/tcp_output.c
+++ sys/netinet/tcp_output.c
@@ -572,6 +572,7 @@
flags &= ~TH_FIN;
}
+ SOCKBUF_LOCK(&so->so_rcv);
recwin = lmin(lmax(sbspace(&so->so_rcv), 0),
(long)TCP_MAXWIN << tp->rcv_scale);
@@ -759,10 +760,12 @@
*/
just_return:
SOCKBUF_UNLOCK(&so->so_snd);
+ SOCKBUF_UNLOCK(&so->so_rcv);
return (0);
send:
SOCKBUF_LOCK_ASSERT(&so->so_snd);
+ SOCKBUF_LOCK_ASSERT(&so->so_rcv);
if (len > 0) {
if (len >= tp->t_maxseg)
tp->t_flags2 |= TF2_PLPMTU_MAXSEGSNT;
@@ -887,6 +890,7 @@
!(to.to_flags & TOF_FASTOPEN))
len = 0;
}
+ SOCKBUF_UNLOCK(&so->so_rcv);
/*
* Adjust data length if insertion of options will
@@ -1133,6 +1137,7 @@
m->m_len = hdrlen;
}
SOCKBUF_UNLOCK_ASSERT(&so->so_snd);
+ SOCKBUF_UNLOCK_ASSERT(&so->so_rcv);
m->m_pkthdr.rcvif = (struct ifnet *)0;
#ifdef MAC
mac_inpcb_create_mbuf(tp->t_inpcb, m);
@@ -1212,6 +1217,7 @@
flags |= TH_ECE;
}
+ SOCKBUF_LOCK(&so->so_rcv);
/*
* If we are doing retransmissions, then snd_nxt will
* not reflect the first unsent octet. For ACK only
@@ -1250,6 +1256,7 @@
if (flags & TH_RST) {
recwin = 0;
} else {
+ SOCKBUF_LOCK_ASSERT(&so->so_rcv);
if (recwin < (so->so_rcv.sb_hiwat / 4) &&
recwin < tp->t_maxseg)
recwin = 0;
@@ -1270,6 +1277,7 @@
recwin = roundup2(recwin, 1 << tp->rcv_scale);
th->th_win = htons((u_short)(recwin >> tp->rcv_scale));
}
+ SOCKBUF_UNLOCK(&so->so_rcv);
/*
* Adjust the RXWIN0SENT flag - indicate that we have advertised
@@ -1696,6 +1704,8 @@
#endif
if (sendalot)
goto again;
+ SOCKBUF_UNLOCK_ASSERT(&so->so_rcv);
+ SOCKBUF_UNLOCK_ASSERT(&so->so_snd);
return (0);
}
Index: sys/netinet/tcp_timewait.c
===================================================================
--- sys/netinet/tcp_timewait.c
+++ sys/netinet/tcp_timewait.c
@@ -295,11 +295,13 @@
* Recover last window size sent.
*/
so = inp->inp_socket;
+ SOCKBUF_LOCK(&so->so_rcv);
recwin = lmin(lmax(sbspace(&so->so_rcv), 0),
(long)TCP_MAXWIN << tp->rcv_scale);
if (recwin < (so->so_rcv.sb_hiwat / 4) &&
recwin < tp->t_maxseg)
recwin = 0;
+ SOCKBUF_UNLOCK(&so->so_rcv);
if (SEQ_GT(tp->rcv_adv, tp->rcv_nxt) &&
recwin < (tp->rcv_adv - tp->rcv_nxt))
recwin = (tp->rcv_adv - tp->rcv_nxt);
Index: sys/sys/sockbuf.h
===================================================================
--- sys/sys/sockbuf.h
+++ sys/sys/sockbuf.h
@@ -59,10 +59,10 @@
#define SBS_RCVATMARK 0x0040 /* at mark on input */
#if defined(_KERNEL) || defined(_WANT_SOCKET)
-#include <sys/_lock.h>
-#include <sys/_mutex.h>
#include <sys/_sx.h>
#include <sys/_task.h>
+#include <sys/lock.h>
+#include <sys/mutex.h>
#define SB_MAX (2*1024*1024) /* default for max chars in sockbuf */
@@ -202,7 +202,7 @@
#if 0
SOCKBUF_LOCK_ASSERT(sb);
#endif
- return (sb->sb_acc);
+ return atomic_load_int(&sb->sb_acc);
}
/*
@@ -216,7 +216,7 @@
#if 0
SOCKBUF_LOCK_ASSERT(sb);
#endif
- return (sb->sb_ccc);
+ return atomic_load_int(&sb->sb_ccc);
}
/*
@@ -229,7 +229,7 @@
{
int bleft, mleft; /* size should match sockbuf fields */
-#if 0
+#if 1
SOCKBUF_LOCK_ASSERT(sb);
#endif
@@ -242,6 +242,14 @@
return ((bleft < mleft) ? bleft : mleft);
}
+#define sbspace_dolock(sb) \
+ ({ \
+ SOCKBUF_LOCK(sb); \
+ long _space = sbspace(sb); \
+ SOCKBUF_UNLOCK(sb); \
+ _space; \
+ })
+
#define SB_EMPTY_FIXUP(sb) do { \
if ((sb)->sb_mb == NULL) { \
(sb)->sb_mbtail = NULL; \
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Thu, Jul 23, 11:31 AM (13 h, 46 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
35400556
Default Alt Text
D28736.diff (7 KB)
Attached To
Mode
D28736: DO NOT MERGE: This seems to fix https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=253589
Attached
Detach File
Event Timeline
Log In to Comment