This convers hand rolled lists into exactly the same mbuf_lists. I need this because of the next diff that uses the ml_len packet counter that mbuf_lists have. Otherwise there's no functional change.
--- sys/net/ifq.c | 48 ++++++++++++++++++------------------------------ 1 file changed, 18 insertions(+), 30 deletions(-) diff --git sys/net/ifq.c sys/net/ifq.c index 40731637a2c..896b373c454 100644 --- sys/net/ifq.c +++ sys/net/ifq.c @@ -51,17 +51,12 @@ const struct ifq_ops * const ifq_priq_ops = &priq_ops; /* * priq internal structures */ -struct priq_list { - struct mbuf *head; - struct mbuf *tail; -}; - struct priq { - struct priq_list pq_lists[IFQ_NQUEUES]; + struct mbuf_list pq_lists[IFQ_NQUEUES]; }; /* * ifqueue serialiser */ @@ -392,11 +387,17 @@ priq_idx(unsigned int nqueues, const struct mbuf *m) } void * priq_alloc(unsigned int idx, void *null) { - return (malloc(sizeof(struct priq), M_DEVBUF, M_WAITOK | M_ZERO)); + struct priq *pq; + int i; + + pq = malloc(sizeof(struct priq), M_DEVBUF, M_WAITOK | M_ZERO); + for (i = 0; i < IFQ_NQUEUES; i++) + ml_init(&pq->pq_lists[i]); + return (pq); } void priq_free(unsigned int idx, void *pq) { @@ -405,40 +406,35 @@ priq_free(unsigned int idx, void *pq) int priq_enq(struct ifqueue *ifq, struct mbuf *m) { struct priq *pq; - struct priq_list *pl; + struct mbuf_list *pl; if (ifq_len(ifq) >= ifq->ifq_maxlen) return (ENOBUFS); pq = ifq->ifq_q; KASSERT(m->m_pkthdr.pf.prio <= IFQ_MAXPRIO); pl = &pq->pq_lists[m->m_pkthdr.pf.prio]; - m->m_nextpkt = NULL; - if (pl->tail == NULL) - pl->head = m; - else - pl->tail->m_nextpkt = m; - pl->tail = m; + ml_enqueue(pl, m); return (0); } struct mbuf * priq_deq_begin(struct ifqueue *ifq, void **cookiep) { struct priq *pq = ifq->ifq_q; - struct priq_list *pl; + struct mbuf_list *pl; unsigned int prio = nitems(pq->pq_lists); struct mbuf *m; do { pl = &pq->pq_lists[--prio]; - m = pl->head; + m = MBUF_LIST_FIRST(pl); if (m != NULL) { *cookiep = pl; return (m); } } while (prio > 0); @@ -447,35 +443,27 @@ priq_deq_begin(struct ifqueue *ifq, void **cookiep) } void priq_deq_commit(struct ifqueue *ifq, struct mbuf *m, void *cookie) { - struct priq_list *pl = cookie; + struct mbuf_list *pl = cookie; - KASSERT(pl->head == m); + KASSERT(MBUF_LIST_FIRST(pl) == m); - pl->head = m->m_nextpkt; - m->m_nextpkt = NULL; - - if (pl->head == NULL) - pl->tail = NULL; + ml_dequeue(pl); } void priq_purge(struct ifqueue *ifq, struct mbuf_list *ml) { struct priq *pq = ifq->ifq_q; - struct priq_list *pl; + struct mbuf_list *pl; unsigned int prio = nitems(pq->pq_lists); - struct mbuf *m, *n; + struct mbuf *m; do { pl = &pq->pq_lists[--prio]; - for (m = pl->head; m != NULL; m = n) { - n = m->m_nextpkt; + while ((m = ml_dequeue(pl)) != NULL) ml_enqueue(ml, m); - } - - pl->head = pl->tail = NULL; } while (prio > 0); } -- 2.12.0