Почему прерывания MSI не используются совместно?

Может ли кто-нибудь сказать, почему прерывания MSI недоступны в Linux.

Прерывания на основе PIN-кода могут совместно использоваться устройствами, но прерывания MSI не используются устройствами, каждое устройство получает свой собственный номер IRQ MSI. Почему прерывания MSI нельзя использовать совместно?


person valmiki    schedule 20.12.2015    source источник


Ответы (2)


У старых прерываний INTx есть два проблемных свойства:

  1. Для каждого сигнала INTx требуется отдельная сигнальная линия в аппаратном обеспечении; а также
  2. сигнал прерывания не зависит от других сигналов данных и отправляется асинхронно.

Последствия таковы, что

  1. несколько устройств и драйверов должны иметь возможность совместно использовать прерывания (обработчик прерываний должен проверить, действительно ли его устройство вызвало прерывание); а также
  2. когда драйвер получает прерывание, ему необходимо прочитать какой-либо регистр устройства, чтобы убедиться, что все предыдущие записи DMA, сделанные устройством, видны на ЦП.

Как правило, оба случая обрабатываются драйвером, считывающим регистр состояния прерывания своего устройства.

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

Если бы некоторые драйверы были написаны для совместного использования некоторого MSI, обработчику прерывания снова пришлось бы проверять, действительно ли прерывание исходит от его собственного устройства, и не было бы никакого преимущества перед прерываниями INTx.

MSI не используются совместно, потому что это невозможно, а потому что это не необходимо.


Обратите внимание, что совместное использование MSI на самом деле возможно: как видно из этого отрывка из /proc/interrupts, драйверы Advanced Error Reporting, Power Management Events и hotplugging используют одно прерывание:

64:          0          0   PCI-MSI-edge      aerdrv, PCIe PME, pciehp

Эти драйверы на самом деле подключены к одному и тому же устройству, но они по-прежнему ведут себя аналогично драйверам INTx, т. е. они регистрируют свое прерывание с помощью IRQF_SHARED, а обработчики прерывания проверяют, была ли это их собственная функция, вызвавшая прерывание. .

person CL.    schedule 20.12.2015

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

«Это» означает: присвоить им одинаковую идентичность, чтобы затем устройства должны были быть проверены, чтобы выяснить, какие из них, конфликтующие с одним и тем же идентификатором, на самом деле прерваны.

На самом деле иногда нам хотелось бы иметь несколько прерываний для одного устройства. Например, полезно, если идентификатор прерывания говорит нам не только о том, какое устройство было прервано, но и почему: например, из-за поступления ввода или опустошения буфера вывода? Если линии прерывания «дешевы», потому что они просто идентификаторы программного обеспечения с большим количеством битов, мы можем это иметь.

person Kaz    schedule 20.12.2015