KeAcquireSpinLock долгое время выполнения

В настоящее время я разрабатываю драйвер ядра Windows, который реализует собственный сетевой стек. Во время тестирования некоторых базовых функций реализованного стека я заметил, что ответы на эхо-запросы иногда занимали значительно больше времени, чем обычно. Продолжая исследовать эту проблему, я обнаружил, что время выполнения иногда достигает 20 мс (вместо нескольких мкс), даже когда блокировка не удерживается другими ядрами (я подтвердил это, распечатав значение блокировки перед вызовом KeAcquireSpinLock).

Поскольку я понятия не имел, почему это занимает так много времени, я применил другой подход, вручную увеличив IRQL, если это необходимо:

      oldIrql = KeGetCurrentIrql();
if (oldIrql < DISPATCH_LEVEL)
{
  KeRaiseIrql(DISPATCH_LEVEL, &oldIrql);
}

KeAcquireSpinLockAtDpcLevel(m_lock);

// DO STH WITH SHARED RECOURCES

KeReleaseSpinLockFromDpcLevel(m_lock);
if (oldIrql< DISPATCH_LEVEL) KeLowerIrql(oldIrql);
      

Я ожидал, что приведенный выше код будет функционально эквивалентен. Однако оказалось, что проблема времени выполнения, с которой я столкнулся, исчезла, и с таким подходом производительность вполне удовлетворительна.

Я искал в Интернете похожие проблемы, но похоже, что я один с этой проблемой. Может у меня глюк в других разделах драйвера? Может кто-нибудь объяснить такое поведение?

Обратите внимание, что я не говорю о тупиках, поскольку всегда будет возвращаться в какой-то момент, и реализация с использует тот же объект архитектуры / блокировки.

0 ответов

Другие вопросы по тегам