Linux 強制重新協商 PCIe 速度

Linux 強制重新協商 PCIe 速度

我正在使用 PCIe Gen 3 卡,有時它們似乎會回落到 PCIe 1 或 2 速度(根據 lspci 以及透過吞吐量觀察)。

在大多數情況下,重新啟動/重新啟動機器時,速度會恢復到完整的 PCIe Gen 3 速度。

是否有一種侵入性較小的方法來強制在例如 RHEL6 上重新協商 PCI 鏈路速度(嘗試將其恢復到 PCI Gen 3)?

答案1

您可以在此文件上檢查您的 PCIe 能源策略:

# cat /sys/module/pcie_aspm/parameters/policy

由於 Gen3 透過 ASPM(活動狀態電源管理)進行電源管理非常簡單,這可能是總線問題的根本原因:吞吐量較低,因此模組降低了速度,但在以下情況下忘記再次增加速度:需要(如果需要)。您可以透過使用以下參數停用 aspm 來強制 grub 以避免使用「powersave」或「預設」策略:

pcie_aspm=off

僅在一個核心上測試這一點,並將此選項附加到/boot/grub/grub.conf預設引導 Linux 的「kernel」行上。從 Red Hat 文件中擷取的 grub 設定範例:

default=0 
timeout=10 
splashimage=(hd0,0)/grub/splash.xpm.gz 
hiddenmenu 
title Red Hat Enterprise Linux Server (2.6.18-2.el5PAE)         
root (hd0,0)         
kernel /boot/vmlinuz-2.6.18-2.el5PAE ro root=LABEL=/1 rhgb quiet pcie_aspm=off      
initrd /boot/initrd-2.6.18-2.el5PAE.img

答案2

PCIe 設定速度有一個pcie_set_speed.sh可以更改設備的目標連結速度的腳本。已在帶有內核的Alma 8.9(即基於RHEL)下成功使用該腳本4.18.0-513.18.1.el8_9.x86_64

PCIe 卡中有 Xilinx Kintex-7 FPGA:

  1. FPGA PCIe IP 設定為以 4 頻道的 PCIe 2 速度工作。
  2. PCIe 卡位於 16 頻道插槽中,配備支援 PCIe 2 速度的 Intel i5-2310 CPU。

注意到 PCIe 介面以 PCIe 1 速度(2.5 GT/s)協商:

$ dump_info/dump_info_libpciaccess 
domain=0000 bus=01 dev=00 func=00
  vendor_id=10ee (Xilinx Corporation) device_id=7024 ((null)) subvendor_id=0002 subdevice_id=0009
  control: I/O- Mem+ BusMaster- ParErr- SERR- DisINTx-
  status: INTx- <ParErr- >TAbort- <TAbort- <MAbort- >SERR- DetParErr-
  bar[0] base_addr=f0110000 size=4000 is_IO=0 is_prefetchable=1 is_64=1
  bar[2] base_addr=f0100000 size=10000 is_IO=0 is_prefetchable=1 is_64=1
  Capabilities: [40] Power Management
  Capabilities: [48] Message Signaled Interrupts
  Capabilities: [60] PCI Express v2 Express Endpoint, MSI 0
    Link capabilities: Max speed 5.0 GT/s Max width x4
    Negotiated link status: Current speed 2.5 GT/s Width x4
    Link capabilities2: Not implemented
    DevCtl: CorrErr- NonFatalErr- FatalErr- UnsupReq-
            RlxdOrd- ExtTag+ PhantFunc- AuxPwr- NoSnoop+
    DevSta: CorrErr- NonFatalErr- FatalErr- UnsupReq- AuxPwr- TransPend-
  domain=0000 bus=00 dev=01 func=00
    vendor_id=8086 (Intel Corporation) device_id=0101 (Xeon E3-1200/2nd Generation Core Processor Family PCI Express Root Port) subvendor_id=8086 subdevice_id=2002
    control: I/O+ Mem+ BusMaster+ ParErr- SERR- DisINTx+
    status: INTx- <ParErr- >TAbort- <TAbort- <MAbort- >SERR- DetParErr-
    Capabilities: [88] Bridge subsystem vendor/device ID
    Capabilities: [80] Power Management
    Capabilities: [90] Message Signaled Interrupts
    Capabilities: [a0] PCI Express v2 Root Port, MSI 0
      Link capabilities: Max speed 5.0 GT/s Max width x16
      Negotiated link status: Current speed 2.5 GT/s Width x4
      Link capabilities2: Not implemented
      DevCtl: CorrErr- NonFatalErr- FatalErr- UnsupReq-
              RlxdOrd- ExtTag- PhantFunc- AuxPwr- NoSnoop-
      DevSta: CorrErr+ NonFatalErr- FatalErr- UnsupReq- AuxPwr- TransPend-
      SltCap: AttnBtn- PwrCtrl- MRL- AttnInd- PwrInd- HotPlug- Surprise-
             Slot #0 PowerLimit 0.000W; Interlock- NoCompl+

上面的輸出來自dump_info_libpciaccess.c程式.它從給定的 PCI 設備開始,並沿著 PCI 拓撲向下到達根聯合體。上面顯示了 PCIe 設備和根聯合體支持5.0 GT/s,但運行於2.5 GT/s.

pcie_set_speed.sh執行 Alex Forencich 編寫的腳本時,它會報告連結速度從 1 更改為 2。

