Index: if_tun.c =================================================================== RCS file: /cvs/src/sys/net/if_tun.c,v retrieving revision 1.230 diff -u -p -r1.230 if_tun.c --- if_tun.c 20 Feb 2021 04:39:16 -0000 1.230 +++ if_tun.c 25 Feb 2021 07:30:38 -0000 @@ -118,7 +118,6 @@ int tun_ioctl(struct ifnet *, u_long, ca void tun_input(struct ifnet *, struct mbuf *); int tun_output(struct ifnet *, struct mbuf *, struct sockaddr *, struct rtentry *); -int tun_enqueue(struct ifnet *, struct mbuf *); int tun_clone_create(struct if_clone *, int); int tap_clone_create(struct if_clone *, int); int tun_create(struct if_clone *, int, int); @@ -231,10 +230,10 @@ tun_create(struct if_clone *ifc, int uni /* build the interface */ ifp->if_ioctl = tun_ioctl; - ifp->if_enqueue = tun_enqueue; ifp->if_start = tun_start; ifp->if_hardmtu = TUNMRU; ifp->if_link_state = LINK_STATE_DOWN; + ifq_set_maxlen(&ifp->if_snd, 2048); /* XXX */ if_counters_alloc(ifp); @@ -606,21 +605,6 @@ tun_output(struct ifnet *ifp, struct mbu return (if_enqueue(ifp, m0)); } -int -tun_enqueue(struct ifnet *ifp, struct mbuf *m0) -{ - struct tun_softc *sc = ifp->if_softc; - int error; - - error = ifq_enqueue(&ifp->if_snd, m0); - if (error != 0) - return (error); - - tun_wakeup(sc); - - return (0); -} - void tun_wakeup(struct tun_softc *sc) { @@ -782,6 +766,8 @@ tun_dev_read(dev_t dev, struct uio *uio, if (error != 0) goto put; + KERNEL_UNLOCK(); + #if NBPFILTER > 0 if (ifp->if_bpf) bpf_mtap(ifp->if_bpf, m0, BPF_DIRECTION_OUT); @@ -803,6 +789,8 @@ tun_dev_read(dev_t dev, struct uio *uio, m_freem(m0); + KERNEL_LOCK(); + put: tun_put(sc); return (error); @@ -814,13 +802,21 @@ put: int tunwrite(dev_t dev, struct uio *uio, int ioflag) { - return (tun_dev_write(dev, uio, ioflag, 0)); + int rv; + KERNEL_UNLOCK(); + rv = tun_dev_write(dev, uio, ioflag, 0); + KERNEL_LOCK(); + return (rv); } int tapwrite(dev_t dev, struct uio *uio, int ioflag) { - return (tun_dev_write(dev, uio, ioflag, ETHER_ALIGN)); + int rv; + KERNEL_UNLOCK(); + rv = tun_dev_write(dev, uio, ioflag, ETHER_ALIGN); + KERNEL_LOCK(); + return (rv); } int @@ -1060,8 +1056,7 @@ tun_start(struct ifnet *ifp) splassert(IPL_NET); - if (ifq_len(&ifp->if_snd)) - tun_wakeup(sc); + tun_wakeup(sc); } void Index: ifq.c =================================================================== RCS file: /cvs/src/sys/net/ifq.c,v retrieving revision 1.43 diff -u -p -r1.43 ifq.c --- ifq.c 20 Feb 2021 04:37:26 -0000 1.43 +++ ifq.c 25 Feb 2021 07:30:38 -0000 @@ -500,6 +500,9 @@ ifq_hdatalen(struct ifqueue *ifq) struct mbuf *m; int len = 0; + if (ifq_empty(ifq)) + return (0); + m = ifq_deq_begin(ifq); if (m != NULL) { len = m->m_pkthdr.len;