Linux 커널 버그 때문에 32GB BAR 네 장이 PCIe 스위치 뒤에서 자리 잡지 못한 사연

Fitting Four 32 GB Resizable Bars Behind a PCIe Switch on Linux

Linux 커널 버그 때문에 32GB BAR 네 장이 PCIe 스위치 뒤에서 자리 잡지 못한 사연

Broadcom PEX88096 PCIe 스위치 뒤에 Radeon AI PRO R9700 네 장을 붙여 ROCm P2P를 쓰려면 각 카드에 32GB Resizable BAR가 필요하다. 그런데 Linux 7.0의 pbus_size_mem()이 자식 윈도우 크기를 단순 합산하면서 2MB 도어벨과 다음 카드 사이의 거의 32GB 공간을 빼먹어 'can't assign; no space'가 발생한다. 저자는 initramfs에서 BAR 크기를 조정하고 리스캔하는 커널 모듈을 만들어 해결했고, 이후 네 카드 모두 32GB BAR를 받아 P2P가 14.0GB/s로 동작했다.

그 함수는 브리지의 각 자식에 대해 자식의 크기, 또는 정렬이 더 크면 그 정렬을 총합에 더한다.
  1. dougcalobrisi

    이건 제가 쓴 글입니다. 기본적으로 텐서 병렬 서빙을 위해 네 장의 R9700 사이에 P2P가 필요했고, 그 말은 각 카드에 32GB BAR가 있어야 한다는 뜻이었습니다. GPU 여섯 장을 모두 꽂으니 BIOS가 이들을 매핑하지 못했고, Linux는 스위치의 윈도우 크기를 너무 작게 잡아서 결국 두 장의 카드만 BAR를 할당받았습니다. 글에 나온 모듈이 이를 우회하는 방법입니다. P2P를 끄면 prefill 속도가 약 절반으로 떨어졌습니다.

  2. zir_blazer

    이런 것들은 Coreboot에서 테스트해보면 재미있을 겁니다. Dasharo가 4년도 더 전에 MSI PRO Z690-A DDR4용으로 출시되었을 때, 저는 Radeon 5600XT 두 장을 설치했을 때 문제가 있었는데, 개발자가 MMIO 관련 파라미터 몇 개를 조정한 후에 해결되었습니다: https://github.com/Dasharo/dasharo-issues/issues/245

    PCIe 스위치를 몇 개까지 체인으로 연결할 수 있는지, 그리고 터무니없는 MMIO 요구 사항을 가진 카드를 몇 장까지 작동시킬 수 있는지는 흥미로운 실험이 될 겁니다.

    지난 10여 년 동안 저는 펌웨어 MMIO 관련 문제를 꽤 많이 봤습니다. 특정 SR-IOV 지원 NIC들(보통 i350 같은 Intel 제품이나 다른 엔터프라이즈 부품)이 소비자용 마더보드에서 지원되는 모든 SR-IOV 가상 함수를 생성할 만큼 충분한 MMIO를 예약하지 못하는 걸 기억합니다. 많은 경우 SR-IOV를 작동시킬 수는 있었지만 하드웨어가 16개를 지원하더라도 4개 정도의 VF만 생성할 수 있었는데, 그게 들어갈 수 있는 한계였기 때문입니다. 이건 본질적으로 전부 펌웨어 문제였지 하드웨어 문제는 아니었지만, MMIO 할당처럼 꽤 복잡한 것을 고치기 위해 BIOS 모딩을 할 수 있는 기술을 가진 사람은 거의 없습니다. 기본적으로, 당신은 다른 곳에서 펌웨어 문제를 우회하려고 하는 겁니다.

  3. bombela

    BAR이라는 단어나 약어가 34번 언급되지만 한 번도 정의되지 않았습니다.

이 날의 다른 글

2026-11-12