Как определить и запустить мой собственный новый softirq в ядре Linux?

Я хотел бы создать свой собственный softirq в ядре Linux. Это правильный способ сделать это:

в init модуля я хотел бы вызвать softirq от я добавлю звонок на:

394 void open_softirq(int nr, void (*action)(struct softirq_action *))
395 {
396         softirq_vec[nr].action = action;
397 }

И во фрагменте я хотел бы поднять Softirq я добавлю вызов raise_softirq функция:

379 void raise_softirq(unsigned int nr)
380 {
381         unsigned long flags;
382 
383         local_irq_save(flags);
384         raise_softirq_irqoff(nr);
385         local_irq_restore(flags);
386 }

И добавить мой новый softirq в:

411 /* PLEASE, avoid to allocate new softirqs, if you need not _really_ high
412    frequency threaded job scheduling. For almost all the purposes
413    tasklets are more than enough. F.e. all serial device BHs et
414    al. should be converted to tasklets, not to softirqs.
415  */
416 
417 enum
418 {
419         HI_SOFTIRQ=0,
420         TIMER_SOFTIRQ,
421         NET_TX_SOFTIRQ,
422         NET_RX_SOFTIRQ,
423         BLOCK_SOFTIRQ,
424         BLOCK_IOPOLL_SOFTIRQ,
425         TASKLET_SOFTIRQ,
426         SCHED_SOFTIRQ,
427         HRTIMER_SOFTIRQ,
428         RCU_SOFTIRQ,    /* Preferable RCU should always be the last softirq */
429         MY_NEW_SOFTIRQ
430         NR_SOFTIRQS
431 };

И здесь:

 60 char *softirq_to_name[NR_SOFTIRQS] = {
 61         "HI", "TIMER", "NET_TX", "NET_RX", "BLOCK", "BLOCK_IOPOLL",
 62         "TASKLET", "SCHED", "HRTIMER", "RCU", "MY_NEW_SOFTIRQ"
 63 };

Вопросы:

  • Я прав или я что-то упустил?
  • Это правильный способ сделать это? какие-нибудь другие варианты?

2 ответа

Если вы хотите пропатчить ядро ​​и перекомпилировать его, вы, вероятно, делаете все правильно (за исключением того, что вы должны переместить его до RCU_SOFTIRQ).

В противном случае, если вы хотите сделать это в модуле ядра, вы должны использовать тасклет, основанный на SoftIRQ, чтобы сделать что-то в контексте SoftIRQ:

tasklet_init() используется для инициации вашего крючка.

tasklet_schedule() запланировать тасклет, который вы регистрируете.

Объявите Softirq статически

Статически объявить свой софтирк (MY_NEW_SOFTIRQ), добавив его в enum а также
char *softirq_to_name[NR_SOFTIRQS], Перекомпилируйте ядро.

Зарегистрируйте Softirq на лету

После статического объявления наш собственный softirq должен быть зарегистрирован во время выполнения в модуле ядра, используя open_softirq(), Поднимите его в пути выхода обработчика прерываний через raise_softirq(),

Другие вопросы по тегам