Freigeben über


RSS mit einer einzelnen Hardware-Empfangswarteschlange

Miniport-Treiber können RSS für NICs unterstützen, die die RSS-Hashberechnung und eine einzelne Empfangsdeskriptorwarteschlange unterstützen.

Die folgende Abbildung veranschaulicht die RSS-Verarbeitung mit einer einzelnen Empfangsdeskriptorwarteschlange.

Diagramm zur Veranschaulichung der RSS-Verarbeitung mit einer einzelnen Empfangsdeskriptorwarteschlange

In der Abbildung stellen die gestrichelten Pfeile einen alternativen Pfad für die Empfangsverarbeitung dar. RSS kann die CPU, die den anfänglichen ISR-Aufruf empfängt, nicht steuern.

Im Gegensatz zur Nicht-RSS-Empfangsverarbeitung wird die RSS-basierte Empfangsverarbeitung auf mehrere CPUs verteilt. Außerdem kann die Verarbeitung für eine bestimmte Verbindung an eine bestimmte CPU gebunden werden.

Der folgende Prozess wird für jeden Interrupt wiederholt:

  1. Die NIC verwendet DMA, um Puffer mit empfangenen Daten zu füllen und das System zu unterbrechen.

    Der Miniporttreiber hat während der Initialisierung die Empfangspuffer im freigegebenen Speicher zugeordnet.

  2. Die NIC kann jederzeit zusätzliche Empfangspuffer füllen, unterbricht aber nicht erneut, bis der Miniporttreiber die Interrupts aktiviert.

    Die empfangenen Puffer, die das System in einem Interrupt verarbeitet, können vielen verschiedenen Netzwerkverbindungen zugeordnet werden.

  3. NDIS ruft die MiniportInterrupt-Funktion (ISR) des Miniporttreibers für eine systembestimmte CPU auf.

  4. Der ISR deaktiviert die Interrupts und fordert NDIS auf, einen verzögerten Prozeduraufruf (DPC) in die Warteschlange zu stellen, um die empfangenen Daten zu verarbeiten.

  5. NDIS ruft die MiniportInterruptDPC-Funktion (DPC) auf der aktuellen CPU auf. Im DPC:

    1. Der Miniporttreiber verwendet die Hashwerte, die die NIC für jeden empfangenen Puffer berechnet hat, und weist jeden empfangenen Puffer einer Empfangswarteschlange, die einer CPU zugeordnet ist, neu zu.
    2. Der aktuelle DPC fordert NDIS an, einen DPC für jede der anderen CPUs in die Warteschlange zu stellen, die einer nicht leeren Empfangswarteschlange zugeordnet sind.
    3. Wenn der aktuelle DPC auf einer CPU ausgeführt wird, die einer nicht leeren Warteschlange zugeordnet ist, verarbeitet der aktuelle DPC die zugeordneten Empfangspuffer und gibt die empfangenen Daten im Treiberstapel an.

    Das Zuweisen von Warteschlangen und das Anstehen zusätzlicher DPCs erfordert zusätzlichen Verarbeitungsaufwand. Um eine verbesserte Systemleistung zu erzielen, muss dieser Mehraufwand durch eine bessere Auslastung der verfügbaren CPUs ausgeglichen werden.

  6. Der DPC für eine bestimmte CPU:

    1. Verarbeitet die Empfangspuffer, die der Empfangswarteschlange zugeordnet sind, und gibt die Daten im Treiberstapel an. Weitere Informationen finden Sie unter Angeben von RSS-Empfangsdaten.
    2. Aktiviert die Interrupts, wenn es sich um den letzten DPC handelt, der abgeschlossen werden soll. Dieser Interrupt ist abgeschlossen, und der Prozess wird erneut gestartet. Der Treiber muss einen atomischen Vorgang verwenden, um den letzten DPC zu identifizieren, der abgeschlossen werden soll. Der Treiber kann beispielsweise die NdisInterlockedDecrement-Funktion verwenden, um einen atomischen Zähler zu implementieren.