Prévention des erreurs et des interblocages lors de l’utilisation de verrous de rotation

Bien qu’une routine de pilote contienne un verrou de rotation, elle ne peut pas provoquer une exception matérielle ou déclencher une exception logicielle sans mettre le système hors service. En d’autres termes, l’ISR d’un pilote et toute routine SynchCritSection que le pilote fournit lors d’un appel à KeSynchronizeExecution ne doivent pas provoquer d’erreur ou d’interruption, telle qu’une erreur de page ou une exception arithmétique, et ne peuvent pas déclencher d’exception logicielle. Une routine qui appelle KeAcquireSpinLock ou KeAcquireInStackQueuedSpinLock ne peut pas non plus provoquer une exception matérielle ou déclencher une exception logicielle tant qu’elle n’a pas libéré son verrou de rotation exécutif et ne s’exécute plus sur IRQL = DISPATCH_LEVEL.

Données paginables et routines de support

Tout en tenant un verrou de rotation, les pilotes ne doivent pas appeler les routines qui accèdent aux données paginables. N’oubliez pas que les pilotes peuvent appeler certaines routines de support qui accèdent aux données paginables si et seulement si leurs appels se produisent lors de l’exécution à un NIVEAU IRQL strictement inférieur à DISPATCH_LEVEL. Cette restriction IRQL empêche l’appel de ces routines de support tout en maintenant un verrou de rotation. Pour connaître les exigences IRQL pour toute routine de support spécifique, consultez la page de référence de la routine.

Récursivité

La tentative d’acquisition d’un verrou de rotation de manière récursive entraîne un interblocage : l’instanciation de conservation d’une routine récursive ne peut pas libérer le verrou de rotation pendant qu’une deuxième instanciation tourne, en essayant d’acquérir le même verrou de rotation.

Les instructions suivantes décrivent comment utiliser des verrous de rotation avec des routines récursives :

  • La routine récursive ne doit pas s’appeler tout en maintenant un verrou de rotation, ou ne doit pas tenter d’acquérir le même verrou de rotation lors des appels suivants.

  • Alors que la routine récursive contient un verrou de rotation, une autre routine de pilote ne doit pas appeler la routine récursive si la récursivité peut entraîner un interblocage ou peut amener l’appelant à maintenir le verrouillage de rotation pendant plus de 25 microsecondes.

Pour plus d’informations sur les routines de pilotes récursifs, consultez Utilisation de la pile du noyau.

Acquisitions de verrous de spin imbriqués

La tentative d’acquisition d’un deuxième verrou de rotation tout en conservant un autre verrou de rotation peut également entraîner des interblocages ou des performances du pilote médiocres.

Les instructions suivantes décrivent comment les pilotes doivent contenir les verrous de rotation :

  • Le pilote ne doit pas appeler une routine de support qui utilise un verrou de rotation, sauf si un interblocage ne peut pas se produire.

  • Même si un interblocage ne peut pas se produire, le pilote ne doit pas appeler une routine de support qui utilise un verrou de rotation, sauf si d’autres techniques de codage ne peuvent pas fournir des performances et des fonctionnalités de pilote comparables.

  • Si un pilote effectue des appels imbriqués pour acquérir des verrous de rotation, il doit toujours acquérir les verrous de rotation dans le même ordre chaque fois qu’ils sont acquis. Cet ordre permet d’éviter les interblocages.

En général, évitez d’utiliser des verrous de rotation imbriqués pour protéger des sous-ensembles qui se chevauchent ou des ensembles discrets de données et de ressources partagées. Réfléchissez à ce qui peut se produire si un pilote utilise deux verrous de rotation exécutifs pour protéger des ressources discrètes, telles qu’une paire d’objets minuteur qui peuvent être définis individuellement et collectivement par différentes routines de pilote. Le pilote interbloque par intermittence dans une machine SMP, chaque fois que l’une des deux routines, chacune tenant un verrou de rotation, essayait d’acquérir l’autre verrou de rotation.

Pour plus d’informations sur l’acquisition de verrous de rotation imbriqués, consultez Verrous, interblocages et synchronisation.