Избегание сна при удерживании спин-блокировки

Недавно я прочитал раздел 5.5.2 (Спин-блокировки и атомарные контекст) книги LDDv3:

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

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

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

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


person Dmitry Krivenok    schedule 09.09.2010    source источник


Ответы (2)


А как насчет включения «проверки спин-блокировки сна» для вашего ядра? Обычно он находится в разделе «Отладка ядра» при запуске make config. Вы также можете попытаться воспроизвести его поведение в своем коде.

person Bandan    schedule 09.09.2010
comment
К вашему сведению, этот вариант CONFIG_DEBUG_ATOMIC_SLEEP - person TheCodeArtist; 26.12.2017

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

Спин-блокировка Linux существует только в многопроцессорных сборках (в однопроцессорных сборках препроцессор спин-блокировки определяет пустые) спин-блокировки предназначены для кратковременных блокировок на многопроцессорной платформе.

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

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

Если вам нужно заблокировать обработчик прерывания, используйте спин-блокировку с irqsave.

Для общей блокировки ядра вы должны использовать API-интерфейс mutex/semaphore, который при необходимости будет спать на блокировке.

Для блокировки кода, работающего в других процессах, используйте muxtex/semaphore. Для блокировки кода, работающего в контексте прерывания, используйте irq save/restore или spinlock_irq save/restore.

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

надеюсь, это поможет

person Andrew Roca    schedule 15.09.2010
comment
Как объясняется в ответе Павла, спин-блокировки также актуальны в однопроцессорных системах из-за вытеснения. - person Longfield; 01.06.2012
comment
spin_lock() также влияет на однопроцессорные системы с вытеснением: пока спин-блокировка заблокирована, вытеснение отключено. Это обеспечивает взаимное исключение в однопроцессорной системе с приоритетом. - person Craig McQueen; 29.11.2017
comment
Спин-блокировки больше подходят, чем мьютексы/семафоры, для кратковременных блокировок, которым просто нужно обеспечить взаимное исключение для доступа к данным и которые не могут спать. Для таких целей они более производительны, чем мьютексы/семафоры. - person Craig McQueen; 29.11.2017