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.

>       }
>  }

Reply via email to