forzar la renegociación de la velocidad PCIe en Linux

forzar la renegociación de la velocidad PCIe en Linux

Estoy trabajando con tarjetas PCIe Gen 3 y de vez en cuando parecen volver a velocidades PCIe 1 o 2 (según lspci y también observado por el rendimiento).

Al reiniciar o apagar y encender la máquina, la velocidad vuelve a la velocidad máxima de PCIe Gen 3 en la mayoría de los casos.

¿Existe una forma menos intrusiva de forzar una renegociación de la velocidad del enlace PCI (intentando devolverla a PCI Gen 3) en, por ejemplo, RHEL6?

Respuesta1

Puedes consultar tu política energética PCIe en este archivo:

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

Dado que Gen3 es bastante sencillo en cuanto a la administración de energía a través de ASPM (Administración de energía de estado activo), esta podría ser la causa principal del problema en su bus: el rendimiento es bajo, por lo que los módulos reducen la velocidad pero se olvidan de aumentarla nuevamente cuando necesario (si es necesario). Puede exigir en grub que evite el uso de la política "ahorro de energía" o "predeterminada" deshabilitando aspm con el siguiente parámetro:

pcie_aspm=off

Pruebe esto en un solo kernel agregando esta opción en /boot/grub/grub.confla línea "kernel" de su Linux de arranque predeterminado. Ejemplo de configuración de grub extraída de los documentos de Red Hat:

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

Respuesta2

Velocidad de configuración de PCIetiene un pcie_set_speed.shscript que puede cambiar la velocidad del enlace de destino de un dispositivo. He utilizado ese script con éxito en Alma 8.9 (es decir, basado en RHEL) con un 4.18.0-513.18.1.el8_9.x86_64Kernel.

Tener una FPGA Xilinx Kintex-7 en una tarjeta PCIe:

  1. La FPGA PCIe IP se configuró para funcionar a velocidad PCIe 2 con 4 carriles.
  2. La tarjeta PCIe está en una ranura de 16 carriles, con una CPU Intel i5-2310 que admite velocidad PCIe 2.

Observé que la interfaz PCIe se negoció a una velocidad 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+

El resultado anterior es deldump_info_libpciaccess.cprograma. Comienza en un dispositivo PCI determinado y avanza por la topología PCI hasta el complejo raíz. Lo anterior muestra la compatibilidad con el dispositivo PCIe y el complejo raíz 5.0 GT/s, pero se ejecutaban en 2.5 GT/s.

Cuando pcie_set_speed.shse ejecutó el script escrito por Alex Forencich, informó que la velocidad del enlace había cambiado de 1 a 2. El único argumento utilizado fue el dispositivo PCI en el que operar, por lo que hace que el dispositivo PCIe intente negociar su velocidad de enlace más rápida admitida:

$ 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

Y luego el dump_info_libpciaccessprograma informó que el dispositivo PCIe y el complejo raíz habían negociado en 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+

Es decir, se utilizó con éxito un script para cambiar la velocidad del enlace PCIe sin necesidad de reiniciar.

También eltest_dma_bridge_parallel_streams.cEl programa que fue escrito para medir el rendimiento de DMA logrado por el dispositivo PCIe basado en FPGA mostró un aumento en el rendimiento. El programa informa el rendimiento alcanzado en los últimos 10 segundos. Al comienzo del siguiente ejemplo, el dispositivo PCIe tenía una velocidad de 2,5 GT/s, el pcie_set_speed.shscript cambió la velocidad de enlace del dispositivo PCIe mientras se ejecutaba la prueba y el rendimiento medido aumentó:

  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)

Para lo anterior, estaba usando una PC que no admite arranque seguro. Una limitación del pcie_set_speed.shscript es que se utiliza setpcipara cambiar la velocidad del enlace. Si el arranque seguro está habilitado, el kernel de Linuxaislamientoluego impide setpcirealizar las escrituras en los registros de configuración PCIe que son necesarias para cambiar la velocidad del enlace.

información relacionada