"setpci"를 사용하여 Intel 82599ES 10Gbit 카드의 MaxReadRequest 값 변경

"setpci"를 사용하여 Intel 82599ES 10Gbit 카드의 MaxReadRequest 값 변경

저는 커널 5.11.0-34-generic이 포함된 Linux Mint 20.2와 함께 사용되는 Intel 82599ES 듀얼 10Gbit 카드를 가지고 있습니다. "setpci" 명령을 사용하여 MaxReadRequest 값을 512바이트에서 최대 2048바이트로 설정하려고 합니다. lspci 출력은 다음과 같습니다.

04:00.1 Ethernet controller: Intel Corporation 82599ES 10-Gigabit SFI/SFP+ Network Connection (rev 01)
Subsystem: Intel Corporation Ethernet Server Adapter X520-2
Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+
Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Latency: 0, Cache Line Size: 64 bytes
Interrupt: pin B routed to IRQ 34
Region 0: Memory at e0300000 (64-bit, prefetchable) [size=512K]
Region 2: I/O ports at d000 [disabled] [size=32]
Region 4: Memory at e0400000 (64-bit, prefetchable) [size=16K]
Capabilities: [40] Power Management version 3
    Flags: PMEClk- DSI+ D1- D2- AuxCurrent=0mA PME(D0+,D1-,D2-,D3hot+,D3cold-)
    Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=1 PME-
Capabilities: [50] MSI: Enable- Count=1/1 Maskable+ 64bit+
    Address: 0000000000000000  Data: 0000
    Masking: 00000000  Pending: 00000000
Capabilities: [70] MSI-X: Enable+ Count=64 Masked-
    Vector table: BAR=4 offset=00000000
    PBA: BAR=4 offset=00002000
Capabilities: [a0] Express (v2) Endpoint, MSI 00
    DevCap: MaxPayload 512 bytes, PhantFunc 0, Latency L0s <512ns, L1 <64us
        ExtTag- AttnBtn- AttnInd- PwrInd- RBE+ FLReset+ SlotPowerLimit 0.000W
    DevCtl: CorrErr+ NonFatalErr+ FatalErr+ UnsupReq+
        RlxdOrd+ ExtTag- PhantFunc- AuxPwr- NoSnoop+ FLReset-
        MaxPayload 256 bytes, **MaxReadReq 512 bytes**
    DevSta: CorrErr+ NonFatalErr- FatalErr- UnsupReq+ AuxPwr- TransPend-
    LnkCap: Port #0, Speed 5GT/s, Width x8, ASPM L0s, Exit Latency L0s <1us
        ClockPM- Surprise- LLActRep- BwNot- ASPMOptComp-
    LnkCtl: ASPM Disabled; RCB 64 bytes Disabled- CommClk+
        ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt-
    LnkSta: Speed 5GT/s (ok), Width x8 (ok)
        TrErr- Train- SlotClk+ DLActive- BWMgmt- ABWMgmt-
    DevCap2: Completion Timeout: Range ABCD, TimeoutDis+, NROPrPrP-, LTR-
         10BitTagComp-, 10BitTagReq-, OBFF Not Supported, ExtFmt-, EETLPPrefix-
         EmergencyPowerReduction Not Supported, EmergencyPowerReductionInit-
         FRS-, TPHComp-, ExtTPHComp-
         AtomicOpsCap: 32bit- 64bit- 128bitCAS-
    DevCtl2: Completion Timeout: 50us to 50ms, TimeoutDis-, LTR-, OBFF Disabled
         AtomicOpsCtl: ReqEn-
    LnkSta2: Current De-emphasis Level: -6dB, EqualizationComplete-, EqualizationPhase1-
         EqualizationPhase2-, EqualizationPhase3-, LinkEqualizationRequest-

Intel 데이터시트 82599를 사용하면 장치 제어 레지스터가 제어한다고 나와 있습니다.MaxReadReq는 바이트 오프셋 0xA8에 있습니다., 구체적으로:

여기에 이미지 설명을 입력하세요.

82599ES의 16진수 공간은 다음과 같습니다.

sudo lspci -xxx -s 04:00.1
04:00.1 Ethernet controller: Intel Corporation 82599ES 10-Gigabit SFI/SFP+ Network Connection (rev 01)
00: 86 80 fb 10 06 04 10 00 01 00 00 02 10 00 80 00
10: 0c 00 30 e0 00 00 00 00 01 d0 00 00 00 00 00 00
20: 0c 00 40 e0 00 00 00 00 00 00 00 00 86 80 03 00
30: 00 00 00 00 40 00 00 00 00 00 00 00 ff 02 00 00
40: 01 50 23 48 00 20 00 2b 00 00 00 00 00 00 00 00
50: 05 70 80 01 00 00 00 00 00 00 00 00 00 00 00 00
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
70: 11 a0 3f 80 04 00 00 00 04 20 00 00 00 00 00 00
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
a0: 10 00 02 00 c2 8c 00 10 3f 28 09 00 82 c4 01 00
b0: 40 00 82 10 00 00 00 00 00 00 00 00 00 00 00 00
c0: 00 00 00 00 1f 00 00 00 00 00 00 00 00 00 00 00
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

Mellanox에서 예를 찾았습니다.최적의 성능을 위한 PCIe 구성 이해하지만 그들이 사용하고 있던 setpci 명령을 사용하면 아무 일도 일어나지 않는 것 같았습니다. 아마도 내가 잘못된 레지스터 위치를 변경했기 때문일 것입니다. 나는 여전히 비트 14:12의 "바이트 오프셋 0xA8"을 이해하고 이를 setpci가 이해할 수 있는 것으로 변환하는 방법을 찾으려고 노력 중입니다.

질문: "setpci" 명령을 사용하여 0xA8의 14:12 비트가 무엇인지 확인하고 그 값을 "100b"로 변경하여 MaxReadReq를 512바이트에서 2048바이트로 변경하려면 어떻게 해야 합니까? 어떤 도움이라도 대단히 감사하겠습니다!

답변1

setpci -s 04:00.1 a8.w장치 제어 레지스터의 값을 출력합니다. 

  • -s 04:00.1질문에 표시된 것처럼 장치 사양입니다.
  • a8질문에 표시된 대로 장치 제어 레지스터의 주소입니다.
  • .w2바이트((주문) 등록.

보다PCI 설정(8)자세한 내용은 매뉴얼 페이지를 참조하세요.

아시다시피 비트 12-14는 로그 맵의 최대 읽기 요청 크기를 나타냅니다. 82599에 대한 Intel 데이터시트(질문에서 참조)에 표시된 대로,

  • 0xxx → 128
  • 1xxx → 256
  • 2xxx → 512
  • 3xxx → 1024
  • 4xxx → 2048

어댑터가 마지막 3자리 숫자에 대해 반환하는 값이 무엇이든 첫 번째 숫자를 변경하고 구문을 사용하여 새 값을 설정합니다. 예를 들어, 어댑터가 반환되는 경우name=value283f이고 이를 2048바이트로 설정하려는 경우 값을 다음으로 변경합니다.483f.

setpci -s 04:00.1 a8.w=483f

값 없이 다시 내보내서 읽기를 다시 시도하여 값을 얻었는지 확인하세요.

setpci -s 04:00.1 a8.w

입력한 값이 반환되어야 합니다.

전원을 끄고 다시 시작하여 활성화하세요.

관련 정보