this is basically the code i had before mpi told me that mq_ was not needed.

*sigh*

ok.

Visa Hankala(v...@openbsd.org) on 2017.05.30 16:19:46 +0000:
> On Wed, May 31, 2017 at 01:52:31AM +1000, Jonathan Matthew wrote:
> > On Tue, May 30, 2017 at 01:04:07PM +0000, Visa Hankala wrote:
> > > Index: net/if_pflow.c
> > > ===================================================================
> > > RCS file: src/sys/net/if_pflow.c,v
> > > retrieving revision 1.78
> > > diff -u -p -r1.78 if_pflow.c
> > > --- net/if_pflow.c        27 May 2017 21:44:22 -0000      1.78
> > > +++ net/if_pflow.c        30 May 2017 12:40:26 -0000
> > > @@ -132,7 +132,7 @@ pflow_output_process(void *arg)
> > >   struct mbuf *m;
> > >  
> > >   KERNEL_LOCK();
> > > - while ((m = ml_dequeue(&sc->sc_outputqueue)) != NULL) {
> > > + while ((m = mq_dequeue(&sc->sc_outputqueue)) != NULL) {
> > >           pflow_sendout_mbuf(sc, m);
> > >   }
> > >   KERNEL_UNLOCK();
> > 
> > I'd suggest using mq_delist here rather than dequeueing each mbuf
> > individually, so you only take the mbuf_queue mutex once per call.
> 
> Right. Updated patch below.
> 
> Index: net/if_pflow.c
> ===================================================================
> RCS file: src/sys/net/if_pflow.c,v
> retrieving revision 1.78
> diff -u -p -r1.78 if_pflow.c
> --- net/if_pflow.c    27 May 2017 21:44:22 -0000      1.78
> +++ net/if_pflow.c    30 May 2017 15:57:44 -0000
> @@ -128,11 +128,13 @@ pflow_output(struct ifnet *ifp, struct m
>  void
>  pflow_output_process(void *arg)
>  {
> +     struct mbuf_list ml;
>       struct pflow_softc *sc = arg;
>       struct mbuf *m;
>  
> +     mq_delist(&sc->sc_outputqueue, &ml);
>       KERNEL_LOCK();
> -     while ((m = ml_dequeue(&sc->sc_outputqueue)) != NULL) {
> +     while ((m = ml_dequeue(&ml)) != NULL) {
>               pflow_sendout_mbuf(sc, m);
>       }
>       KERNEL_UNLOCK();
> @@ -256,7 +258,7 @@ pflow_clone_create(struct if_clone *ifc,
>       ifp->if_hdrlen = PFLOW_HDRLEN;
>       ifp->if_flags = IFF_UP;
>       ifp->if_flags &= ~IFF_RUNNING;  /* not running, need receiver */
> -     ml_init(&pflowif->sc_outputqueue);
> +     mq_init(&pflowif->sc_outputqueue, 8192, IPL_SOFTNET);
>       pflow_setmtu(pflowif, ETHERMTU);
>       pflow_init_timeouts(pflowif);
>       if_attach(ifp);
> @@ -288,7 +290,7 @@ pflow_clone_destroy(struct ifnet *ifp)
>               timeout_del(&sc->sc_tmo_tmpl);
>       pflow_flush(sc);
>       task_del(softnettq, &sc->sc_outputtask);
> -     ml_purge(&sc->sc_outputqueue);
> +     mq_purge(&sc->sc_outputqueue);
>       m_freem(sc->send_nam);
>       if (sc->so != NULL) {
>               error = soclose(sc->so);
> @@ -1089,8 +1091,8 @@ pflow_sendout_v5(struct pflow_softc *sc)
>       getnanotime(&tv);
>       h->time_sec = htonl(tv.tv_sec);                 /* XXX 2038 */
>       h->time_nanosec = htonl(tv.tv_nsec);
> -     ml_enqueue(&sc->sc_outputqueue, m);
> -     task_add(softnettq, &sc->sc_outputtask);
> +     if (mq_enqueue(&sc->sc_outputqueue, m) == 0)
> +             task_add(softnettq, &sc->sc_outputtask);
>       return (0);
>  }
>  
> @@ -1151,8 +1153,8 @@ pflow_sendout_ipfix(struct pflow_softc *
>       h10->flow_sequence = htonl(sc->sc_sequence);
>       sc->sc_sequence += count;
>       h10->observation_dom = htonl(PFLOW_ENGINE_TYPE);
> -     ml_enqueue(&sc->sc_outputqueue, m);
> -     task_add(softnettq, &sc->sc_outputtask);
> +     if (mq_enqueue(&sc->sc_outputqueue, m) == 0)
> +             task_add(softnettq, &sc->sc_outputtask);
>       return (0);
>  }
>  
> @@ -1193,8 +1195,8 @@ pflow_sendout_ipfix_tmpl(struct pflow_so
>       h10->observation_dom = htonl(PFLOW_ENGINE_TYPE);
>  
>       timeout_add_sec(&sc->sc_tmo_tmpl, PFLOW_TMPL_TIMEOUT);
> -     ml_enqueue(&sc->sc_outputqueue, m);
> -     task_add(softnettq, &sc->sc_outputtask);
> +     if (mq_enqueue(&sc->sc_outputqueue, m) == 0)
> +             task_add(softnettq, &sc->sc_outputtask);
>       return (0);
>  }
>  
> Index: net/if_pflow.h
> ===================================================================
> RCS file: src/sys/net/if_pflow.h,v
> retrieving revision 1.16
> diff -u -p -r1.16 if_pflow.h
> --- net/if_pflow.h    27 May 2017 21:06:06 -0000      1.16
> +++ net/if_pflow.h    30 May 2017 15:57:44 -0000
> @@ -184,7 +184,7 @@ struct pflow_softc {
>       struct timeout           sc_tmo;
>       struct timeout           sc_tmo6;
>       struct timeout           sc_tmo_tmpl;
> -     struct mbuf_list         sc_outputqueue;
> +     struct mbuf_queue        sc_outputqueue;
>       struct task              sc_outputtask;
>       struct socket           *so;
>       struct mbuf             *send_nam;
> 

Reply via email to