Недавно я прочитал раздел 5.5.2 (Спин-блокировки и атомарные контекст) книги LDDv3:
Избежать сна, удерживая замок, может быть сложнее; многие функции ядра могут спать, и это поведение не всегда хорошо документировано. Очевидным примером является копирование данных в пользовательское пространство или из него: может потребоваться выгрузить требуемую страницу пользовательского пространства с диска перед продолжением копирования, и эта операция явно требует спящего режима. Почти любая операция, которая должна выделять память, может заснуть; kmalloc может принять решение об отказе от процессора и подождать, пока не станет доступным больше памяти, если ему явно не указано не делать этого. Сон может случиться в неожиданных местах; написание кода, который будет выполняться при спин-блокировке, требует уделять внимание каждой функции, которую вы вызываете.
Для меня ясно, что спин-блокировки всегда должны удерживаться в течение минимально возможного времени, и я думаю, что относительно легко написать правильный код, использующий спин-блокировки, с нуля.
Предположим, однако, что у нас есть большой проект, в котором широко используются спин-блокировки. Как мы можем гарантировать, что функции, вызываемые из критических секций, защищенных спин-блокировками, никогда не будут спать?
Заранее спасибо!