forçar a renegociação da velocidade PCIe no Linux

forçar a renegociação da velocidade PCIe no Linux

Estou trabalhando com placas PCIe Gen 3 e de vez em quando elas parecem voltar às velocidades PCIe 1 ou 2 (de acordo com lspci e também observadas pelo rendimento).

Ao reiniciar/desligar e ligar a máquina, a velocidade volta para a velocidade total do PCIe Gen 3 na maioria dos casos.

Existe uma maneira menos intrusiva de forçar uma renegociação da velocidade do link PCI (tentando trazê-la de volta ao PCI Gen 3) por exemplo, no RHEL6?

Responder1

Você pode verificar sua política de energia PCIe neste arquivo:

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

Como o Gen3 é bastante direto no gerenciamento de energia através do ASPM (Active-State Power Management), esta pode ser a causa raiz do problema em seu barramento: A taxa de transferência é baixa, então os módulos reduzem a velocidade, mas se esquecem de aumentá-la novamente quando necessário (se necessário). Você pode impor o grub para evitar o uso da política "powersave" ou "default" desabilitando o aspm com o seguinte parâmetro:

pcie_aspm=off

Teste isso em apenas um kernel anexando esta opção na /boot/grub/grub.conflinha "kernel" do seu Linux de inicialização padrão. Exemplo de configuração do grub extraída dos documentos da 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

Responder2

Velocidade definida PCIepossui um pcie_set_speed.shscript que pode alterar a velocidade do link de destino de um dispositivo. Usei esse script com sucesso no Alma 8.9 (ou seja, baseado em RHEL) com um 4.18.0-513.18.1.el8_9.x86_64Kernel.

Tenha um FPGA Xilinx Kintex-7 em uma placa PCIe:

  1. O FPGA PCIe IP foi configurado para funcionar na velocidade PCIe 2 com 4 pistas.
  2. A placa PCIe está em um slot de 16 pistas, com uma CPU Intel i5-2310 que suporta velocidade PCIe 2.

Notei que a interface PCIe foi negociada na velocidade 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+

A saída acima é dodump_info_libpciaccess.cprograma. Ele começa em um determinado dispositivo PCI e percorre a topologia PCI até o complexo raiz. A imagem acima mostra o suporte ao dispositivo PCIe e ao complexo raiz 5.0 GT/s, mas estava rodando em 2.5 GT/s.

Quando o pcie_set_speed.shscript escrito por Alex Forencich foi executado, ele relatou que a velocidade do link foi alterada de 1 para 2. O único argumento usado foi o dispositivo PCI para operar, fazendo com que o dispositivo PCIe tentasse negociar para sua velocidade de link mais rápida suportada:

$ 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

E o dump_info_libpciaccessprograma então relatou que o dispositivo PCIe e o complexo raiz foram negociados em 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+

Ou seja, um script foi usado com sucesso para alterar a velocidade do link PCIe sem a necessidade de reinicialização.

Também otest_dma_bridge_parallel_streams.cO programa que foi escrito para medir a taxa de transferência DMA alcançada pelo dispositivo PCIe baseado em FPGA mostrou um aumento na taxa de transferência. O programa relata o rendimento alcançado nos últimos 10 segundos. No início do exemplo a seguir, o dispositivo PCIe estava a uma velocidade de 2,5 GT/s, o pcie_set_speed.shscript alterou a velocidade do link do dispositivo PCIe enquanto o teste estava em execução, o rendimento medido aumentou:

  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 o exposto, estava usando um PC que não suporta inicialização segura. Uma limitação do pcie_set_speed.shscript é que ele usa setpcipara alterar a velocidade do link. Se a inicialização segura estiver habilitada, o Kernel do Linuxconfinamentoimpede setpcia execução de gravações nos registros de configuração PCIe, necessárias para alterar a velocidade do link.

informação relacionada