我想在linux内核中创建自己的softirq。这是否是正确的方法:
在模块的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 };
答案 0 :(得分:1)
如果你想修补内核并重新编译它,你可能做得对(除非你应该在RCU_SOFTIRQ之前移动它)。
否则,如果您想在内核模块中执行此操作,则必须使用基于SoftIRQ的tasklet在SoftIRQ上下文中执行某些操作:
tasklet_init()
用于初始化你。
tasklet_schedule()
安排您注册的tasklet。
答案 1 :(得分:0)
通过将您的softirq MY_NEW_SOFTIRQ
添加到enum
静态声明
char *softirq_to_name[NR_SOFTIRQS]
。重新编译内核。
一旦静态声明,我们自己的softirq应该在运行时使用open_softirq()
在内核模块中注册。通过raise_softirq()
在中断处理程序的退出路径中提升它。