Problemi di affidabilità per un driver WavePci Miniport

Un driver miniport WavePci deve tenere traccia dei mapping ricevuti dal driver della porta. Un driver miniport WavePci mantiene l'elenco dei mapping in una struttura di dati condivisa tra thread driver. I thread driver devono anche condividere l'accesso al canale DMA per aggiungere nuovi mapping alla coda hardware e rimuovere i mapping completati dalla coda. Per evitare il danneggiamento dei dati, i driver miniport usano blocchi di selezione per serializzare gli accessi alle strutture di dati condivise e alle periferiche. Un blocco spin protegge i dati condivisi e la coda hardware dall'accesso simultaneo da due o più thread driver.

Quando si sviluppa la parte del driver che gestisce i mapping, i fornitori devono prestare particolare attenzione ai punti seguenti.

Blocchi di rotazione

Per evitare potenziali deadlock, il driver miniport non deve contenere il proprio blocco di rotazione quando si chiama in Portcls.sys per acquisire o rilasciare i mapping. Il driver di esempio Ac97 in Microsoft Windows Driver Kit (WDK) illustra questo principio. Prima di chiamare IPortWavePciStream::GetMapping o IPortWavePciStream::ReleaseMapping, il driver di esempio chiama KeReleaseSpinLock per rilasciare il blocco di selezione. Al termine della chiamata GetMapping o ReleaseMapping , il driver chiama KeAcquireSpinLock per acquisire nuovamente il blocco di rotazione. Tra le chiamate al rilascio e l'acquisizione del blocco di selezione, un thread del driver non deve presupporre che abbia accesso esclusivo all'elenco di mapping. L'accesso ai dati condivisi durante questo intervallo non protetto è pericoloso. Se l'intervallo tra il rilascio e l'acquisizione del blocco di selezione è ridotto, anche la probabilità che i dati vengano danneggiati da una race condition tra due thread driver è ridotto. Ciò significa che gli errori risultanti sono intermittenti e quindi difficili da tracciare. Dopo il rilascio e l'acquisizione di un blocco di selezione, un driver ben scritto deve presupporre che qualsiasi puntatore o indice temporaneo usato in precedenza per accedere al contenuto delle strutture di dati condivise non è più valido.

Annullamento di IRP

In qualsiasi momento durante l'elaborazione di un flusso di riproduzione o acquisizione, l'annullamento di un IRP può causare la revoca di uno o più mapping acquisiti dal driver miniport. In questo caso, il driver della porta chiama il metodo IMiniportWavePciStream::RevokeMappings per inviare una notifica al driver miniport. Per evitare di riprodurre dati da o acquisire dati nei mapping revocati, il driver miniport deve rimuovere i mapping sia dall'elenco software che dalla coda hardware del controller DMA. Poiché l'elenco software e la coda hardware vengono condivisi tra thread driver, è necessario prestare attenzione per eseguire queste operazioni in modo affidabile.

Ad esempio, un set di mapping da revocare potrebbe contenere un mapping appena stato o che sta per essere rilasciato. In questo caso, due thread driver potrebbero tentare contemporaneamente di rimuovere lo stesso mapping dalla coda DMA. Se il driver non riesce a impedire l'accesso simultaneo, il risultato può essere danneggiato dai dati nei registri o nelle strutture di memoria che gestiscono la coda.

Per un esempio di codice funzionante, vedere il driver di esempio Ac97 in Windows Driver Kit (WDK).