다음을 통해 공유


단일 하드웨어 수신 큐가 있는 RSS

미니포트 드라이버는 RSS 해시 계산 및 단일 수신 설명자 큐를 지원하는 NIC용 RSS를 지원할 수 있습니다.

다음 그림에서는 단일 수신 설명자 큐를 사용한 RSS 처리를 보여 줍니다.

단일 수신 설명자 큐를 사용하여 RSS 처리를 보여 주는 다이어그램

그림에서 파선 화살표는 수신 처리를 위한 대체 경로를 나타냅니다. RSS는 초기 ISR 호출을 수신하는 CPU를 제어할 수 없습니다.

비 RSS 수신 처리와 달리 RSS 기반 수신 처리는 여러 CPU에 분산됩니다. 또한 지정된 연결에 대한 처리는 지정된 CPU에 연결할 수 있습니다.

각 인터럽트마다 다음 프로세스가 반복됩니다.

  1. NIC는 DMA를 사용하여 수신된 데이터로 버퍼를 채우고 시스템을 중단합니다.

    미니포트 드라이버는 초기화 중에 공유 메모리에 수신 버퍼를 할당했습니다.

  2. NIC는 언제든지 추가 수신 버퍼를 채울 수 있지만 미니포트 드라이버에서 인터럽트 사용이 가능할 때까지 다시 인터럽트하지 않습니다.

    시스템이 하나의 인터럽트에서 처리하는 수신된 버퍼는 다양한 네트워크 연결과 연결할 수 있습니다.

  3. NDIS는 시스템 결정 CPU에서 미니포트 드라이버의 ISR( MiniportInterrupt 함수)을 호출합니다.

  4. ISR은 인터럽트 기능을 사용하지 않도록 설정하고 수신된 데이터를 처리하기 위해 DPC(지연 프로시저 호출)를 큐에 대기하도록 NDIS에 요청합니다.

  5. NDIS는 현재 CPU에서 MiniportInterruptDPC 함수(DPC)를 호출합니다. DPC에서:

    1. 미니포트 드라이버는 수신된 각 버퍼에 대해 NIC가 계산한 해시 값을 사용하고 받은 각 버퍼를 CPU와 연결된 수신 큐에 다시 할당합니다.
    2. 현재 DPC는 비어 있지 않은 수신 큐와 연결된 다른 각 CPU에 대해 DPC를 큐에 대기하도록 NDIS에 요청합니다.
    3. 현재 DPC가 비어 있지 않은 큐와 연결된 CPU에서 실행 중인 경우 현재 DPC는 연결된 수신 버퍼를 처리하고 수신된 데이터를 드라이버 스택 위로 표시합니다.

    큐를 할당하고 추가 DPC를 큐에 대기하려면 추가 처리 오버헤드가 필요합니다. 시스템 성능을 향상시키려면 사용 가능한 CPU를 더 잘 활용하여 이 오버헤드를 오프셋해야 합니다.

  6. 지정된 CPU의 DPC:

    1. 수신 큐와 연결된 수신 버퍼를 처리하고 드라이버 스택의 데이터를 나타냅니다. 자세한 내용은 RSS 수신 데이터 표시를 참조하세요.
    2. 마지막 DPC인 경우 인터럽트(완료할 마지막 DPC인 경우)를 사용하도록 설정합니다. 이 인터럽트는 완료되고 프로세스가 다시 시작됩니다. 드라이버는 원자성 연산을 사용하여 완료할 마지막 DPC를 식별해야 합니다. 예를 들어 드라이버는 NdisInterlockedDecrement 함수를 사용하여 원자성 카운터를 구현할 수 있습니다.