Чтение онлайн

на главную

Жанры

Разработка ядра Linux
Шрифт:

Реализация тасклетов

Так как тасклеты реализованы на основе отложенных прерываний, они тоже являются отложенными прерываниями (softirq). Как уже рассказывалось, тасклеты представлены двумя типами отложенных прерываний:

HI_SOFTIRQ
и
TASKLET_SOFTIRQ
. Единственная разница между ними в том, что тасклеты типа
HI_SOFTIRQ
выполняются всегда раньше тасклетов типа
TASKLET_SOFTIRQ
.

Структуры тасклетов

Тасклеты представлены с помощью структуры

tasklet_struct
.
Каждый экземпляр структуры представляет собой уникальный тасклет. Эта структура определена в заголовочном файле
<linux/interrupt.h>
в следующем виде.

struct tasklet_struct {

 struct tasklet_struct *next; /* указатель на следующий

тасклет в списке */

 unsigned long state; /* состояние тасклета */

 atomic_t count; /* счетчик ссылок */

 void (*func)(unsigned long); /* функция-обработчик тасклета */

 unsigned long data; /* аргумент функции-обработчика тасклета */

);

Поле

func
— это функция-обработчик тасклета (эквивалент поля
action
для структуры, представляющей отложенное прерывание), которая получает поле
data
в качестве единственного аргумента при вызове.

Поле

state
может принимать одно из следующих значений: нуль,
TASKLET_STATE_SCHED
или
TASLET_STATE_RUN
. Значение
TASKLET_STATE_SCHED
указывает на то, что тасклет запланирован на выполнение, а значение
TASLET_STATE_RUN
— что тасклет выполняется. Для оптимизации значение
TASLET_STATE_RUN
может использоваться только на многопроцессорной машине, так как на однопроцессорной машине и без этого точно известно, выполняется ли тасклет (действительно, ведь код, который выполняется, либо принадлежит тасклету, либо нет).

Поле

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
, чтобы другой процессор не мог выполнить этот тасклет.

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

Воевода

Ланцов Михаил Алексеевич
5. Помещик
Фантастика:
альтернативная история
5.00
рейтинг книги
Воевода

Девятый

Каменистый Артем
1. Девятый
Фантастика:
боевая фантастика
попаданцы
9.15
рейтинг книги
Девятый

Совершенный: пробуждение

Vector
1. Совершенный
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Совершенный: пробуждение

Кодекс Крови. Книга Х

Борзых М.
10. РОС: Кодекс Крови
Фантастика:
фэнтези
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга Х

Дайте поспать! Том IV

Матисов Павел
4. Вечный Сон
Фантастика:
городское фэнтези
постапокалипсис
рпг
5.00
рейтинг книги
Дайте поспать! Том IV

Ротмистр Гордеев

Дашко Дмитрий Николаевич
1. Ротмистр Гордеев
Фантастика:
фэнтези
попаданцы
альтернативная история
5.00
рейтинг книги
Ротмистр Гордеев

Как я строил магическую империю 2

Зубов Константин
2. Как я строил магическую империю
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Как я строил магическую империю 2

Тройняшки не по плану. Идеальный генофонд

Лесневская Вероника
Роковые подмены
Любовные романы:
современные любовные романы
6.80
рейтинг книги
Тройняшки не по плану. Идеальный генофонд

Специалист

Кораблев Родион
17. Другая сторона
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Специалист

Не грози Дубровскому! Том IX

Панарин Антон
9. РОС: Не грози Дубровскому!
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Не грози Дубровскому! Том IX

Неудержимый. Книга III

Боярский Андрей
3. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга III

Изгой. Пенталогия

Михайлов Дем Алексеевич
Изгой
Фантастика:
фэнтези
9.01
рейтинг книги
Изгой. Пенталогия

Жена по ошибке

Ардова Алиса
Любовные романы:
любовно-фантастические романы
7.71
рейтинг книги
Жена по ошибке

Пистоль и шпага

Дроздов Анатолий Федорович
2. Штуцер и тесак
Фантастика:
альтернативная история
8.28
рейтинг книги
Пистоль и шпага