pipex(4) and pppx(4) are ready to became a little bit more MP capable.
Diff below moves pppx(4) related `ifnet' out of KERNEL_LOCK().

Index: sys/net/if_pppx.c
===================================================================
RCS file: /cvs/src/sys/net/if_pppx.c,v
retrieving revision 1.98
diff -u -p -r1.98 if_pppx.c
--- sys/net/if_pppx.c   28 Jul 2020 09:53:36 -0000      1.98
+++ sys/net/if_pppx.c   5 Aug 2020 09:34:50 -0000
@@ -191,7 +191,7 @@ int         pppx_set_session_descr(struct pppx_
                    struct pipex_session_descr_req *);
 
 void           pppx_if_destroy(struct pppx_dev *, struct pppx_if *);
-void           pppx_if_start(struct ifnet *);
+void           pppx_if_qstart(struct ifqueue *);
 int            pppx_if_output(struct ifnet *, struct mbuf *,
                    struct sockaddr *, struct rtentry *);
 int            pppx_if_ioctl(struct ifnet *, u_long, caddr_t);
@@ -683,13 +683,12 @@ pppx_add_session(struct pppx_dev *pxd, s
        snprintf(ifp->if_xname, sizeof(ifp->if_xname), "%s%d", "pppx", unit);
        ifp->if_mtu = req->pr_peer_mru; /* XXX */
        ifp->if_flags = IFF_POINTOPOINT | IFF_MULTICAST | IFF_UP;
-       ifp->if_xflags = IFXF_CLONED;
-       ifp->if_start = pppx_if_start;
+       ifp->if_xflags = IFXF_CLONED | IFXF_MPSAFE;
+       ifp->if_qstart = pppx_if_qstart;
        ifp->if_output = pppx_if_output;
        ifp->if_ioctl = pppx_if_ioctl;
        ifp->if_rtrequest = p2p_rtrequest;
        ifp->if_type = IFT_PPP;
-       ifq_set_maxlen(&ifp->if_snd, 1);
        ifp->if_softc = pxi;
        /* ifp->if_rdomain = req->pr_rdomain; */
 
@@ -864,28 +863,23 @@ pppx_if_destroy(struct pppx_dev *pxd, st
 }
 
 void
-pppx_if_start(struct ifnet *ifp)
+pppx_if_qstart(struct ifqueue *ifq)
 {
+       struct ifnet *ifp = ifq->ifq_if;
        struct pppx_if *pxi = (struct pppx_if *)ifp->if_softc;
        struct mbuf *m;
        int proto;
 
-       if (!ISSET(ifp->if_flags, IFF_RUNNING))
-               return;
-
-       for (;;) {
-               m = ifq_dequeue(&ifp->if_snd);
-
-               if (m == NULL)
-                       break;
-
+       while ((m = ifq_dequeue(ifq)) != NULL) {
                proto = *mtod(m, int *);
                m_adj(m, sizeof(proto));
 
                ifp->if_obytes += m->m_pkthdr.len;
                ifp->if_opackets++;
 
+               NET_LOCK();
                pipex_ppp_output(m, pxi->pxi_session, proto);
+               NET_UNLOCK();
        }
 }
 

Reply via email to