$ sudo ~/Downloads/pcie_set_speed.sh 0000:01:00.0
Link capabilities: 02212d02
Max link speed: 2
Link status: 5041
Current link speed: 1
Configuring 0000:00:01.0...
Original link control 2: 00000002
Original link target speed: 2
New target link speed: 2
New link control 2: 00000002
Triggering link retraining...
Original link control: 50410040
New link control: 50410060
Link status: 5042
Current link speed: 2

然後dump_info_libpciaccess程式報告 PCIe 設備和根聯合體已在以下位置進行協商5 GT/s

$ dump_info/dump_info_libpciaccess 
domain=0000 bus=01 dev=00 func=00
  vendor_id=10ee (Xilinx Corporation) device_id=7024 ((null)) subvendor_id=0002 subdevice_id=0009
  control: I/O- Mem+ BusMaster+ ParErr- SERR- DisINTx-
  status: INTx- <ParErr- >TAbort- <TAbort- <MAbort- >SERR- DetParErr-
  bar[0] base_addr=f0110000 size=4000 is_IO=0 is_prefetchable=1 is_64=1
  bar[2] base_addr=f0100000 size=10000 is_IO=0 is_prefetchable=1 is_64=1
  Capabilities: [40] Power Management
  Capabilities: [48] Message Signaled Interrupts
  Capabilities: [60] PCI Express v2 Express Endpoint, MSI 0
    Link capabilities: Max speed 5.0 GT/s Max width x4
    Negotiated link status: Current speed 5.0 GT/s Width x4
    Link capabilities2: Not implemented
    DevCtl: CorrErr- NonFatalErr- FatalErr- UnsupReq-
            RlxdOrd- ExtTag+ PhantFunc- AuxPwr- NoSnoop+
    DevSta: CorrErr+ NonFatalErr- FatalErr- UnsupReq- AuxPwr- TransPend-
  domain=0000 bus=00 dev=01 func=00
    vendor_id=8086 (Intel Corporation) device_id=0101 (Xeon E3-1200/2nd Generation Core Processor Family PCI Express Root Port) subvendor_id=8086 subdevice_id=2002
    control: I/O+ Mem+ BusMaster+ ParErr- SERR- DisINTx+
    status: INTx- <ParErr- >TAbort- <TAbort- <MAbort- >SERR- DetParErr-
    Capabilities: [88] Bridge subsystem vendor/device ID
    Capabilities: [80] Power Management
    Capabilities: [90] Message Signaled Interrupts
    Capabilities: [a0] PCI Express v2 Root Port, MSI 0
      Link capabilities: Max speed 5.0 GT/s Max width x16
      Negotiated link status: Current speed 5.0 GT/s Width x4
      Link capabilities2: Not implemented
      DevCtl: CorrErr- NonFatalErr- FatalErr- UnsupReq-
              RlxdOrd- ExtTag- PhantFunc- AuxPwr- NoSnoop-
      DevSta: CorrErr+ NonFatalErr- FatalErr- UnsupReq- AuxPwr- TransPend-
      SltCap: AttnBtn- PwrCtrl- MRL- AttnInd- PwrInd- HotPlug- Surprise-
             Slot #0 PowerLimit 0.000W; Interlock- NoCompl+

即,已成功使用腳本更改 PCIe 連結速度,而無需重新啟動。

還有test_dma_bridge_parallel_streams.c為測量基於 FPGA 的 PCIe 裝置實現的 DMA 吞吐量而編寫的程式顯示吞吐量增加。該程式報告過去 10 秒內實現的吞吐量。在以下範例開始時,PCIe 裝置的速度為 2.5 GT/s,pcie_set_speed.sh腳本在測試執行時變更 PCIe 裝置連結速度,測得的吞吐量增加:

  0000:01:00.0 0 -> 1 381.186 Mbytes/sec (3811835904 bytes in 9.999928 secs)
  0000:01:00.0 1 -> 0 381.186 Mbytes/sec (3811835904 bytes in 9.999928 secs)

  0000:01:00.0 0 -> 1 381.193 Mbytes/sec (3811966976 bytes in 10.000095 secs)
  0000:01:00.0 1 -> 0 381.193 Mbytes/sec (3811966976 bytes in 10.000095 secs)

  0000:01:00.0 0 -> 1 680.225 Mbytes/sec (6802243584 bytes in 9.999985 secs)
  0000:01:00.0 1 -> 0 680.226 Mbytes/sec (6802243584 bytes in 9.999983 secs)

  0000:01:00.0 0 -> 1 737.226 Mbytes/sec (7372210176 bytes in 9.999935 secs)
  0000:01:00.0 1 -> 0 737.219 Mbytes/sec (7372210176 bytes in 10.000023 secs)

  0000:01:00.0 0 -> 1 737.226 Mbytes/sec (7372275712 bytes in 10.000028 secs)
  0000:01:00.0 1 -> 0 737.226 Mbytes/sec (7372275712 bytes in 10.000027 secs)

對於上述情況,我們使用的是不支援安全啟動的 PC。該腳本的一項限制pcie_set_speed.sh是它用於setpci更改連結速度。如果啟用了安全啟動,Linux 內核封鎖然後阻止setpci執行更改連結速度所需的 PCIe 配置暫存器寫入操作。

相關內容