CPU selection for ithreads on 8.3
John Baldwin
jhb at freebsd.org
Fri May 4 15:06:02 UTC 2012
On Wednesday, May 02, 2012 5:16:17 pm Navdeep Parhar wrote:
> There seems to be a regression in 8.3 in the way the kernel selects CPUs
> for interrupts. For example, cxgb(4) on 8.3 ends up with all
> its ithreads on the same CPU (CPU7 in this case).
>
> 12 root -68 - 0K 816K WAIT 7 0:55 0.00% intr{irq279:
> cxgbc0}
> 12 root -68 - 0K 816K WAIT 7 0:52 0.00% intr{irq275:
> cxgbc0}
> 12 root -68 - 0K 816K WAIT 7 0:47 0.00% intr{irq278:
> cxgbc0}
> 12 root -68 - 0K 816K WAIT 7 0:43 0.00% intr{irq277:
> cxgbc0}
> 12 root -68 - 0K 816K WAIT 7 0:43 0.00% intr{irq282:
> cxgbc0}
> 12 root -68 - 0K 816K WAIT 7 0:41 0.00% intr{irq281:
> cxgbc0}
> 12 root -68 - 0K 816K WAIT 7 0:32 0.00% intr{irq276:
> cxgbc0}
> 12 root -68 - 0K 816K WAIT 7 0:31 0.00% intr{irq280:
> cxgbc0}
>
> Back in the day there used to be code in cxgb to bind different
> interrupts to different CPUs but it was removed because the kernel
> distributed them across CPUs anyway. So what changed? This appears 8.3
> specific. I don't see it on head and I don't have a 9 system readily
> available right now.
Hmmm, that seems odd. It is true that the round-robin that the OS does only
pins the low-level message from the APIC/MSI vector to the CPU. It does not
affect the thread. However, ULE prefers to run ithreads on the CPU that
processes the interrupt:
static int
sched_pickcpu(struct thread *td, int flags)
{
...
/*
* Prefer to run interrupt threads on the processors that generate
* the interrupt.
*/
if (td->td_priority <= PRI_MAX_ITHD && THREAD_CAN_SCHED(td, self) &&
curthread->td_intr_nesting_level && ts->ts_cpu != self) {
SCHED_STAT_INC(pickcpu_intrbind);
ts->ts_cpu = self;
}
}
--
John Baldwin
More information about the freebsd-hackers
mailing list