igb(4) Pondering a bind to cpu patch
John Baldwin
jhb at freebsd.org
Wed Apr 25 13:35:30 UTC 2012
On Tuesday, April 24, 2012 8:11:07 pm Sean Bruno wrote:
> http://people.freebsd.org/~sbruno/if_igb.c.txt
>
> Scenario I've just seen:
>
> 8 core machine
> 2 igb(4) interfaces
> set num_queues=4
>
> igb0:0 --> cpu0
> igb0:1 --> cpu1
> igb0:2 --> cpu2
> igb0:3 --> cpu3
>
> igb1:0 --> cpu0
> igb1:1 --> cpu1
> igb1:2 --> cpu2
> igb1:3 --> cpu3
>
> I suspect, that we need a static global to keep track of what cpu last
> was last bound to a queue. My patch does do this, but I don't know if
> its the right thing.
>
> Since I'm doing multiple interfaces, I need to make sure I don't
> schedule a queue to a non existent cpu, so take a modulo of the counter
> and the number of cpus in the box.
>
> Perhaps not the most elegant solution, but its a thing?
CPU IDs are not guaranteed to be dense. However, you can use CPU_FIRST() and
CPU_NEXT() with your static global instead.
OTOH, if igb were to just leave the interrupts alone instead of binding them
by hand, they would get round-robin assigned among available cores already. I
think in this case the best approach might be to add a tunable to disable
igb's manual binding and instead let the default system round-robin be
preserved.
--
John Baldwin
More information about the freebsd-net
mailing list