7

我想在 linux 内核中创建自己的 softirq。这样做是否正确:

init模块中,我想触发softirqfrom 我将添加一个调用:

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 };

问题:

  • 我是对的还是我错过了什么?
  • 这是正确的方法吗?还有其他选择吗?
4

2 回答 2

1

如果你想修补内核并重新编译它,你可能做对了(除非你应该在 RCU_SOFTIRQ 之前移动它)。

否则,IOW 如果你想在内核模块中做,你必须使用基于 SoftIRQ 的 tasklet 在 SoftIRQ 上下文中做一些事情:

tasklet_init()用于初始化你的钩子。

tasklet_schedule()安排您注册的小任务。

于 2013-01-14T14:32:22.157 回答
0

静态声明 Softirq

MY_NEW_SOFTIRQ通过将它添加到enumand来静态声明你的 softirq( )
char *softirq_to_name[NR_SOFTIRQS]。重新编译内核。

即时注册 Softirq

一旦静态声明,我们自己的软中断应该在运行时在内核模块中使用open_softirq(). 在中断处理程序的退出路径中通过raise_softirq().

于 2015-05-21T07:27:37.887 回答