Аффинная маршрутизация SMP не работает с GICv2 на ARM - PullRequest
3 голосов
/ 24 января 2020

На моем Raspberry Pi есть 4 ядра ЦП и одна карта Ethe rnet.
Мне нужны прерывания от NI C для направления на все 4 ядра ЦП.
Я установил /proc/irq/24/smp_affinity на 0xF (1111), но это не помогает.
В шестом столбце /proc/interrupts я не вижу IO-API C (который определенно поддерживает * аффинную маршрутизацию), но вместо этого GICv2 . По-прежнему не удается найти полезную информацию о GICv2 и smp_affinity.

Поддерживает ли GICv2 маршрутизацию сродства SMP?

* UPD:
из этого сообщения :

Единственная причина для просмотра этого значения заключается в том, что сходство SMP будет работать только для драйверов устройств с поддержкой IO-API C.

Ответы [ 2 ]

1 голос
/ 26 января 2020

TL; DR - наличие / proc / irq / 24 / smp_affinity указывает на то, что ваша Linux система SMP поддерживает сходство. Текст IO-API C является типом контроллера прерываний (типичный P C), и он NOT указывает, что система может обрабатывать привязки. В системах ARM GI C обычно является контроллером прерываний, хотя некоторые прерывания могут быть направлены на «субконтроллер».


По крайней мере, основная линия - , поддерживающая некоторые сходства согласно Kconfig . Тем не менее, я не уверен, что вы пытаетесь сделать. Прерывание может выполняться только на одном процессоре, поскольку только один процессор может удалить данные с NI C. Если конкретный процессор выполняет сетевой код, а остальные используются для других целей, сходство имеет смысл.

Данные на этом ядре, вероятно, не будут в кеше, поскольку буферы NI C, вероятно, являются DMA и не кэшируется Итак, я не совсем уверен, чего бы вы достигли или как вы ожидаете, что прерывания будут работать на всех четырех процессорах? Если у вас есть четыре интерфейса NI C, вы можете привязать каждый к ЦП. Это может быть полезно для проблем энергопотребления.

В частности, для вашего случая четырех процессоров маска сходства 0xf отключит любое сходство, и это случай по умолчанию. Вы можете cat /proc/irq/24/smp_affinity увидеть, что сходство установлено. Кроме того, наличие этого файла будет означать, что ваша Linux SMP-система поддерживает сходство. Текст IO-API C - это тип контроллера прерываний (типичный P C), и он NOT указывает, что система может обрабатывать сходства.

Смотрите также:


NOTE Эта часть носит умозрительный характер и NOT работает с любыми известными мне картами.

Основная часть, которую вы хотите, обычно невозможна. Регистры NI C являются единым ресурсом. Существует несколько регистров, и они имеют общие последовательности для чтения и записи регистров для выполнения операции. Если два процессора записывают (или даже читают) регистр одновременно, то это сильно перемешает NI C. Часто процессор не вовлечен в прерывание, и только некоторому механизму DMA нужно сообщить о следующем буфере в прерывании.

Для того, что вы хотите использовать, вам понадобится NI C с несколькими регистрационными «банками», которые могут использоваться независимо. Например, просто прочитать банки пакетов READ / WRITE легко. Однако может быть несколько банков для написания разных пакетов, и тогда карте придется управлять тем, как их сериализовать. Кроме того, карта может выполнять некоторую проверку пакетов и прерывать разные процессоры на основе фиксированных значений пакетов. Ie, порт и IP. Это сопоставление пакетов будет генерировать разные источники прерываний, и разные ЦП могут обрабатывать разные совпадения.

Это позволит вам направлять разные траффиксы сокетов c на конкретный ЦП, используя один NI C.

Проблема в том, что сделать эту карту аппаратно будет невероятно сложно по сравнению с существующими картами. Это было бы дороже и потребовало бы больше энергии для работы.

Если это стандартное аппаратное обеспечение NI C, вращение ЦП не дает выигрыша, если исходный ЦП не занят. Если есть активность вне сети, лучше оставить другие ЦП в покое, чтобы кеш можно было использовать для другой рабочей нагрузки (код / ​​данные). Таким образом, в большинстве случаев лучше всего сохранять прерывание на фиксированном процессоре, если оно не занято, и тогда он может пинг-понг между несколькими процессорами. Почти никогда не будет полезно запускать прерывание на всех процессорах.

0 голосов
/ 31 января 2020

Я не верю, что GICv2 поддерживает балансировку IRQ. Прерывания всегда будут обрабатываться одним и тем же процессором. По крайней мере, это был тот случай, когда я посмотрел на это последнее ядро ​​5.1. В то время обсуждалось, что это не будет поддерживаться, потому что это не очень хорошая идея.

Вы увидите, что прерывания всегда будут обрабатываться ЦП 0. Используйте что-то вроде ftrace или LTTng для наблюдения за тем, что делает ЦП. что.

Я думаю, что с помощью настройки привязки вы могли бы предотвратить прерывание на ЦП, установив этот бит в ноль. Но это не уравновешивает IRQ по всем процессорам, на которых это разрешено. Он всегда будет go для одного и того же процессора. Но вы можете сделать этот процессор 1 вместо 0.

Так что вы можете сделать, это поставить определенные прерывания на разных процессорах. Это позволило бы чему-то вроде SDIO и сети не v ie в течение процессорного времени от CPU 0 в их обработчиках прерываний. Также возможно установить сходство процесса пользовательского пространства таким образом, чтобы он не работал на том же процессоре, который будет обрабатывать прерывания и тем самым сократить время, в течение которого процесс пользовательского пространства может быть прерван.

Так почему бы нам не сделать балансировку IRQ? Это оказывается бесполезным.

Имейте в виду, что обработчик прерываний здесь является только «жестким» обработчиком IRQ. Это обычно не делает много работы. Он распознает прерывание с помощью оборудования, а затем запускает внутренний обработчик, такой как рабочая очередь, поток IRQ, soft-irq или тасклет. Они не работают в контексте IRQ и могут и будут запланированы для разных ЦП или ЦП в зависимости от текущей рабочей нагрузки.

Таким образом, даже если сетевое прерывание всегда направляется на один и тот же ЦП, сетевой стек -поточный и работает на всех процессорах. Его основная работа не выполняется в жестком обработчике IRQ, который работает на одном процессоре. Опять же, используйте ftrace или LTTng, чтобы увидеть это.

Если жесткий IRQ делает очень мало, самое важное - это уменьшить задержку, что лучше всего делать, работая на одном и том же CPU, чтобы повысить эффективность кэширования. Распространение этого, вероятно, хуже для задержки, а также для общей стоимости обработки IRQ.

Жесткий обработчик IRQ может запускаться только один раз за раз. Таким образом, даже если он сбалансирован, он может использовать только один процессор одновременно. Если бы это было не так, обработчик было бы практически невозможно написать без условий гонки. Если вы хотите использовать несколько процессоров одновременно, то не выполняйте работу в жестком обработчике IRQ, делайте это в конструкции, подобной рабочей очереди. Вот как работает сетевой стек. И уровень блочных устройств.

IRQ не сбалансированы, потому что это обычно не ответ. Ответ - не выполнять работу в контексте IRQ.

...