em/igb if_transmit (drbr) and ALTQ
Karim
fodillemlinkarim at gmail.com
Mon Nov 12 19:16:03 UTC 2012
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.
More information about the freebsd-net
mailing list