Загрузка программы eBPF приводит к изменению привязок IRQ - (драйвер ixgbe)

Загрузка программы eBPF приводит к изменению привязок IRQ - (драйвер ixgbe)

Я работаю над приложением eBPF/XDP, работающим на сервере с сетевыми картами Intel 10G X550T, использующим драйвер ixgbe.

Мне нужен точный контроль над тем, как работа распределяется между ядрами, поэтому я отключаю irqbalance и вручную настраиваю IRQ affinity. Я написал небольшой скрипт на Python для чтения /proc/interrupts и /proc/irq/X/smp_affinity, чтобы показать, какие ядра ЦП должны обрабатывать прерывание для каждой очереди:

Сетевая карта int0 настроена на 40 очередей, а машина имеет 40 ядер. После запуска моей ручной настройки отображение очереди->ядра выглядит следующим образом:

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

Однако когда я загружаю на это устройство даже самую простую программу eBPF:

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

похоже, что соответствие irq изменено:

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

Это само по себе не было бы проблемой — просто перестановка ядер — но в этой машине есть несколько сетевых карт, и каждый раз, когда я пытаюсь напрямую назначить определенные ядра для обработки определенных очередей на определенных сетевых картах, нагрузка eBPF все портит таким образом, что всегда приводит к тому, что несколько сетевых карт обращаются к одним и тем же ядрам (чего я не хочу!).

Это ожидаемое поведение? Есть ли способ его отключить?

Редактировать (дополнительная информация):

Сами IRQ не меняются...

До:

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]

После:

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]

Так что настраивается только smp_affinity.

Извините, что не указал информацию о версии — это общая версия 5.15.0-79 для Ubuntu 22.04.

Дальнейшее редактирование:

Хм... когда загружается программа eBPF, dmesg показывает:

[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

Связанный контент