Condividi tramite


RSS con una singola coda di ricezione hardware

I driver Miniport possono supportare RSS per le schede di interfaccia di rete che supportano il calcolo hash RSS e una singola coda di descrittore di ricezione.

La figura seguente illustra l'elaborazione RSS con una singola coda del descrittore di ricezione.

Diagramma che illustra l'elaborazione RSS con una singola coda di descrittore di ricezione.

Nella figura le frecce tratteggiate rappresentano un percorso alternativo per l'elaborazione della ricezione. RSS non può controllare la CPU che riceve la chiamata ISR iniziale.

A differenza dell'elaborazione della ricezione non RSS, l'elaborazione di ricezione basata su RSS viene distribuita su più CPU. Inoltre, l'elaborazione per una determinata connessione può essere associata a una determinata CPU.

Il processo seguente si ripete per ogni interrupt:

  1. La scheda di interfaccia di rete usa DMA per riempire i buffer con i dati ricevuti e interrompe il sistema.

    Il driver miniport ha allocato i buffer di ricezione nella memoria condivisa durante l'inizializzazione.

  2. La scheda di interfaccia di rete può riempire buffer di ricezione aggiuntivi in qualsiasi momento, ma non interrompe di nuovo fino a quando il driver miniport non abilita gli interrupt.

    I buffer ricevuti gestiti dal sistema in un unico interrupt possono essere associati a molte connessioni di rete diverse.

  3. NDIS chiama la funzione MiniportInterrupt (ISR) del driver miniport su una CPU determinata dal sistema.

  4. L'ISR disabilita le interruzioni e richiede a NDIS di accodare una chiamata di procedura posticipata (DPC) per elaborare i dati ricevuti.

  5. NDIS chiama la funzione MiniportInterruptDPC (DPC) sulla CPU corrente. Nel DPC:

    1. Il driver miniport usa i valori hash calcolati dalla scheda di interfaccia di rete per ogni buffer ricevuto e riassegna ogni buffer ricevuto a una coda di ricezione associata a una CPU.
    2. Il DPC corrente richiede a NDIS di accodare un DPC per ognuna delle altre CPU associate a una coda di ricezione non vuota.
    3. Se il DPC corrente è in esecuzione su una CPU associata a una coda non vuota, il DPC corrente elabora i buffer di ricezione associati e indica i dati ricevuti fino allo stack di driver.

    L'assegnazione di code e l'accodamento di controller di dominio aggiuntivi richiedono un sovraccarico di elaborazione aggiuntivo. Per ottenere prestazioni di sistema migliori, questo sovraccarico deve essere compensato da un migliore utilizzo delle CPU disponibili.

  6. DPC in una determinata CPU:

    1. Elabora i buffer di ricezione associati alla coda di ricezione e indica i dati dello stack di driver. Per altre informazioni, vedere Indicazione dei dati di ricezione RSS.
    2. Abilita gli interrupt, se è l'ultimo DPC da completare. L'interruzione è stata completata e il processo viene avviato di nuovo. Il driver deve usare un'operazione atomica per identificare l'ultimo DPC da completare. Ad esempio, il driver può usare la funzione NdisInterlockedDecrement per implementare un contatore atomico.