RSS con interruzioni segnalate dal messaggio
I driver Miniport possono supportare le interruzioni segnalate dai messaggi (MSI) per migliorare le prestazioni RSS. Gli msi consentono alla scheda di interfaccia di rete di richiedere un interrupt sulla CPU che elabora i dati ricevuti. Per altre informazioni sul supporto di NDIS per MSI, vedere NDIS MSI-X.
La figura seguente illustra RSS con MSI-X.
Nella figura le frecce tratteggiate rappresentano l'elaborazione su una connessione diversa. RSS con MSI-X consente alla scheda di interfaccia di rete di interrompere la CPU corretta per una connessione.
Il processo seguente si ripete per ogni interrupt:
Scheda di interfaccia di rete:
Usa DMA per riempire i buffer con i dati ricevuti.
Il driver miniport ha allocato i buffer di ricezione nella memoria condivisa durante l'inizializzazione.
Calcola un valore hash.
Accoda il buffer a una CPU e fornisce le assegnazioni di coda al driver miniport. Ad esempio, la scheda di interfaccia di rete può eseguire un ciclo dei passaggi da 1 a 3 e DMA un elenco di assegnazioni di CPU dopo la ricezione di alcuni pacchetti. Il meccanismo specifico viene lasciato alla progettazione della scheda di interfaccia di rete.
L'uso di MSI-X interrompe la CPU associata a una coda non vuota.
La scheda di interfaccia di rete può riempire altri buffer di ricezione e aggiungerli alla coda in qualsiasi momento, ma non interrompe nuovamente tale CPU finché il driver miniport non abilita gli interrupt per tale CPU.
NDIS chiama l'ISR del driver miniport ( MiniportInterrupt) sulla CPU corrente.
L'ISR disabilita gli interrupt sulla CPU corrente e accoda un DPC sulla CPU corrente.
Gli interrupt possono comunque verificarsi sulle altre CPU mentre il DPC è in esecuzione sulla CPU corrente.
NDIS chiama la funzione MiniportInterruptDPC per ogni DPC in coda. Ogni DPC:
- Le compilazioni ricevono descrittori per tutti i buffer ricevuti nella coda e indicano i dati dello stack di driver. Per altre informazioni, vedere Indicazione dei dati di ricezione RSS.
- Abilita gli interrupt per la CPU corrente. L'interruzione è stata completata e il processo viene avviato di nuovo. Si noti che non è necessaria alcuna operazione atomica per tenere traccia dello stato di avanzamento di altri CONTROLLER di dominio.