Как избежать сна при удержании спин-блокировки

Недавно я прочитал раздел 5.5.2 (Spinlocks and Atomic Context) книги LDDv3:

Как избежать сна при удерживании блокировка может быть более сложной; многие функции ядра могут "спать", и такое поведение не всегда хорошо документировано . Копирование данных в пользовательское пространство или из него - очевидный пример: требуемая страница пользовательского пространства может нуждаться в замене с диска перед продолжением копирования, и эта операция явно требует перехода в спящий режим. Практически любая операция, которая должна выделить память, может заснуть; kmalloc может решить отказаться от процессора и дождаться, пока станет доступным больше памяти, если ему явно не сказано этого не делать. Сон может случиться в неожиданных местах; написание кода, который будет выполняться при спин-блокировке , требует внимания к каждой функции, которую вы вызываете .

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

Предположим, однако, что у нас есть большой проект, в котором спин-блокировки широко используются. Как мы можем гарантировать, что функции, вызываемые из критических секций, защищенных спин-блокировками, никогда не будут спать?

Заранее спасибо!

5
задан Dmitry Krivenok 9 September 2010 в 13:07
поделиться