본문 바로가기
컴퓨터/SSD

[nvme] MSI(Message Signaled Interrupt)

by mikasaAck 2025. 3. 3.
728x90

 

  • pcie 장치가 특정 메모리 주소에 데이터를 써서 host에 인터럽트를 알리는 방식이다
  • pin-based interrupt와 어떻게 다른가?
    • pin-based interrupt란, pcie 장치가 물리적인 인터럽트 핀을 통해 host에 인터럽트를 알리는 방식이다. 이는 단일 cpu에만 지원가능하다.
    • pcie config space의 header에는 interrupt pin, interrupt line 필드가 있다.
    • nvme device에서 pin-based interrupt를 사용할 경우, 어떤 문제가 있는가?
      • nvme device는 여러 개의 CQ를 만들 수 있다. 여러 CQ의 entry가 추가될 때마다 host한테 알려줘야 한다. 그런데, host의 단일 cpu가 이를 다 처리한다면, 여러 CQ를 사용하는 것이 nvme device 성능 측면에서 무의미할 수 있다.
  • host는 특정 CQ에 MSI를 사용하고자 할 때, 어떻게 설정하는가?
    • host: pcie device가 MSI를 지원하는지 확인
      Multiple Message Capable 확인
    • host: CQ 개수와 MSI vector mapping 계획nvme device가 지원하는 CQ 개수를 확인한다. 어떻게 알아?
      각 CQ에 MSI vector 할당 계획을 세운다.
      cf. MSI는 최대 32개 Vector 지원
    • host: MSI 설정configuration space의 MSI 레지스터 설정
      • Messsage Address 설정: APIC(Interrupt Controller) 주소
      • message data: 기본 벡터 번호 (host에서 사용할 수 있는 벡터 범위가 있을거니까)
        		  Message Address(오프셋 0x54): APIC 주소(예: 0xFEE00000).
        		  Message Data(오프셋 0x5C): 기본 벡터 번호(예: 0x0040 → 벡터 64).
        
      • MSI enable
    • host: CQ Create 요청CQ를 생성하고 MSI vector(message data를 위한 정보)를 연결한다.
    • device: CQ entry posting하고 CQ에 연결된 MSI vector를 발생하도록 한다.configuration space의 message address에 message data를 쓴다.
      APIC는 message data를 보고, 어느 cq에 메시지가 들어왔구나를 알 수 있다. 그러면, cq마다 다른 cpu가 처리한다고 하면, 성능 측면에서 유리하겠구나
    • CQ1에 작업 완료 시 Message Address(0xFEE00000)에 Message Data(0x0041)를 쓰는 로직 설정.
    • host: MSI vector에 대한 인터럽트 핸들러 등록

 

728x90
반응형

'컴퓨터 > SSD' 카테고리의 다른 글

[NVMe] CQ Entry - phase tag  (0) 2025.03.02
[NVMe][OCP] Telemetry  (0) 2024.12.29
[PCIe] Enumeration  (0) 2023.06.22
[NVMe] Reservation  (0) 2023.06.07
[NVMe] Feature  (0) 2023.05.21