Что такое выбор прерывания sata msix
Обновлено: 21.11.2024
Защитите EKS с помощью CloudGuard!
Посмотрите подробный обзор TechTalk
Присоединяйтесь к нашему TechTalk, чтобы получить обзор CPX 360
с PhoneBoy, Shay и Val
КАК ВЫ ЗАСЛУЖИВАЕТЕ НАИЛУЧШЕЙ БЕЗОПАСНОСТИ
Обновите нашу последнюю версию GA Jumbo
Spectral Acquisition
Developer First Cloud Security
Он здесь!
Содержимое CPX 360 2022
8 основных проблем кибербезопасности банка
Присоединяйтесь к нашей прямой трансляции и узнайте, как их преодолеть!
Вы уже тестировали?
Инструмент сканирования Log4j уже здесь!
CheckFlix!
Все видео в одном пространстве
Автопредложение помогает быстро сузить результаты поиска, предлагая возможные совпадения по мере ввода.
Автопредложение помогает быстро сузить результаты поиска, предлагая возможные совпадения по мере ввода.
- Шах и мат
- :
- Товары
- :
- Квант
- :
- Управление
- :
- Новинка! – Настройка производительности R80.x – оборудование Intel
Хайко Анкенбренд
- Отметить как новое
- Добавить в закладки
- Подписаться
- Отключить звук
- Отправить сообщение другу
Мы немного подумали об архитектуре платформы Intel Skylake. В последние годы я прочитал много книг и информации в Интернете об устаревшей информации о сетевых картах и обработке пакетов. Поэтому я присмотрелся к современной архитектуре Intel. Кроме того, интересно посмотреть, как можно использовать Linux с этими новыми технологиями (MSI-X, PCIe, DMA, множественные очереди и некоторые другие).
Еще интересные статьи:
PCI Express (Peripheral Component Interconnect Express), официально сокращенно PCIe или PCI-e, представляет собой стандарт высокоскоростной последовательной компьютерной шины расширения, разработанный для замены старых стандартов шин PCI, PCI-X и AGP. PCIe имеет множество улучшений по сравнению со старыми стандартами, включая более высокую максимальную пропускную способность системной шины, меньшее количество контактов ввода-вывода и меньшую физическую площадь, лучшее масштабирование производительности для шинных устройств, более подробный механизм обнаружения ошибок и отчетности (Advanced Error Reporting, AER). и встроенная функция горячей замены. Более поздние версии стандарта PCIe обеспечивают аппаратную поддержку виртуализации ввода-вывода.
Концептуально шина PCI Express представляет собой высокоскоростную последовательную замену старой шины PCI/PCI-X. Одним из ключевых различий между шиной PCI Express и более старой шиной PCI является топология шины; PCI использует архитектуру общей параллельной шины, в которой хост PCI и все устройства имеют общий набор адресов, данных и линий управления. Напротив, PCI Express основан на топологии «точка-точка» с отдельными последовательными каналами, соединяющими каждое устройство с корневым комплексом (хостом).
С точки зрения протокола шины, связь PCI Express инкапсулируется в пакеты. Работа по пакетированию и распаковке данных и трафика сообщений о состоянии обрабатывается транзакционным уровнем порта PCI Express. На программном уровне PCI Express сохраняет обратную совместимость с PCI; устаревшее системное программное обеспечение PCI может обнаруживать и настраивать новые устройства PCI Express без явной поддержки стандарта PCI Express, хотя новые функции PCI Express недоступны.
Канал PCI Express между двумя устройствами может включать от одной до 32 линий. В многополосном канале пакетные данные чередуются по каналам, а пиковая пропускная способность масштабируется с общей шириной канала. Количество дорожек автоматически согласовывается во время инициализации устройства и может быть ограничено любой конечной точкой. Например, однополосная карта PCI Express (×1) может быть вставлена в многоканальный слот (×4, ×8 и т. д.), а цикл инициализации автоматически согласовывает максимальное количество взаимно поддерживаемых линий. Канал может динамически изменять свою конфигурацию, чтобы использовать меньше полос, обеспечивая отказоустойчивость в случае наличия плохих или ненадежных полос. Стандарт PCI Express определяет слоты и разъемы разной ширины: ×1, ×4, ×8, ×12, ×16 и ×32. Это позволяет шине PCI Express обслуживать как экономичные приложения, где не требуется высокая пропускная способность, так и критически важные для производительности приложения, такие как сетевые приложения (10 Gigabit Ethernet или многопортовый Gigabit Ethernet).
Когда кадр данных записывается в ОЗУ или основной кэш C1 через DMA, как сетевая карта сообщает остальной системе, что данные готовы к обработке?
Традиционно сетевая карта генерировала запрос на прерывание (IRQ), указывающий на получение данных.
Существует три распространенных типа IRQ:
Устройство, генерирующее IRQ, когда данные были записаны в ОЗУ или основной кэш C1 через DMA, достаточно простое, но если поступает большое количество кадров данных, это может привести к созданию большого количества IRQ. Чем больше генерируемых IRQ, тем меньше процессорного времени доступно для задач более высокого уровня, таких как пользовательские процессы.
В общем, обработчик прерывания, который запускается, когда возникает прерывание, должен пытаться отложить как можно больше обработки вне контекста прерывания. Это очень важно, поскольку во время обработки прерывания другие прерывания могут быть заблокированы.
Прерывания, сигнализируемые сообщениями (MSI), представляют собой альтернативный внутриполосный метод сигнализации о прерывании, использующий специальные внутриполосные сообщения для замены традиционных внеполосных утверждений выделенных линий прерывания. Хотя прерывания, сигнализируемые сообщениями, сложнее реализовать в устройстве, они имеют ряд существенных преимуществ по сравнению с внеполосной сигнализацией прерывания на основе выводов.
Прерывания, сигнализируемые сообщениями, поддерживаются шиной PCI начиная с версии 2.2 и более поздней доступной шиной PCI Express. В некоторых архитектурах, отличных от PCI, также используются прерывания, сигнализируемые сообщениями.
Прерывания, сигнализируемые сообщениями (MSI), представляют собой альтернативный внутриполосный метод сигнализации о прерывании, использующий специальные внутриполосные сообщения для замены традиционных внеполосных утверждений выделенных линий прерывания. Хотя прерывания, сигнализируемые сообщениями, сложнее реализовать в устройстве, они имеют ряд существенных преимуществ по сравнению с внеполосной сигнализацией прерывания на основе выводов.
Прерывания, сигнализируемые сообщениями, поддерживаются шиной PCI начиная с версии 2.2 и более поздней доступной шиной PCI Express. В некоторых архитектурах, отличных от PCI, также используются прерывания, сигнализируемые сообщениями.
Традиционно устройство имеет линию прерывания (вывод), которую оно устанавливает, когда хочет подать сигнал о прерывании в среду обработки хоста. Эта традиционная форма сигнализации прерывания является внеполосной формой сигнализации управления, поскольку она использует выделенный путь для отправки такой управляющей информации отдельно от основного пути данных. MSI заменяет эти выделенные линии прерывания внутриполосной сигнализацией путем обмена специальными сообщениями, указывающими на прерывания, по основному пути данных. В частности, MSI позволяет устройству записывать небольшое количество данных, описывающих прерывания, на специальный отображаемый в памяти адрес ввода-вывода, а затем набор микросхем доставляет соответствующее прерывание процессору.
Распространенное заблуждение относительно MSI заключается в том, что он позволяет устройству отправлять данные процессору как часть прерывания. Данные, отправляемые как часть транзакции записи в память, используются набором микросхем для определения того, какое прерывание на каком процессоре инициировать; что данные недоступны для устройства, чтобы передать дополнительную информацию обработчику прерывания.
Например, PCI Express вообще не имеет отдельных контактов прерывания; вместо этого он использует специальные внутриполосные сообщения, позволяющие эмулировать подтверждение или отмену подтверждения вывода. Некоторые не-PCI архитектуры также используют MSI; в качестве другого примера, устройства HP GSC не имеют контактов прерывания и могут генерировать прерывания только путем записи непосредственно в регистр прерываний процессора в пространстве памяти. Протокол HyperTransport также поддерживает MSI.
PCI определяет два необязательных расширения для поддержки прерываний, сигнализируемых сообщениями, MSI и MSI-X. Хотя PCI Express совместим с устаревшими прерываниями на программном уровне, для этого требуется MSI или MSI-X.
MSI — MSI (впервые определено в PCI 2.2) позволяет устройству выделять 1, 2, 4, 8, 16 или 32 прерывания. Устройство запрограммировано с адресом для записи (обычно это регистр управления в контроллере прерываний) и 16-битным словом данных для его идентификации. Номер прерывания добавляется к слову данных для идентификации прерывания. Некоторые платформы, такие как Windows, не используют все 32 прерывания, а используют только до 16 прерываний.
MSI-X. MSI-X (впервые описанный в PCI 3.0) позволяет устройству выделять до 2048 прерываний. Один адрес, используемый исходным MSI, оказался ограничивающим для некоторых архитектур. В частности, это затруднило нацеливание отдельных прерываний на разные процессоры, что полезно в некоторых высокоскоростных сетевых приложениях. MSI-X допускает большее количество прерываний и дает каждому отдельный целевой адрес и слово данных. Устройства с MSI-X не обязательно поддерживают 2048 прерываний, но не менее 64, что вдвое превышает максимальное количество прерываний MSI.
Дополнительные функции MSI (64-битная адресация и маскирование прерываний) также являются обязательными для MSI-X.
Система softirq в ядре Linux — это механизм для выполнения кода вне контекста обработчика прерываний, реализованного в драйвере. Эта система важна, потому что аппаратные прерывания могут быть отключены во время всего или части выполнения обработчика прерывания. Чем дольше отключены прерывания, тем выше вероятность того, что события могут быть пропущены. Поэтому важно отложить любые длительные действия за пределами обработчика прерываний, чтобы он мог завершиться как можно быстрее и снова включить прерывания от устройства.
Есть и другие механизмы, которые можно использовать для отсрочки работы в ядре, но для целей сетевого стека мы рассмотрим программные прерывания.
Систему softirq можно представить как серию потоков ядра (по одному на ЦП), которые запускают функции-обработчики, зарегистрированные для различных событий softirq. Если вы когда-либо смотрели вверх и видели ksoftirqd/0 в списке потоков ядра, вы смотрели на поток ядра softirq, работающий на процессоре 0.
Если ваша сетевая карта поддерживает несколько очередей или вы пытаетесь оптимизировать локальность данных, вы можете использовать определенный набор процессоров для обработки прерываний, генерируемых вашей сетевой картой.
На данный момент я вижу обработку пакетов несколько иначе, чем описано во многих книгах. На мой взгляд, есть некоторые отличия от старой архитектуры Intel с шиной ISA, которая до сих пор описана во многих книгах. С моей точки зрения пакеты копируются не с сетевой карты в память, а напрямую в кэш C1 ядра. Также обработка прерывания происходит только после копирования пакета в основной кэш C1. Однако я не уверен на 100 %, что это именно так.
Однако я не уверен на сто процентов, что и здесь так. Поэтому при необходимости мы должны уточнить это у отдела исследований и разработок.
Согласно моим исследованиям, ядро Linux должно обрабатывать пакет следующим образом:
Платформа Skylake будет разделена на три основные категории: 2S, 4S и 8S. Сервер HP DL 360 G10 использует архитектуру S2. В следующем примере мы рассмотрим HP DL 360 G10. Я не хочу вдаваться в глубины архитектуры здесь. Мы просто хотим посмотреть на шину PCIe. Этот момент очень интересен для использования 10-гигабитных карт.
Все процессоры Intel серий Intel Xeon Platinum 8xxx, Gold 6xxx/5xxx, Silver 4xxx и Bronze 3xxx имеют архитектуру PCIe 3.0 с 48 линиями. Еще один интересный момент, на который стоит обратить внимание, это тот факт, что количество слотов PCIe не только будет обновлено до 48, но и, наконец, их можно будет конфигурировать в разделах x4, x8 и x16.
Розовые платы подключены к разным процессорам. Для DL 360 G10 это выглядит следующим образом (см. таблицу).
У нас есть следующие прерывания: MSI, MSI-X и INTx. Что делают эти разные типы прерываний в PCIe? Мне нужно только краткое описание. Я только знаю, что в PCIe прерывания генерируются в виде пакетов, когда они должны быть подтверждены, а также когда они должны быть отменены, и что MSI и MSI-X существуют для устаревшей поддержки. Я могу ошибаться. Можно ли получить ответ на этот конкретный вопрос на этом форуме?
3 ответа 3
[Возможно, вам следует сразу перейти к ответу Фрра, который является более точным и дает гораздо больше информации и контекста]
Все прерывания выполняют одну и ту же функцию: уведомление о каком-то событии, которое отправляется от одного (PCIe) агента другому.
Почему мы называем эти уведомления прерываниями? Ну, в общем (хотя и не всегда) прерываемый микропроцессор останавливает свою текущую деятельность, каким-то образом сохраняет состояние этой деятельности и переключает свое внимание на обработку прерывания (путем выполнения подпрограммы обслуживания прерываний; короче - ИСР). Мы говорим, что приход этого уведомления прервал нормальную работу микропроцессора, отсюда и название «прерывание».
Раньше все прерывания были просто проводами: каждое событие, которое должно было быть передано между агентами, представлялось одним проводом. Однако по мере того, как количество таких событий росло, количество проводов, которые нужно было проложить на чипе, становилось огромным.
Внедрение стандартизированных межсоединений (PCI, PCIe и т. д.) между аппаратными модулями позволило использовать новую концепцию доставки прерываний — прерывание, сигнализируемое сообщением (MSI). Почему MSI лучше, чем просто провода? Ну, инженеры считают, что если есть интерконнект, который позволяет обмениваться общими сообщениями между агентами, то добавлять поверх него лишние провода будет пустой тратой места - можно использовать существующий интерконнект для обмена специальными сообщениями. , просто убедитесь, что все агенты обрабатывают эти специальные сообщения как прерывания.
Идентификаторы PCI MSI были представлены в PCI2.2 (Wiki) в качестве альтернативы обычным прерываниям и стали обязательными в PCIe.
MSI-X — это просто расширение PCI MSI в PCIe. Они выполняют ту же функцию, но могут нести больше информации и являются более гибкими. ПРИМЕЧАНИЕ. PCIe поддерживает как MSI, так и MSI-X.
Концепция MSI очень удобна и позволяет значительно сократить количество проводов, проложенных на чипе, но имеет несколько недостатков:
- Задержка. Сообщения MSI не доставляются мгновенно. Прежде чем MSI достигнет места назначения, может пройти много тактов.
- Питание. Для доставки MSI логика, которая его распространяет, должна быть запитана.Сегодня, когда рынок сместился в сторону мобильных устройств, это огромный недостаток.
Инженеры, работавшие над спецификацией PCIe, были достаточно умны, чтобы предвидеть, что вышеперечисленные проблемы станут очень важными в будущем. Они решили оставить возможность использования «устаревших» прерываний — простых проводов. Это прерывания INTx: в особых случаях агент PCIe может быть настроен на использование простого провода вместо MSI для сигнализации прерывания. PCIe определяет до 4 проводов для каждого агента — они называются AD. INTx — это общее название для всех четырех из них (x = A или B, или C, или D).
В основном сигналы INTx используются для подачи сигналов о прерываниях, когда основное межсоединение PCIe отключено: когда агенту необходимо установить связь, он «утверждает» один из INTx, что вызывает включение питания межсоединения PCIe.
\$\begingroup\$ Спасибо, Василий, причина, по которой я задал этот вопрос, заключается в том, что у нас могут быть разные прерывания для выдачи разных типов сообщений, где каждое прерывание имеет разный уровень важности. Я думал, что, поскольку PCIe очень сложен, у него должно быть несколько разных «типов прерываний», которые сообщают ЦП разные вещи, и, следовательно, ЦП может захотеть предпринять разные действия в каждом случае. Я надеюсь, что я имею смысл. \$\конечная группа\$
\$\begingroup\$ То, что вы описали, относится не к PCIe, а к Arch и uArch вашего процессора (реализация модуля обработчика прерываний). Вы можете назначать приоритеты разным векторам MSI и, например, определить, что если вектор прерывания с более высоким приоритетом поступает во время выполнения ISR с более низким приоритетом, ISR с более низким приоритетом прерывается и выполняется ISR с более высоким приоритетом. \$\конечная группа\$
\$\begingroup\$ Прерывания INTx распространяются по каналу PCIe так же, как MSI и MSI-X. Они существуют в основном для мостовых микросхем PCI-PCIe, поэтому устройства PCI будут правильно работать в системе PCIe без изменения драйверов. Предполагается, что новые устройства PCIe используют MSI или MSI-X, поскольку они превосходят INTx. Этому есть две причины: количество прерываний и совместное использование. Линии INTx являются общими для всех устройств на шине, поэтому программное обеспечение должно запускать все обработчики прерываний всякий раз, когда происходит прерывание. MSI и MSI-X предназначены для каждого устройства и поддерживают гораздо больше прерываний, поэтому производительность выше. \$\конечная группа\$
Три модных слова, о которых вы спрашивали, INTx, MSI и MSI-x, являются частью долгой и извилистой истории доставки прерываний/IRQ на архитектуре ПК x86. У других компьютерных архитектур могут быть частички этой истории, в зависимости от того, сколько у них общего с миром ПК и его шинами.
Я попытаюсь пропустить некоторые красочные побочные сюжеты и начну объяснение с середины.
Если я пропущу ISA, позвольте мне начать с параллельного PCI. Наряду с сигналами AD0:31 (или AD0:64 с 64-битными разновидностями) прерывания имели четыре выделенные сигнальные линии (провода), помеченные INTA..INTD. В последовательных слотах PCI на шине четыре физических провода INTx «повернуты на один» в виде оплетки от слота к слоту. Поскольку устройства в слотах обычно занимают свои собственные INTA для каждого слота и редко INTB или выше, чередование слотов помогло бы распределить триггерные устройства по четырем проводам прерывания. Четыре сигнала INTx на слот могут использоваться внутри (периферийной платой) для восьми «функций», которые по отдельности видны в пространстве конфигурации PCI (большинство операционных систем представляют их как отдельные «значки устройств» PCI). То есть, если бы на один слот приходилось восемь функций, им пришлось бы делить несколько проводов INTx. Следовательно, каждая шина PCI bus:dev:func имеет один регистр IRQ в своем конфигурационном пространстве. Примечание. Термины PCI "устройство" и "слот" являются синонимами.
Первоначальный ПК XT/AT поставлялся с чипом программируемого контроллера прерываний i8259 (или двумя), чтобы объединить все линии ISA IRQ и представить их ЦП в консолидированном виде (через один восходящий сигнал IRQ и набор программируемых векторные регистры). Первоначально это были автономные микросхемы DIL. Когда появился PCI, первоначально его 4 провода прерываний были засунуты во второй i8259 и разделены с шиной ISA. Это было бесполезно, так как ISA IRQ срабатывает по фронту и ими трудно поделиться, в отличие от PCI IRQ, которые срабатывают по уровню и спроектированы так, чтобы ими было относительно легко делиться.
Где-то около i486, когда на чертежных досках появились двухпроцессорные машины x86 (а некоторые из них действительно были построены), а периферийных устройств стало слишком много, i8259 XT PIC был переработан: ядро ЦП теперь имело «локальную Контроллер прерываний APIC на чипе и нуждался в сопутствующем чипе IO APIC на материнской плате для сбора разрозненных выделенных проводов IRQ и передачи событий прерывания на ЦП. IO APIC поставляются с 24 входами IRQ, и их может быть несколько на материнской плате. Первыми кандидатами на вход IO APIC были, очевидно, 4 провода INTA..INTD шины PCI.
Изначально IO APIC представляли собой автономные микросхемы, взаимодействующие с CPU LAPIC по специальной «шине APIC». Позже IO-APIC были перемещены в южный мост набора микросхем ПК, а некоторые из них были включены в автономные мосты PCI. А восходящая передача событий APIC IRQ переместилась «внутриполосно»: с тех пор она передается сообщениями по дереву системной шины. Обратите внимание, что сообщения о прерываниях APIC являются еще одним «типом транзакций шины» (давайте пропустим их здесь) в дополнение к трем упомянутым выше.
Затем появился PCI-e, отдающий предпочтение собственному механизму доставки прерываний, сигнализируемых сообщениями, подробнее об этом ниже, но PCI-e также обещает обратную совместимость с устаревшим параллельным PCI. Так. как делают легаси инты. Прерывания INTD = транспортируются выделенные провода? Неудивительно, что они передаются сообщениями. Выделенные сообщения, восемь из них для этих четырех проводов:
- подтвердить INTA
- отменить подтверждение INTA
- подтвердить INTB
- отменить подтверждение INTB
- подтвердить INTC
- отменить подтверждение INC
- подтвердить INTD
- отменить подтверждение INTD
Вкратце они называются просто сообщениями INTx (что соответствует историческим проводникам INTx). На каждый провод INTx приходится два сообщения INTx для передачи логики «запуска уровня».
Но подождите, самое интересное только начинается. Эта управляемая уровнем логика прерываний INTA..INTD в PCI-e является общесистемной. В типичном наборе микросхем ПК + периферийных картах у вас будет много источников прерываний INTA..INTD. И их логика, запускаемая уровнями, должна быть объединена. В физических проводах это делается по схеме «проводное ИЛИ», с активной логикой низкого уровня с открытыми коллекторами и подтягиванием. В PCI-e состояние каждого виртуального провода INTx должно быть объединено «виртуально». И слияние выполняется каскадным образом с помощью мостов PCI-e (коммутаторов). Каждый мост/коммутатор PCI-e содержит четыре «ячейки памяти», которые объединяют сообщения об утверждении/отмене подтверждения от нижестоящих портов PCI-e во внутреннее состояние, а изменения этого внутреннего совокупного состояния затем передаются вышестоящим. Таким образом, существует каскад коммутаторов PCI-e, позволяющий четырем состояниям INTx, запускаемым уровнем, перемещаться вверх по дереву шины, пока не достигнет корневого комплекса PCI-e. Корневой концентратор, ключевая часть северного моста чипсета, выполняет заключительную стадию слияния уровней INTx, и. и передает это состояние в IO APIC! Вниз по порту "hub link", подальше от процессора! IO-APIC (теперь переименованный в IO(x)APIC) объединяет эти четыре совокупных «виртуальных провода» с его потенциальными четырьмя физическими проводами на входах A..D и. наконец, перенаправляет события прерывания в ЦП LAPIC. Вверх по "узлу", вверх в ФСБ. Принцип остается тем же в современных платформах ПК, где северный комплекс интегрирован в кристалл ЦП или где южная часть теперь также находится в том же корпусе SoC.
Недавно я заметил еще один вопрос по этому поводу на каком-то форуме StackExchange, сейчас не могу его найти. Но это означает, что если вы подключаете какое-либо периферийное устройство к широким портам PCI-e, подключающимся прямо к сокету ЦП, и периферийное устройство работает с прерываниями INTx, совместимыми с предыдущими версиями, прерывания должны проходить по HubLink (теперь называемому DMI) к IO-APIC в южном мосту и повторно обрабатывает резервное копирование по HubLink и, наконец, к ЦП. Еще забавнее то, что периферийное устройство, подключенное к южному мосту, при использовании устаревших прерываний PCI-e, совместимых с INTx, теоретически приведет к тому, что прерывание будет перемещаться вверх по каналу-концентратору к корневому комплексу (конечная точка слияния PCI-e INTx), вплоть до IO(x)APIC в SB (конечная точка слияния виртуального и проводного INTx), и снова вверх по хаб-линку к ЦП :-D
Я бы рискнул предположить, что с периферийными устройствами, интегрированными в ICH (юг), Intel «обманывает» = оптимизирует, предоставляя прямые проводные ссылки IRQ на IO(x)APIC, чтобы они не не нужно путешествовать вверх и вниз по HubLink. Не уверен насчет внешних периферийных устройств, подключенных через внешний мост PCI-e/PCI, взаимодействующих с южным мостом через порт PCI-e (поскольку современные ICH/SB больше не имеют физического параллельного порта PCI).
И на этом веселье не заканчивается. Поскольку большинство устройств PCI-e в устаревшем режиме INTx по умолчанию будут использовать локальный «виртуальный проводной выход» INTA, и то же самое справедливо для многих физических устройств PCI, подключенных мостами PCI-e/PCI, устаревшая ОС в конечном итоге будет совместно использовать ввод-вывод. (x) Вход INTA APIC среди всех периферийных устройств в системе. Все устройства используют IRQ16 — можете себе представить хаос?
Чтобы решить эту проблему, Intel представила "переключение IRQ INTx виртуального провода".
Эти два изображения взяты из приложения Intel, указанного ниже в разделе "Ссылки".
Сейчас. достаточно ли нам всего наследия INTx? Да? Тогда вы мысленно готовы к настоящему сигнализированному сообщению материалу.
Intel, вероятно, заметила бесполезность 4 выделенных проводов INTx еще в эпоху параллельных PCI.А может они уже начали работать над PCI-e и готовили какую-то почву? В любом случае, версия PCI 2.2 представила прерывания, сигнализируемые сообщениями, «MSI», как способ избавиться от всей ерунды проводных IRQ. В конце концов, прерывание — это всего лишь «событие», которое необходимо доставить в ЦП, а простое сообщение, не обремененное всей проводной ерундой, может быть тривиально реализовано. Настоящий PCI-e MSI представляет собой довольно простую транзакцию записи в память, указывающую на общеизвестный адрес, декодируемый процессором LAPIC. Один назначенный слот MSI в LAPIC соответствует ровно одному устройству PCI-e. Периферийное устройство PCI-e программируется на отправку прерываний прямо в ЦП, без совместного использования, без каких-либо преобразований и слияний, и получает выделенный слот в LAPIC ядра ЦП. Таким образом, он также получает специальную служебную процедуру в программном обеспечении (драйвер режима ядра). ISR точно знает, кто инициировал запрос IRQ, а это означает, что требуется меньше повторных обращений к опросу (активность шины с задержкой).
Мир вдруг стал прекрасен, не так ли? Ну, это было не так прямолинейно. MSI нужна поддержка в ОС и драйверах.
Linux добавила поддержку MSI, как только оборудование было готово. Потребовалось два выделенных вызова API ядра, и, несмотря на всю теорию о том, что преобразование в MSI будет бесшовным, также потребовались некоторые дальнейшие модификации аппаратно-зависимых драйверов (и прошивки периферийных устройств). Возможно, самым ранним периферийным устройством с драйвером, поддерживающим MSI, были сетевые карты Intel Gigabit серии, все еще находящиеся в параллельном воплощении PCI. Поколение PCI-e Intel PRO 1000, безусловно, последовало за ним. Другим редким примером был AIC-79xx SCSI HBA, если не изменяет память (параллельный PCI-X). Но в течение многих лет многие другие драйверы устройств прибегали к устаревшему использованию прерываний (фактически к виртуальному проводу INTx и маршрутизации IO APIC), хотя их аппаратное обеспечение уже было основано на PCI-e и, следовательно, должно поддерживать MSI по определению (обязательно для стандарта). Например, RAID-контроллеры Adaptec AACRAID серии SCSI, по иронии судьбы использующие процессор Intel IOP. На момент написания этой статьи ситуация почти идеальна, большинство сетевых карт, дисковых контроллеров, графических адаптеров и т. д. используют MSI или MSI-X в Linux.
В мире Windows Microsoft не включила MSI в пакет обновления 3 (SP3) для Windows XP (модель драйвера NT/WDM). Вместо этого они включили поддержку MSI в новую среду разработки драйверов WDK, которая дебютировала в Vista, но по-настоящему взлетела в Windows 7. Таким образом, кошмары совместного использования IRQ наконец-то начали исчезать с появлением Windows 7.
Что такое MSI-X? Это эволюция MSI.
Исходный MSI имитировал традиционную функциональность прерываний INTx (проводных или виртуальных) в том смысле, что одна шина:устройство:функция имеет один номер IRQ = оптимально один слот в CPU LAPIC, один служебный вектор IRQ. На самом деле Википедия говорит, что одно устройство может иметь до 32 IRQ, но я никогда такого не видел, раньше было практическим правилом ровно 1.
С помощью MSI-X один объект PCI-e может использовать несколько выделенных номеров/каналов/векторов обслуживания IRQ, что еще больше ограничивает необходимость «опроса исходной карты IRQ». Современному сетевому адаптеру Intel может быть назначено 3 или 5 векторов MSI-X: один глобальный, один для очереди TX, один для очереди RX, бог знает, для чего нужны остальные.
Обратите внимание, что традиционный локальный APIC в ЦП имел только 255 слотов служебных векторов IRQ, что уже может быть узким местом на загруженном высокопроизводительном сервере. В MSI/MSI-X этот предел был увеличен. С MSI-X одно устройство (само по себе!) может использовать до 2048 различных номеров IRQ.
Возможно, существуют дополнительные различия между MSI и MSI-X, о которых я не знаю.
В этом руководстве описываются основы сигнальных прерываний (MSI), преимущества использования MSI по сравнению с традиционными механизмами прерывания, как изменить драйвер для использования MSI или MSI-X, а также некоторые базовые способы диагностики, которые можно попробовать, если устройство не работает. поддержка MSI.
4.2. Что такое MSI?¶
Прерывание, сигнализируемое сообщением, — это запись с устройства по специальному адресу, которая вызывает получение прерывания ЦП.
Возможность MSI впервые была указана в PCI 2.2, а затем была расширена в PCI 3.0, чтобы позволить маскировать каждое прерывание по отдельности. Возможность MSI-X также была представлена в PCI 3.0. Он поддерживает больше прерываний на устройство, чем MSI, и позволяет независимо настраивать прерывания.
Устройства могут поддерживать как MSI, так и MSI-X, но одновременно можно включить только один из них.
4.3. Зачем использовать файлы MSI?¶
Есть три причины, по которым использование MSI может дать преимущество по сравнению с традиционными прерываниями на основе контактов.
Прерывания PCI на основе контактов часто используются несколькими устройствами. Для поддержки этого ядро должно вызывать каждый обработчик прерывания, связанный с прерыванием, что приводит к снижению производительности системы в целом. MSI никогда не используются совместно, поэтому этой проблемы возникнуть не может.
Когда устройство записывает данные в память, а затем инициирует прерывание по контакту, вполне возможно, что прерывание может поступить до того, как все данные поступят в память (это становится более вероятным с устройствами за мостами PCI-PCI). Чтобы убедиться, что все данные поступили в память, обработчик прерывания должен прочитать регистр на устройстве, вызвавшем прерывание. Правила упорядочения транзакций PCI требуют, чтобы все данные поступали в память до того, как значение может быть возвращено из регистра. Использование MSI позволяет избежать этой проблемы, поскольку запись, генерирующая прерывание, не может передать запись данных, поэтому к моменту возникновения прерывания драйвер знает, что все данные поступили в память.
Устройства PCI могут поддерживать только одно прерывание на основе вывода для каждой функции. Часто драйверам приходится опрашивать устройство, чтобы узнать, какое событие произошло, что в общем случае замедляет обработку прерываний. С MSI устройство может поддерживать больше прерываний, что позволяет использовать каждое прерывание для другой цели. Одна из возможных схем дает нечастым состояниям (например, ошибкам) собственное прерывание, что позволяет драйверу более эффективно обрабатывать обычный путь обработки прерывания. Другие возможные схемы включают предоставление одного прерывания каждой очереди пакетов в сетевой карте или каждому порту в контроллере хранилища.
4.4. Как использовать MSI¶
Устройства PCI инициализируются для использования прерываний на основе контактов. Драйвер устройства должен настроить устройство на использование MSI или MSI-X. Не все машины правильно поддерживают MSI, и для этих машин описанные ниже API просто не будут работать, и устройство продолжит использовать прерывания на основе контактов.
4.4.1. Включить поддержку ядра для MSI¶
Для поддержки MSI или MSI-X ядро должно быть собрано с включенным параметром CONFIG_PCI_MSI. Этот параметр доступен только на некоторых архитектурах и может зависеть от других установленных параметров. Например, на платформе x86 необходимо также включить X86_UP_APIC или SMP, чтобы увидеть параметр CONFIG_PCI_MSI.
4.4.2. Использование MSI¶
Большая часть тяжелой работы выполняется драйвером на уровне PCI. Драйвер просто должен запросить, чтобы уровень PCI установил возможности MSI для этого устройства.
Чтобы автоматически использовать векторы прерываний MSI или MSI-X, используйте следующую функцию:
который выделяет до max_vecs векторов прерываний для устройства PCI. Он возвращает количество выделенных векторов или отрицательную ошибку. Если устройство требует минимального количества векторов, драйвер может передать аргумент min_vecs, равный этому пределу, и ядро PCI вернет -ENOSPC, если не сможет удовлетворить минимальное количество векторов.
Аргумент flags используется для указания того, какой тип прерывания может использоваться устройством и драйвером (PCI_IRQ_LEGACY, PCI_IRQ_MSI, PCI_IRQ_MSIX). Удобное сокращение (PCI_IRQ_ALL_TYPES) также доступно для запроса любого возможного типа прерывания. Если флаг PCI_IRQ_AFFINITY установлен, pci_alloc_irq_vectors() будет распределять прерывания по доступным процессорам.
Чтобы получить номера IRQ Linux, переданные в функции request_irq() и free_irq(), а также векторы, используйте следующую функцию:
Все выделенные ресурсы должны быть освобождены перед удалением устройства с помощью следующей функции:
Если устройство поддерживает как возможности MSI-X, так и возможности MSI, этот API будет использовать возможности MSI-X, а не возможности MSI. MSI-X поддерживает любое количество прерываний от 1 до 2048. Напротив, MSI ограничен максимум 32 прерываниями (и должно быть степенью двойки). Кроме того, векторы прерываний MSI должны выделяться последовательно, поэтому система может быть не в состоянии выделить для MSI столько векторов, сколько для MSI-X. На некоторых платформах все прерывания MSI должны быть нацелены на один и тот же набор ЦП, тогда как все прерывания MSI-X могут быть нацелены на разные ЦП.
Если устройство не поддерживает ни MSI-X, ни MSI, оно вернется к одному устаревшему вектору IRQ.
Обычное использование прерываний MSI или MSI-X заключается в выделении как можно большего количества векторов, вероятно, до предела, поддерживаемого устройством. Если nvec больше числа, поддерживаемого устройством, оно будет автоматически ограничено поддерживаемым пределом, поэтому нет необходимости заранее запрашивать количество поддерживаемых векторов:
Если драйвер не может или не хочет обрабатывать переменное количество прерываний MSI, он может запросить определенное количество прерываний, передав это число функции pci_alloc_irq_vectors() в качестве параметров min_vecs и max_vecs:
Самый известный пример описанного выше типа запроса — включение одного режима MSI для устройства. Это можно сделать, передав две единицы в качестве «min_vecs» и «max_vecs»:
Некоторые устройства могут не поддерживать использование устаревших прерываний линии, и в этом случае драйвер может указать, что допустимы только MSI или MSI-X:
4.4.3. Устаревшие API¶
Следующие старые API для включения и отключения прерываний MSI или MSI-X не должны использоваться в новом коде:
Кроме того, существуют API для предоставления количества поддерживаемых векторов MSI или MSI-X: pci_msi_vec_count() и pci_msix_vec_count() . Как правило, этого следует избегать, позволяя pci_alloc_irq_vectors() ограничивать количество векторов. Если у вас есть правомерный особый вариант использования подсчета векторов, нам, возможно, придется пересмотреть это решение и добавить вспомогательную функцию pci_nr_irq_vectors(), которая прозрачно обрабатывает MSI и MSI-X.
4.4.4. Рекомендации по использованию MSI¶
4.4.4.1. Спин-блокировки¶
Большинство драйверов устройств имеют спин-блокировку для каждого устройства, которая применяется в обработчике прерываний. При прерываниях на основе контактов или одиночном MSI нет необходимости отключать прерывания (Linux гарантирует, что одно и то же прерывание не будет повторно введено). Если устройство использует несколько прерываний, драйвер должен отключить прерывания, пока удерживается блокировка. Если устройство отправит другое прерывание, драйвер заблокируется, пытаясь рекурсивно получить спин-блокировку. Таких взаимоблокировок можно избежать с помощью функций spin_lock_irqsave() или spin_lock_irq(), которые отключают локальные прерывания и захватывают блокировку (см. Ненадежное руководство по блокировке).
4.4.5. Как определить, включен ли MSI/MSI-X на устройстве¶
Использование «lspci -v» (от имени root) может отображать некоторые устройства с возможностями «MSI», «Message Signaled Interrupts» или «MSI-X». Каждая из этих возможностей имеет флаг «Включить», за которым следует либо «+» (включено), либо «-» (отключено).
4.5. Особенности MSI¶
Известно, что несколько наборов микросхем или устройств PCI не поддерживают MSI. Стек PCI предоставляет три способа отключения MSI:
на всех устройствах за определенным мостом
на одном устройстве
4.5.1. Глобальное отключение MSI¶
Некоторые наборы микросхем хоста просто не поддерживают должным образом MSI. Если повезет, производитель это знает и указал в таблице ACPI FADT. В этом случае Linux автоматически отключает MSI. Некоторые платы не включают эту информацию в таблицу, поэтому нам приходится обнаруживать их самостоятельно. Полный их список находится рядом с функцией quirk_disable_all_msi() в файле drivers/pci/quirks.c.
Если на вашей плате есть проблемы с MSI, вы можете указать pci=nomsi в командной строке ядра, чтобы отключить MSI на всех устройствах. В ваших интересах сообщить о проблеме по адресу linux-pci @ vger . ядро . org, включая полный «lspci -v», чтобы мы могли добавить причуды в ядро.
4.5.2. Отключение MSI ниже моста¶
Некоторые мосты PCI не могут правильно маршрутизировать MSI между шинами. В этом случае MSI должны быть отключены на всех устройствах за мостом.
Некоторые мосты позволяют включить MSI, изменив некоторые биты в их конфигурационном пространстве PCI (особенно наборы микросхем Hypertransport, такие как nVidia nForce и Serverworks HT2000). Как и в случае с хост-чипсетами, Linux в основном знает о них и автоматически включает MSI, если может. Если у вас есть мост, неизвестный для Linux, вы можете включить MSI в пространстве конфигурации, используя любой известный вам метод, а затем включить MSI на этом мосту, выполнив следующие действия:
где $bridge — это PCI-адрес включенного моста (например, 0000:00:0e.0).
Чтобы отключить MSI, выведите 0 вместо 1. Изменение этого значения следует выполнять с осторожностью, так как это может нарушить обработку прерываний для всех устройств ниже этого моста.
Ещё раз сообщите об этом linux-pci @ vger . ядро . org любых мостов, требующих специальной обработки.
4.5.3. Отключение MSI на одном устройстве¶
Известно, что некоторые устройства имеют неисправные реализации MSI. Обычно это обрабатывается в отдельном драйвере устройства, но иногда необходимо справиться с этим с причудой. В некоторых драйверах есть возможность отключить использование MSI. Хотя это удобный обходной путь для автора драйвера, это не рекомендуется, и его не следует эмулировать.
4.5.4. Выяснение причины отключения MSI на устройстве¶
Из приведенных выше трех разделов видно, что существует множество причин, по которым MSI могут быть недоступны для данного устройства. Ваш первый шаг должен состоять в том, чтобы тщательно изучить ваш dmesg, чтобы определить, включены ли MSI для вашей машины. Вы также должны проверить свой .config, чтобы убедиться, что вы включили CONFIG_PCI_MSI.
Затем «lspci -t» выдает список мостов над устройством. Чтение /sys/bus/pci/devices/*/msi_bus скажет вам, включены ли MSI (1) или отключены (0). Если в любом из файлов msi_bus, принадлежащих мостам между корнем PCI и устройством, найден 0, файлы MSI отключены.
Также стоит проверить драйвер устройства, чтобы узнать, поддерживает ли он файлы MSI. Например, он может содержать вызовы pci_alloc_irq_vectors() с флагами PCI_IRQ_MSI или PCI_IRQ_MSIX.
Обзор
В этой статье подробно описываются механизмы прерываний в PCI Express и то, как генерировать прерывания в эталонном дизайне, предоставленном Altera.Это будет полезно для тех, кто хочет узнать о модели прерываний PCI Express и о том, как обрабатывать два типа прерываний, а именно устаревшее прерывание, прерывание MSI и прерывание MSI-X.
Устаревшие прерывания (эмуляция INTx)
Для совместимости с предыдущими версиями PCI Express предоставляет механизм эмуляции PCI INTx для передачи сигналов о прерываниях системному контроллеру прерываний (обычно являющемуся частью корневого комплекса). Этот механизм совместим с существующим программным обеспечением PCI и обеспечивает тот же уровень и тип обслуживания, что и соответствующий механизм сигнализации прерывания PCI, и не зависит от особенностей системного контроллера прерываний. Устаревший механизм совместимости позволяет поддерживать загрузочные устройства, не требуя сложных стеков конфигурирования/управления прерываниями на уровне BIOS. Он виртуализирует сигналы физического прерывания PCI, используя механизм внутриполосной сигнализации.
Генерация устаревших прерываний
Устаревшие прерывания передаются по каналу PCI Express с помощью сообщений TLP, которые генерируются внутренним компилятором IP для PCI Express. Входной порт app_int_sts управляет генерацией прерываний. Когда входной порт утверждает app_int_sts , это приводит к созданию TLP-сообщения Assert_INTA и его отправке вверх по течению. Отмена подтверждения входного порта app_int_sts приводит к созданию и отправке TLP-сообщения Deassert_INTA вверх по течению.
25/2/Assertion_new.PNG ( Assertion new.PNG — щелкните здесь, чтобы просмотреть изображение)
На приведенном выше рисунке показано время прерывания для устаревшего интерфейса. На этом рисунке утверждение app_int_ack указывает, что сообщение TLP Assert_INTA было отправлено.
e/ea/Deassertion.PNG (Deassertion.PNG — щелкните здесь, чтобы просмотреть изображение)
На приведенном выше рисунке показано время отмены устаревших прерываний. Утверждение app_int_ack указывает, что сообщение TLP Deassert_INTA было отправлено.
Прерывание, сигнализируемое сообщением (MSI)
Все функции устройства PCI Express, способные генерировать прерывания, должны поддерживать MSI или MSI-X, или и то, и другое. MSI — это механизм прерывания, запускаемый фронтом. Механизм MSI доставляет прерывания, выполняя транзакции записи в память. Запись в память, связанную с MSI, можно отличить от других операций записи в память только по адресам, на которые они нацелены и которые зарезервированы системой для доставки прерываний.
Прерывания MSI передаются по каналу PCI Express с использованием одного TLP для записи в память с двойным словом, сгенерированного компилятором IP для PCI Express.
Интерфейс Avalon-ST
Для интерфейса Avalon-ST входной порт app_msi_req управляет генерацией прерываний MSI. Когда входной порт утверждает app_msi_req , это приводит к созданию опубликованного MSI TLP записи на основе значений регистра конфигурации MSI и входных портов app_msi_tc и app_msi_num.
На следующем рисунке показано взаимодействие между сигналами прерывания MSI для корневого порта. Минимальная возможная задержка между app_msi_req и app_msi_ack составляет один тактовый цикл.
f/f0/MSI.PNG ( MSI.PNG — щелкните здесь для просмотра изображения )
Интерфейс Avalon-MM
Для сгенерированного Qsys Avalon-MM PCIe Hard IP имеется до 16 отдельных сигналов прерывания, RxmIrq_ [ :0], ( Msix figure1.jpg — щелкните здесь, чтобы просмотреть изображение)
Рис. 1. Процесс создания и обработки MSI
Переключение между устаревшей версией и MSI
Поскольку прерывания MSI и устаревшие прерывания являются взаимоисключающими, а эталонный дизайн поддерживает устаревшие прерывания по умолчанию, нам необходимо включить MSI, а также отключить устаревшее прерывание, а затем установить сигнал запроса MSI для передачи MSI.
Включить MSI
Чтобы включить MSI, установите для бита [16] набора регистров возможностей MSI (0x050h в пространстве конфигурации) значение 1, которое также является битом [0] регистра управления сообщениями.
На следующем рисунке показан формат реестра возможностей MSI. А регистр управления сообщениями расположен в старших 16 битах двойного слова 0.
0/01/MSI_Capability_Register_Set.PNG ( MSI Capability Register Set.PNG — щелкните здесь для просмотра изображения )
На следующем рисунке показана структура регистра управления сообщениями, младшим битом которого является бит включения MSI.
9/96/Message_Control_Register.PNG (Регистр управления сообщениями.PNG — щелкните здесь, чтобы просмотреть изображение)
Для бита включения MSI можно как читать, так и записывать.
• 0 = Функция отключена при использовании MSI. Он должен использовать сигналы INTx для доставки прерываний
• 1 = Функция может использовать MSI для запроса обслуживания и запрещает использовать свой вывод прерывания (устаревшее прерывание)
Отключить устаревшие прерывания
Чтобы отключить устаревшее прерывание, установите для параметра Interrupt Disable бит [10] регистра команд (0x004h в пространстве конфигурации) значение 1.
Также убедитесь, что бит [1] Memory Space Enable и бит [2] Bus Master также установлены, поскольку прерывание MSI является TLP памяти.
9/91/Cmd_reg.jpg ( Cmd reg.jpg — щелкните здесь для просмотра изображения )
На приведенном выше рисунке показана структура регистра команд.
Бит отключения прерывания также можно читать и записывать. И он контролирует способность моста генерировать сообщения прерывания INTx.
• 0 = мосту разрешено генерировать сообщения прерывания INTx
• 1 = возможность моста генерировать сообщения прерывания INTx отключена
Если мост уже передал какие-либо сообщения о прерывании эмуляции Assert_INTx, а затем этот бит установлен, он должен передать соответствующее сообщение Deassert_INTx для каждого сообщения подтверждения, переданного ранее.
Реализация
Две процедуры ebfm_cfgrd_wait() и ebfm_cfgwr_imm_wait() могут использоваться для реализации включения желаемого режима прерывания и отключения предыдущего режима, что указывает на транзакцию чтения и записи конфигурации отдельно. То есть используйте процедуру ebfm_cfgrd_wait() для чтения данных из указанного регистра конфигурации, обновите соответствующий бит, как мы упоминали выше, а затем запишите обновленное содержимое обратно в регистр конфигурации с помощью процедуры ebfm_cfgwr_imm_wait(). Подробную информацию об этих двух процедурах можно найти в руководстве пользователя в качестве справочного материала.
Пример дизайна MSI
Следующий код позволяет использовать несколько прерываний MSI. Он основан на устройстве Stratix V. Исходным компилятором был Quartus II 13.0, и его можно обновить до более поздних версий программного обеспечения Quartus II с помощью QSYS.
Читайте также: