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; >