Carregar um programa eBPF faz com que as afinidades de IRQ sejam modificadas - (driver ixgbe)

Carregar um programa eBPF faz com que as afinidades de IRQ sejam modificadas - (driver ixgbe)

Estou trabalhando em um aplicativo eBPF/XDP em execução em um servidor com NICs Intel 10G X550T, usando o driver ixgbe.

Preciso de controle preciso sobre como o trabalho é distribuído entre os núcleos, por isso estou desabilitando o irqbalance e configurando a afinidade do IRQ manualmente. Escrevi um breve script python para ler /proc/interrupts e /proc/irq/X/smp_affinity para mostrar quais núcleos de CPU devem lidar com a interrupção para cada fila:

A NIC int0 está configurada com 40 filas e a máquina tem 40 núcleos - depois de executar minha configuração manual, o mapeamento de fila-> núcleo fica assim:

# 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]

No entanto, quando carrego até mesmo o programa eBPF mais trivial neste dispositivo:

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

a afinidade irq parece ter sido modificada:

# 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]

Isso por si só não seria um problema - apenas uma reorganização de núcleos - mas há vários NICs nesta máquina, e toda vez que tento atribuir diretamente núcleos específicos para lidar com filas específicas em NICs específicos, a carga do eBPF bagunça tudo em um maneira que sempre resulta em várias NICs atingindo os mesmos núcleos (o que eu não quero!).

Esse é o comportamento esperado? Há uma forma de desabilitá-lo?

Editar (informações adicionais):

Os IRQs em si não mudam...

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]

Depois:

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]

Então é apenas o smp_affinity que está sendo ajustado.

Desculpas por não incluir informações de versão - este é 5.15.0-79 genérico no Ubuntu 22.04.

Edição adicional:

Hmmm... quando o programa eBPF é carregado, dmesg mostra:

[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

informação relacionada