Hi all,

I have been following the current discussions on igb tx/rx locking with great interest and I though I would point out (as it was before pointed out in kern/138392) that any driver setting if_start to NULL and using if_transmit (multi-queue or not) will effectively break ALTQ.

The reason for this can be found in tbr_timeout() in altq_subr.c where the token bucket regulator goes through all ALTQ registered interface and tries to 'kick' them into sending through if_start().

tbr_timeout() :

...

        for (ifp = TAILQ_FIRST(&V_ifnet); ifp;
            ifp = TAILQ_NEXT(ifp, if_list)) {
            /* read from if_snd unlocked */
            if (!TBR_IS_ENABLED(&ifp->if_snd))
                continue;
            active++;
            if (!IFQ_IS_EMPTY(&ifp->if_snd) &&
ifp->if_start != NULL) /* if_start is NULL if if_transmit is used in em/igb driver */
                (*ifp->if_start)(ifp);
        }

...

As you can see if_start is NULL on those new multi-queue enabled drivers which has for net effect to 'break' ALTQ's token bucket regulator.

I am writing this because I am interested in your comments on how this can be fixed properly looking forward. The whole range of suggestions; from 'don't compile with EM_MULTIQUEUE defined' to 'here is how you can make ALTQ use drbr' will help.

Thanks you,

Karim.
_______________________________________________
freebsd-net@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-net
To unsubscribe, send any mail to "freebsd-net-unsubscr...@freebsd.org"

Reply via email to