Функция dosoftirqO
Функция do softirqO читает битовую маску sofitirq-функций локального процессора и выполняет функции отложенного выполнения, которые соответствуют установленным битам. При выполнении sofitirq-функций могут "всплыть” новые висящие sofitirq-функции. Чтобы обеспечить малое время задержки таких функций, функция do softirqO продолжает работать, пока все висящие sofitirq-функции не будут выполнены. Этот подход, однако, может привести к тому, что функция do softirqO будет работать достаточно долго, задерживая процессы режима пользователя. По этой причине функция do softirqO выполняет фиксированное количество итераций, а затем возвращает управление. Оставшиеся висящие sofitirq-функции, если таковые имеются, будут в свое время обработаны потоком ядра ksofitirqd, описанным в следующем разделе.
Приведем краткое описание действий, выполняемых функцией:
1. Инициализирует счетчик итераций значением .
2. Копирует битовую маску sofitirq-функций локального процессора (выбранную макросом local softirq pending () ) В локальную переменную pending.
3. Вызывает функцию iocai_bh_disabieо, чтобы увеличить счетчик sofitirq- функций. На первый взгляд кажется странным, что функции отложенного выполнения, должны быть запрещены перед началом их выполнения, но в этом есть глубокий смысл. Поскольку функции отложенного выполнения выполняются, в основном, при включенных прерываниях, по ходу
работы функции do softirqO может возникнуть прерывание. Когда функция do iRQO выполняет функцию irq exito, может стартовать еще один экземпляр функции do softirqO. Этого необходимо избежать,
поскольку функции отложенного выполнения должны выполняться на процессоре последовательно. Поэтому первый экземпляр функции do softirq запрещает выполнение функций отложенного выполнения,чтобы любой новый экземпляр этой функции закончил работу после шага функции do sof tirq .
4. Сбрасывает битовую карту softirq-функций локального процессора, чтобы новые softirq-функции могли быть активизированы (битовая маска уже сохранена в локальной переменной pending на шаге ).
5. Вызывает функцию iocai_irq_enabie, чтобы включить локальные прерывания.
6. Для каждого установленного бита в локальной переменной pending вызывает соответствующую softirq-функцию. Вспомним, что адрес softirq- функции С ИНДеКСОМ п ХраНИТСЯ В Переменной softirq_vec [n] ->action.
7. Вызывает функцию locai irq disabieо, чтобы отключить локальные прерывания.
8. Копирует битовую маску softirq-функций локального процессора в локальную переменную pending и еще раз уменьшает счетчик итераций.
9. Если переменная pending не равна 0 (то есть хотя бы одна softirq-функция была активизирована после начала последней итерации) и счетчик итераций все еще положителен, функция возвращается к шагу .
10. Если имеются висящие softirq-функции, функция вызывает функцию wakeup softirqdo, чтобы разбудить поток ядра, который отвечает за выполнение softirq-функций на локальном процессоре
11. Вычитает 1 из счетчика softirq-функций, тем самым разрешая выполнение функций отложенного выполнения.
Предыдущая страница | 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 | Следующая страница