Share via


Prevenzione degli errori e dei deadlock durante l'uso di blocchi di spin

Mentre una routine driver contiene un blocco di spin, non può causare un'eccezione hardware o generare un'eccezione software senza ridurre il sistema. In altre parole, l'ISR di un driver e qualsiasi routine SynchCritSection fornita dal driver in una chiamata a KeSynchronizeExecution non deve causare un errore o una trappola, ad esempio un errore di pagina o un'eccezione aritmetica e non può generare un'eccezione software. Una routine che chiama KeAcquireSpinLock o KeAcquireInStackQueuedSpinLock non può anche causare un'eccezione hardware o generare un'eccezione software finché non ha rilasciato il blocco di spin esecutivo e non è più in esecuzione in IRQL = DISPATCH_LEVEL.

Routine di supporto e dati paginabili

Tenendo premuto un blocco di rotazione, i driver non devono chiamare routine che accedono ai dati impaginabili. Tenere presente che i driver possono chiamare determinate routine di supporto che accedono ai dati paginabili se e solo se le chiamate si verificano durante l'esecuzione in un irQL rigorosamente inferiore a DISPATCH_LEVEL. Questa restrizione IRQL impedisce di chiamare queste routine di supporto mantenendo un blocco di spin. Per i requisiti IRQL per qualsiasi routine di supporto specifica, vedere la pagina di riferimento della routine.

Ricorsione

Il tentativo di acquisire un blocco di rotazione ricorsivo è garantito per causare un deadlock: l'istanza di una routine ricorsiva non può rilasciare il blocco di rotazione mentre una seconda creazione di istanze tenta di acquisire lo stesso blocco di spin.

Le linee guida seguenti descrivono come usare blocchi di rotazione con routine ricorsive:

  • La routine ricorsiva non deve chiamare se stessa mantenendo un blocco di rotazione o non deve tentare di acquisire lo stesso blocco di spin nelle chiamate successive.

  • Mentre la routine ricorsiva contiene un blocco di rotazione, un'altra routine driver non deve chiamare la routine ricorsiva se la ricorsione potrebbe causare un deadlock o potrebbe causare il blocco di rotazione per più di 25 microsecondi.

Per altre informazioni sulle routine dei driver ricorsivi, vedere Uso dello stack di kernel.

Acquisizioni di blocchi spin annidati

Il tentativo di acquisire un secondo blocco di rotazione mentre mantiene un altro blocco spin può anche causare deadlock o prestazioni di driver scarse.

Le linee guida seguenti descrivono come i driver devono contenere blocchi di rotazione:

  • Il driver non deve chiamare una routine di supporto che usa un blocco di rotazione a meno che non si verifichi un deadlock.

  • Anche se non è possibile eseguire un deadlock, il driver non deve chiamare una routine di supporto che usa un blocco spin, a meno che le tecniche di codifica alternative non possano fornire prestazioni e funzionalità di driver paragonabili.

  • Se un driver effettua chiamate annidate per acquisire blocchi di spin, deve sempre acquisire i blocchi di spin nello stesso ordine ogni volta che vengono acquisiti. Questo ordine consente di evitare deadlock.

In generale, evitare di usare blocchi di spin annidati per proteggere subset sovrapposti o set discreti di dati e risorse condivise. Si consideri cosa può accadere se un driver usa due blocchi di rotazione esecutivo per proteggere le risorse discrete, ad esempio una coppia di oggetti timer che potrebbero essere impostati singolarmente e collettivamente da varie routine di driver. Il driver avrebbe deadlock in modo intermittente in un computer SMP, ogni volta che una delle due routine, ognuna che tiene un blocco di rotazione, tentava di acquisire l'altro blocco di rotazione.

Per altre informazioni sull'acquisizione di blocchi di spin annidati, vedere Blocchi, Deadlock e Sincronizzazione.