Вход/Регистрация
Разработка ядра Linux
вернуться

Лав Роберт

Шрифт:

Поле

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

Планирование тасклетов на выполнение

Запланированные (scheduled) на выполнение тасклеты (эквивалент сгенерированных отложенных прерываний) [39] хранятся в двух структурах, определенных для каждого процессора: структуре

tasklet_vec
(для обычных тасклетов) и структуре
tasklet_hi_vec
(для высокоприоритетных тасклетов). Каждая из этих структур — это связанный список структур
tasklet_struct
. Каждый экземпляр структуры
tasklet_struct
представляет собой отдельный тасклет.

39

Это еще один пример плохой терминологии. Почему отложенные прерывания (softirq) генерируются (rise), а тасклеты (tasklet) планируются (schedule)? Кто знает? Оба термина означают, что обработчики нижних половин помечаются как ожидающие на выполнение и в скором времени будут выполнены.

Тасклеты могут быть запланированы на выполнение с помощью функций

tasklet_schedule
и
tasklet_hi_schedule
, которые принимают единственный аргумент— указатель на структуру тасклета—
tasklet_struct
. Эти функции очень похожи (отличие состоит в том, что одна использует отложенное прерывание с номером
TASKLET_SOFTIRQ
, а другая — с номером
HI_SOFTIRQ
). К написанию и использованию тасклетов мы вернемся в следующем разделе. А сейчас рассмотрим детали реализации функции
tasklet_hi_schedule
, которые состоят в следующем.

• Проверяется, не установлено ли поле

state
в значение
TASKLET_STATE_SCHED
. Если установлено, то тасклет уже запланирован на выполнение и функция может возвратить управление.

• Сохраняется состояние системы прерываний и запрещаются прерывания на локальном процессоре. Это гарантирует, что ничто на данном процессоре не будет мешать выполнению этого кода.

• Добавляется тасклет, который планируется на выполнение, в начало связанного списка структуры

tasklet_vec
или
tasklet_hi_vec
, которые уникальны для каждого процессора в системе.

• Генерируется отложенное прерывание с номером

TASKLET_SOFTIRQ
или
HI_SOFTIRQ
, чтобы в ближайшее время данный тасклет выполнился при вызове функции
do_softirq
.

• Устанавливается состояние системы прерываний в первоначальное значение и возвращается управление.

При первой же удобной возможности функция

do_softirq
выполнится, как это обсуждалось в предыдущем разделе. Поскольку большинство тасклетов помечаются как готовые к выполнению в обработчиках прерываний, то, скорее всего, функция
do_softirq
вызывается сразу же, как только возвратится последний обработчик прерывания. Так как отложенные прерывания с номерами
TASKLET_SOFTIRQ
или
HI_SOFTIRQ
к этому моменту уже сгенерированы, то функция
do_softirq
выполняет соответствующие обработчики. Эти обработчики, а также функции
tasklet_action
и
tasklet_hi_action
являются сердцем механизма обработки тасклетов- Давайте рассмотрим, что они делают.

• Запрещаются прерывания, и получается весь список

tasklet_vec
или
tasklet_hi_vec
для текущего процессора.

• Список текущего процессора очищается путем присваивания значения нуль указателю на него.

• Разрешаются прерывания (нет необходимости восстанавливать состояние системы прерываний в первоначальное значение, так как этот код может выполняться только в обработчике отложенного прерывания, который вызывается только при разрешенных прерываниях).

• Организовывается цикл по всем тасклетам в полученном списке.

• Если данная машина является многопроцессорной, то нужно проверить не выполняется ли текущий тасклет на другом процессоре, то есть проверить не установлен ли флаг

TASLET_STATE_RUN
. Если тасклет уже выполняется, то его необходимо пропустить и перейти к следующему тасклету в списке (вспомним, что только один тасклет данного типа может выполняться в любой момент времени).

• Если тасклет не выполняется, то нужно установить флаг

TASLET_STATE_RUN
, чтобы другой процессор не мог выполнить этот тасклет.

• Проверяется значение поля

count
на равенство нулю, чтобы убедиться, что тасклет не запрещен. Если тасклет запрещен (поле count не равно нулю), то нужно перейти к следующему тасклету, который ожидает на выполнение.

• Теперь можно быть уверенным, что тасклет нигде не выполняется, нигде не будет выполняться (так как он помечен как выполняющийся на данном процессоре) и что значение поля count равно нулю. Необходимо выполнить обработчик тасклета. После того как тасклет выполнился, следует очистить флаг

TASLET_STATE_RUN
и поле
state
.

• Повторить описанный алгоритм для следующего тасклета, пока не останется ни одного тасклета, ожидающего выполнения.

Реализация тасклетов проста, но в то же время очень остроумна. Как видно, все тасклеты реализованы на базе двух отложенных прерываний

TASKLET_SOFTIRQ
и
HI_SOFTIRQ
. Когда тасклет запланирован на выполнение, ядро генерирует одно из этих двух отложенных прерываний. Отложенные прерывания, в свою очередь, обрабатываются специальными функциями, которые выполняют все запланированные на выполнение тасклеты. Эти специальные функции гарантируют, что только один тасклет данного типа выполняется в любой момент времени (но тасклеты разных типов могут выполняться одновременно). Вся эта сложность спрятана за простым и ясным интерфейсом.

  • Читать дальше
  • 1
  • ...
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: