미니포트 드라이버는 메시지 신호 인터럽트(MSI)를 지원하여 RSS 성능을 향상시킬 수 있습니다. MSI를 사용하면 NIC가 수신된 데이터를 처리할 CPU에 대한 인터럽트를 요청할 수 있습니다. MSI에 대한 NDIS 지원에 대한 자세한 내용은 NDIS MSI-X참조하세요.
다음 그림에서는 MSI-X를 사용하는 RSS를 보여 줍니다.
그림에서 파선 화살표는 다른 연결에서의 처리를 나타냅니다. MSI-X가 있는 RSS를 사용하면 NIC가 연결에 대해 적절한 CPU에 인터럽트를 보낼 수 있습니다.
각 인터럽트마다 다음 프로세스가 반복됩니다.
The NIC:
DMA를 사용하여 수신된 데이터로 버퍼를 채웁니다.
미니포트 드라이버는 초기화 중에 공유 메모리에 수신 버퍼를 할당했습니다.
해시 값을 계산합니다.
버퍼를 CPU에 큐에 대기시키고 미니포트 드라이버에 큐 할당을 제공합니다. 예를 들어, NIC는 1-3단계를 반복한 후, 몇 개의 패킷이 수신되면 CPU 할당 목록을 DMA로 전송할 수 있습니다. 특정 메커니즘은 NIC 디자인에 남아 있습니다.
MSI-X를 사용하면 비어있지 않은 큐와 연결된 CPU를 중단합니다.
NIC는 추가 수신 버퍼를 채우고 언제든지 큐에 추가할 수 있지만 미니포트 드라이버가 해당 CPU에 대한 인터럽트 기능을 사용하도록 설정할 때까지 해당 CPU를 다시 중단하지 않습니다.
NDIS는 현재 CPU에서 미니포트 드라이버의 ISR(MiniportInterrupt)을 호출합니다.
ISR은 현재 CPU에서 인터럽트를 비활성화하고 현재 CPU에 DPC를 대기합니다.
DPC가 현재 CPU에서 실행되는 동안 다른 CPU에서 인터럽트는 여전히 발생할 수 있습니다.
NDIS는 대기하는 각 DPC에 대해 MiniportInterruptDPC 함수를 호출합니다. 각 DPC:
- 빌드는 큐에서 받은 모든 버퍼에 대한 설명자를 수신하고 드라이버 스택으로 데이터를 전달합니다. 자세한 내용은 RSS 수신 데이터 나타내는을 참조하세요.
- 현재 CPU에 대한 인터럽트를 활성화합니다. 이 인터럽트는 완료되고 프로세스가 다시 시작됩니다. 다른 DPC의 진행 상황을 추적하는 데 원자 단위 작업이 필요하지 않습니다.