Что нужно сделать?
Во-первых, вы должны выделить новую структуру
tasklet struct И инициализировать ее, вызвав функцию tasklet init . Эта функция принимает в качестве параметров адрес дескриптора тасклета, адрес написанной вами функции тасклета и ее необязательный целочисленный аргумент.
Тасклет может быть избирательно отключен с помощью функции tasklet_disable_nosync ИЛИ tasklet_disable . Обе ЭТИ функции увеличивают поле count дескриптора тасклета, но последняя не возвращает управление, пока не завершится работающий экземпляр функции тасклета. Чтобы ВКЛЮЧИТЬ тасклет, Пользуйтесь функцией tasklet enable о.
Для активизации тасклета вы должны вызвать либо функцию taskiet_ schedule , Либо tasklet hi schedule , В Зависимости ОТ приоритета, КОТОРЫЙ вы придаете тасклету.
Эти две функции очень похожи, и каждая выполняет следующие действия:
1. Проверяет флаг tasklet state sched. Если он установлен, возвращает управление (тасклет уже был запланирован к выполнению).
2. Вызывает функцию locai irq save, чтобы сохранить состояние флага if и отключить локальные прерывания.
3. Заносит дескриптор тасклета в начало списка, на который указывает элемент tasklet_vec[n] ИЛИ tasklet_hi_vec ,
4. Вызывает функцию raise softirq irqoff о, чтобы активизировать softirq- функцию tasklet softirq или hi softirq (эта вызванная функция аналогична функции raise softirqo, но предполагает, что локальные прерывания уже отключены).
5. Вызывает функцию locai irq restore, чтобы восстановить состояние флага if.
В заключение раздела рассмотрим, как выполняется тасклет
Из предыдущего раздела мы знаем, что активизированные softirq-функции выполняются функцией do softirqO. Softirq-функция, ассоциированная с hi softirq, называется taskiet hi action о, а функция, ассоциированная С TASKLET SOFTIRQ, называется taskiet actiono. И снова две функции очень похожи друг на друга. Каждая из них выполняет следующие действия:
1. Отключает локальные прерывания.
2. Получает логический номер п локального процессора.
3. Сохраняет адрес списка, на который указывает элемент taskiet_vec[n] или taskiet hi vec , в локальной переменной list.
4. Записывает null в качестве адреса в элемент taskiet_vec[n] или taskiet hi vec , тем самым очищая список дескрипторов тасклетов, выбранных планировщиком.
5. Включает локальные прерывания.
6. Для каждого дескриптора тасклета в списке, на который указывает переменная list:
• в многопроцессорной системе проверяет флаг tasklet state run тасклета:
п если он установлен, значит, тасклет того же типа уже выполняется на другом процессоре. Тогда функция вставляет дескриптор тасклета обратно в список, на который указывается элемент taskiet vec или taskiet_hi_vec[n], и снова активизирует softirq-функцию tasklet softirq или hi softirq. Таким образом, выполнение тасклета откладывается до того момента, когда ни один тасклет того же типа не будет выполняться на других процессорах; в противном случае на другом процессоре не работает тасклет данного типа, и функция устанавливает этот флаг, чтобы на других процессорах нельзя было выполнить функцию тасклета;
• проверяет, не отключен ли тасклет, для чего анализирует поле count дескриптора тасклета. Если тасклет отключен, функция сбрасывает флаг tasklet state run и возвращает дескриптор тасклета в список, на который указывает элемент tasklet_vec[n] ИЛИ tasklet_hi_vec[n]. Затем она снова активизирует softirq-функцию tasklet softirq или hi_softirq;
• если тасклет не отключен, функция сбрасывает флаг tasklet_ state sched и выполняет функцию тасклета.
Обратите внимание, что, если функция тасклета не активизирует сама себя, каждая активизация тасклета приводит к выполнению, самое большее, одной функции тасклета.
Предыдущая страница | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | Следующая страница