On 05/08/20(Wed) 12:50, Vitaliy Makkoveev wrote: > 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().
Nice, one comment below. > 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 > @@ -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(); This means the lock is taken and released for every packet. It would be better to grab it outside the loop. > } > }