On Wed, Mar 01, 2017 at 09:43:16PM +0100, Mike Belopuhov wrote:
> 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.

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

You don't need M_ZERO as you call ml_init() afterwards.

> +     for (i = 0; i < IFQ_NQUEUES; i++)
> +             ml_init(&pq->pq_lists[i]);
> +     return (pq);
>  }

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

This is equivalent to ml_enlist(ml, pl) which avoids the loop.

> -             }
> -
> -             pl->head = pl->tail = NULL;
>       } while (prio > 0);
>  }

with that OK bluhm@

Reply via email to