PCI/PCIe(3): MSI

甚麼是 MSI?

MSI(Message Signaled Interrupt) 是一種特殊的中斷機制,主要在 PCI/PCIe 上支援,能夠提升中斷處理的效能。有些其他類型的硬體也使用 MSI 來實作中斷機制。

傳統上的中斷又別名為 INTx。在此方式下,裝置會有一個中斷用的引腳(pin),當它想要向 host 發出中斷訊號時,它會 assert 該 pin,以 level-triggered 形式將引腳訊號拉低(active low)。這種 out-band 形式的中斷訊號使用與主資料分開的專用路徑來傳送控制資訊。與之相對,MSI 是以 in-band 訊號藉由主資料路徑的傳遞中斷的訊息。簡單來說,裝置會將描述中斷的資料寫到特殊的記憶體映射位置,然後 chip 再將相應的中斷傳遞給處理器。

MSI 的優勢

與傳統中斷硬體相比,MSI 能減少 pin 的數量,意味著 PCIe Connector 可以更簡化。在性能面上 MSI 也可以帶來一些效益。一方面,因為基於 pin 的中斷會有與 DMA/posted write 競爭的可能性。PCI 裝置傳遞資料給 host 的流程是:

  1. PCI 裝置將資料寫入記憶體
  2. PCI 裝置發送中斷以表示 DMA 寫入完成

然而,記憶體的寫入可能被 PCI bridge 或是 memory controller 緩衝(buffered)。換句話說,中斷可能會在 DMA 寫入完成之前到達,導致 host 從記憶體中讀取過時的資料。為了防止這種競爭,Interrupt handler 的軟體實作必須額外讀取引發中斷的裝置上的特殊暫存器,以符合 PCI transaction 規則的要求而確保正確性,但這種做法會造成一定的效能損失。而當使用 MSI 時,引發中斷的寫入不會來得比 host 記憶體內容的寫入更早,因此保證了正確性,可以省去相關的延遲。

另一方面,傳統 pin 形式的中斷由多個裝置一起共用,因此當中斷觸發時需要依次觸發每個裝置的 interrupt handler 以確定是哪個裝置應該處理之。這對性能上會產生衝擊。而 MSI 由於各個裝置獨立,對性能更加友好。

最後,基於 pin 的中斷方式,對於每個 PCI 裝置只能支援一個 pin。因此驅動程式必須額外對裝置進行查詢以明確知道具體事件,從而減慢了中斷處理速度。而 MSI 讓裝置可以將不同類型的事件直接對應到不同的中斷號/中斷處理程式,進而提升效率。

MSI 的類型

MSI 功能首先在 PCI 2.2 版本中規範,後來在 PCI 3.0 中增強,以允許個別 mask 每個中斷。 PCI 3.0 還引進了進階的 MSI-X 功能,後者可以支援比 MSI 更多的中斷,並允許中斷有獨立的記憶體和資料空間配置。裝置可能同時支援 MSI 和 MSI-X,但同時只能啟用其中之一。

MSI in NVMe

Image Not Showing Possible Reasons
  • The image was uploaded to a note which you don't have access to
  • The note which the image was originally uploaded to has been deleted
Learn More →

NVMe命令的“快递代收点”,聊聊中断聚合在SSD中的作用

Reference