La carga de un programa eBPF provoca que se modifiquen las afinidades de IRQ - (controlador ixgbe)

La carga de un programa eBPF provoca que se modifiquen las afinidades de IRQ - (controlador ixgbe)

Estoy trabajando en una aplicación eBPF/XDP que se ejecuta en un servidor con NIC Intel 10G X550T, utilizando el controlador ixgbe.

Necesito un control preciso sobre cómo se distribuye el trabajo entre los núcleos, por lo que deshabilito irqbalance y establezco la afinidad de IRQ manualmente. Escribí un breve script en Python para leer /proc/interrupts y /proc/irq/X/smp_affinity para mostrar qué núcleos de CPU deberían manejar la interrupción para cada cola:

La NIC int0 está configurada con 40 colas y la máquina tiene 40 núcleos; después de ejecutar mi configuración manual, la asignación de cola->núcleo se ve así:

# python3 show_ints.py
int0       : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39]

Sin embargo, cuando cargo incluso el programa eBPF más trivial en este dispositivo:

int xdp_sock_prog(struct xdp_md *ctx)
{
    return( XDP_PASS );
}
# xdp-loader load -m native int0 test.o

la afinidad irq parece modificarse:

# python3 show_ints.py
int0       : [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39]

Esto en sí mismo no sería un problema, solo una reorganización de núcleos, pero hay múltiples NIC en esta máquina, y cada vez que intento asignar directamente núcleos específicos para manejar colas específicas en NIC específicas, la carga de eBPF estropea las cosas en un manera que siempre da como resultado que varias NIC lleguen a los mismos núcleos (¡lo cual no quiero!).

¿Es este el comportamiento esperado? ¿Hay alguna manera de desactivarlo?

Editar (información adicional):

Las IRQ en sí no cambian...

Antes:

int0       IRQs : [79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181]
int0       CPUs : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39]

Después:

int0       IRQs : [79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181]
int0       CPUs : [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39]

Así que es sólo smp_affinity lo que se está modificando.

Disculpas por no incluir información de la versión: esta es 5.15.0-79 genérica en Ubuntu 22.04.

Edición adicional:

Hmmm... cuando se carga el programa eBPF, dmesg muestra:

[66216.150088] ixgbe 0000:3b:00.0: removed PHC on int0
[66216.927782] ixgbe 0000:3b:00.0: registered PHC device on int0
[66221.735857] ixgbe 0000:3b:00.0 int0: NIC Link is Up 10 Gbps, Flow Control: None

información relacionada