Шрифт:
Поле
Запланированные (scheduled) на выполнение тасклеты (эквивалент сгенерированных отложенных прерываний) [39] хранятся в двух структурах, определенных для каждого процессора: структуре
39
Это еще один пример плохой терминологии. Почему отложенные прерывания (softirq) генерируются (rise), а тасклеты (tasklet) планируются (schedule)? Кто знает? Оба термина означают, что обработчики нижних половин помечаются как ожидающие на выполнение и в скором времени будут выполнены.
Тасклеты могут быть запланированы на выполнение с помощью функций
• Проверяется, не установлено ли поле
• Сохраняется состояние системы прерываний и запрещаются прерывания на локальном процессоре. Это гарантирует, что ничто на данном процессоре не будет мешать выполнению этого кода.
• Добавляется тасклет, который планируется на выполнение, в начало связанного списка структуры
• Генерируется отложенное прерывание с номером
• Устанавливается состояние системы прерываний в первоначальное значение и возвращается управление.
При первой же удобной возможности функция
• Запрещаются прерывания, и получается весь список
• Список текущего процессора очищается путем присваивания значения нуль указателю на него.
• Разрешаются прерывания (нет необходимости восстанавливать состояние системы прерываний в первоначальное значение, так как этот код может выполняться только в обработчике отложенного прерывания, который вызывается только при разрешенных прерываниях).
• Организовывается цикл по всем тасклетам в полученном списке.
• Если данная машина является многопроцессорной, то нужно проверить не выполняется ли текущий тасклет на другом процессоре, то есть проверить не установлен ли флаг
• Если тасклет не выполняется, то нужно установить флаг
• Проверяется значение поля
• Теперь можно быть уверенным, что тасклет нигде не выполняется, нигде не будет выполняться (так как он помечен как выполняющийся на данном процессоре) и что значение поля count равно нулю. Необходимо выполнить обработчик тасклета. После того как тасклет выполнился, следует очистить флаг
• Повторить описанный алгоритм для следующего тасклета, пока не останется ни одного тасклета, ожидающего выполнения.
Реализация тасклетов проста, но в то же время очень остроумна. Как видно, все тасклеты реализованы на базе двух отложенных прерываний