Output queue of tun(4) gets full after some time when sending lots of data.
I have been observing this on -CURRENT at least since March this year.

Looks like it's a race condition (same in tun(4) and tap(4)), 
the following patch seems to address the issue:

Index: if_tap.c
===================================================================
--- if_tap.c    (revision 212217)
+++ if_tap.c    (working copy)
@@ -881,8 +881,7 @@
 
                        mtx_lock(&tp->tap_mtx);
                        tp->tap_flags |= TAP_RWAIT;
-                       mtx_unlock(&tp->tap_mtx);
-                       error = tsleep(tp,PCATCH|(PZERO+1),"taprd",0);
+                       error = mtx_sleep(tp, &tp->tap_mtx, 
PDROP|PCATCH|(PZERO+1), "taprd", 0);
                        if (error)
                                return (error);
                }
Index: if_tun.c
===================================================================
--- if_tun.c    (revision 212217)
+++ if_tun.c    (working copy)
@@ -836,8 +836,7 @@
                        }
                        mtx_lock(&tp->tun_mtx);
                        tp->tun_flags |= TUN_RWAIT;
-                       mtx_unlock(&tp->tun_mtx);
-                       if ((error = tsleep(tp, PCATCH | (PZERO + 1),
+                       if ((error = mtx_sleep(tp, &tp->tun_mtx, PDROP | PCATCH 
| (PZERO + 1),
                                        "tunread", 0)) != 0) {
                                splx(s);
                                return (error);

--Marcin

_______________________________________________
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to "freebsd-current-unsubscr...@freebsd.org"

Reply via email to