为什么 /proc/irq/*/smp_affinity 显示的掩码对于我计算机上的 CPU 数量来说太宽?

为什么 /proc/irq/*/smp_affinity 显示的掩码对于我计算机上的 CPU 数量来说太宽?

我正在运行带有最新内核(即 3.19.0-22-generic)的 X86_64 Ubuntu Desktop 15.04。我正在检查中断和 IRQ,并注意到 smp_affinity 的位掩码是应有的两倍,我想知道为什么会这样?

但是,更明确地说:

$ cat /proc/interrupts
           CPU0       CPU1       CPU2       CPU3       
  0:         21          0          0          0  IR-IO-APIC-edge      timer
  1:        113       1780        107         90  IR-IO-APIC-edge      i8042
  8:          0          1          0          0  IR-IO-APIC-edge      rtc0
  9:        455       1106         71         57  IR-IO-APIC-fasteoi   acpi
 12:      10768     131886       9077       7920  IR-IO-APIC-edge      i8042
...

然后例如:

$ cat /proc/irq/0/smp_affinity
ff
$ cat /proc/irq/8/smp_affinity
0f
$ cat /proc/irq/47/smp_affinity
04

我原本期望只看到1数字而不是2.例如,在 中IRQ 0,我期望看到“ f”而不是“ ff”。原因是我4在第一个代码列表中只有 CPU,并且位掩码4足以覆盖它们。也就是说,“ 1111”将覆盖所有4CPU,因此IRQ 0将是“ f”。有人知道这是否是一个错误,或者“”是否ff有意义,有人可以向我解释吗?

另外,请注意IRQ 80f”在我的 CPU 上下文中的含义4,这意味着所有4CPU 都将成为该中断的目标。如果是这种情况,那么这IRQ 0与覆盖所有 CPU(4总计)完全相同。换句话说,“ 0f”相当于“ ff”,这对我来说没有意义:(

任何类型的解释或指导,进一步了解将不胜感激。

提前致谢。

答案1

亲和性位掩码的大小取决于亲和性位掩码的数量支持的内核中的 CPU,而不是系统中实际存在的 CPU 数量;但在运行时,仅考虑与当前 CPU 相对应的位。看IRQ-affinity.txtcpumask.h在内核源代码中了解详细信息。

相关内容