與其他協議一樣,當同一個通信等級(Traffic Class, TC)的多個事務(Transactions)同時通過同一個通道時,PCIe對這些事務設置了一些排序(Transaction Ordering)規則。
這樣做的好處有以下幾點:
注釋:死鎖是指兩個以上的設備在訪問臨界資源時,相互等待對方釋放這些資源,而無法訪問這些資源的情況。
在PCI總線上,隻支持Strong Ordering傳送規則,而在PCIe總線中新增了Relaxed Ordering(RO) 和 ID-based Ordering(IDO)傳遞方式。
Strong Ordering:
何為Strong Ordering? 顧名思義,Strong,就是很強壯,很彪悍的意思。Strong Ordering強制總線上的TLP按照先來後到的方式進行傳遞,一視同仁,不管是否有特殊情況,均不允許插隊和綠色通道。但是事情總有輕重緩急,對于一些緊急的狀況,這個強制規則難免會影響到總線的傳遞效率和用戶體驗。
我們看下面一個例子,
此時,接收端Non-Posted buffer已滿,TLP 1,5則需要暫停發送。由于這8個TLPs屬于同一VC,需要按照Strong-Ordering規則排序。所以TLP 2,3,4對應接收端VC buffer即使有可用空間,也必須等TLP 1傳輸完成之後才能發送。
這不就是浪費時間嘛,浪費别人的時間,就等于謀殺呀~Strong-Ordering太不厚道咯~~~
Relaxed Ordering(RO):
相比PCI, PCIe則深得中庸之道,更加善解人意。PCIe支持的Relaxed Ordering的傳遞規則不會要求TLPs嚴格遵守先來後到,也意味着根據輕重緩急找到最佳的方案,提高數據的傳輸效率。
不過,Relaxed Ordering是有條件的。因為每個TLP隻能對應一個TC(通信等級), 而這個TC有隻能對應唯一一個VC(虛拟通道)。所以說:
VC相同的TLPs需要遵循的排序規則具體如下表:
先解釋一下表格中的Yes, Y/N, No對應的含義:
Yes: 代表第二個事務必須在第一個事務之前通過,也就是強制性"超車";
Y/N: 沒有排序要求;
No: 代表第二個事務絕對不允許在第一個事務之前通過,也就是"超車"違法.
我們解析一下表格中的A2b, B2, C2b, D2b的内容來闡述一下Relaxed-Ordering的效果:
A2b: 當RO=1, 也即Enable Relaxed-Ordering規則。此時,Memory Writes or Messages被允許超車之前的Memory Writes or Messages而搶先通過;
B2: 無論RO bit是否被置起來, Read Requests均不被允許超車之前的Memory Writes or Messages而搶先通過;
C2b: 當RO=1, IO writes和Configuration writes被允許超車之前的Memory Writes or Messages而搶先通過;
D2b: 當RO=1, Competitions被允許超車之前的Memory Writes or Messages而搶先通過;
ID-based Ordering(IDO):
IDO的模型是在PCIe V2.1版本之後新增的功能。該模型引入了"數據流"(Stream)的概念,即:
IDO模型允許不同數據流的TLPs之間不必遵循事務排序的約定。
我們來看個例子:
此時,就要靠IDO這位大神出手咯~
依照IDO模型的思想,Posted Write request和Read request的數據源不一樣,可以不遵循事務排序規則。
所以,當PCIe總線enable IDO功能時,Read request可以很開心的通過Switch,這個時候,Posted Write隻有羨慕嫉妒恨的份兒咯~~~
二、Relaxed Ordering對系統的影響
在第一部分的内容,我們介紹了PCIe TLP的排序機制原理,也可以看到Relaxed Ordering也是PCIe一個優化性能的利器。在很多PCIe系統中,PCIe設備也基本是默認打開的Relaxed Ordering這個機制的特性,以保持達到最高的性能。
但是,小編想說下,對Relaxed Ordering的意見是,酌情看是否适合自己的系統,Relaxed Ordering并不是通用的優勢。在不适合自己情況,使用Relaxed Ordering将是一場災難。
在使用Relaxed Ordering的功能之前,據小編的了解,需要先判斷兩件事情:
1.是否存在PCI-to-PCI的情況,這種情況由于存在strong ordering強排序的要求,可能會出現Write寫入還沒完成的情況下,Read讀取同一個地方的數據,最終導緻數據報錯。
2.是否存在共享内存的架構,是否可能會存在多個行程訪問同一個内存地址的情況。如果是,Relaxed Ordering機制機會給系統帶來系統錯誤。比如在intel的CPU規範中,有一段話,大家可以參考:
If the access is toward MMIO region, then software can command HW to set the RO bit in the TLP header, as this would allow hardware to achieve maximum throughput for these types of accesses.
MMIO,即Memory Mapped IO,是把IO設備的内部存儲和寄存器都映射到統一的存儲地址空間(Memory Address Space)。
For accesses toward coherent memory, software can command HW to clear the RO bit in the TLP header (no RO), as this would allow hardware to achieve maximum throughput for these types of accesses.
如果使用Relaxed Ordering不當,将會出現什麼後果的。小編這裡列舉幾種故障現象:
(1)類似網卡出現降速的問題
(2)PCIe FPGA設備出現TLP報錯,引發系統報錯
(3)NVME盤性能降速,驅動報錯completion polled
[ 126.031565] nvme nvme0: I/O 5 QID 0 timeout, completion polled
[ 187.471563] nvme nvme0: I/O 6 QID 0 timeout, completion polled
[ 248.911566] nvme nvme0: I/O 7 QID 0 timeout, completion polled
[ 310.351565] nvme nvme0: I/O 4 QID 0 timeout, completion polled
[ 371.791569] nvme nvme0: I/O 5 QID 0 timeout, completion polled
在nvme驅動中出現timeout且completion polled的場景,對應的代碼如下:看到主要的原因是初始化過程中,NVMe控制器就出現了超時,說明Relaxed Ordering在初始化階段就産生了異常,導緻TLP處理失敗,出現性能降速。解決方案也是要把Relaxed Ordering功能關閉掉,性能就恢複了正常。
if (blk_mq_request_completed(req)) {
dev_warn(dev->ctrl.device,
"I/O %d QID %d timeout, completion polled\n",
req->tag, nvmeq->qid);
return BLK_EH_DONE;
}
/*
* Shutdown immediately if controller times out while starting. The
* reset work will see the pci device disabled when it gets the forced
* cancellation error. All outstanding requests are completed on
* shutdown, so we return BLK_EH_DONE.
*/
所以,Relaxed Ordering的機制并不是使用所有的場景,大家是否還有遇到其他的Relaxed Ordering導緻的異常呢?歡迎評論區留言交流。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!