wzw200 发表于 2015-02-01 21:00

ksoftirqd 被中断-小问题

本帖最后由 wzw200 于 2015-02-01 22:00 编辑

内核线程ksoftirqd 在执行do_softirq处理一个软中断--taskletA时候被中断的了,
进而执行irq_exit->do_softirq--taskletA,这个函数又是可重入的了
这样会不会出问题


1、中断退出执行的irq_exit
2、内核线程ksoftirqd

这两种情况是怎能么实现互互斥的呢,


http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=1966733

asmlinkage void do_softirq(void)
{
      __u32 pending;
      unsigned long flags;
      //
      // 这个函数判断,如果当前有硬件中断嵌套,或者
      // 有软中断正在执行时候,则马上返回。在这个
      // 入口判断主要是为了与 ksoftirqd 互斥。
      //
      if (in_interrupt())
                return;

没看明白!

wzw200 发表于 2015-02-01 21:25

do_softirq
{
      //禁止中断,保存中断标志
      local_irq_save(flags);
                。。。。。。。
                //恢复之
      local_irq_restore(flags);
}
看了其它人的帖子,好像有这个

ran4029 发表于 2015-02-01 21:55

软中断是不能再被其他软中断打断的,只有硬中断可以打断软中断去执行中断上半部,所以你说的这个问题应该不存在啊。

wzw200 发表于 2015-02-01 22:03

回复 3# ran4029

那个软中断线程,在执行do_softirq的时候,应该是这样的,只是想不通他是怎么实现的


   

wzw200 发表于 2015-02-01 22:12

do_softirq()中有两个非常值得注意的地方:

asmlinkage void do_softirq(void)
{
/* 如果当前CPU指令运行于中断或者软中断文境中,必须直接返回。
   这可以回答guotie的问题, local_bh_disable()的实际作用是标志当前任务_互斥_软中断。
   1. 如果软中断文境下,任务在__do_softirq()函数时,被中断打断,进入中断处理,中断执行完后,再次进入软中断,到达这里就会返回。
   2. 还有一个,就是如果在内核任务ksoftirqd文境中执行 do_softirq()的时候,被中断打断后,也不会实质进入软中断,这样可以避免大部分的内核同步问题 */
if (in_interrupt())
return;

local_irq_save(flags);

if (local_softirq_pending()) {
curctx = current_thread_info();

这是我查的资料,我想不通,第二种情况是怎么实现的,

wzw200 发表于 2015-02-01 22:17

asmlinkage void do_softirq(void)
{
        __u32 pending;
        unsigned long flags;

        if (in_interrupt())
                return;

        local_irq_save(flags);

        pending = local_softirq_pending();

        if (pending)
                __do_softirq();

        local_irq_restore(flags);
}

asmlinkage void __do_softirq(void)
{
        struct softirq_action *h;
        __u32 pending;
        int max_restart = MAX_SOFTIRQ_RESTART;
        int cpu;

        pending = local_softirq_pending();
        account_system_vtime(current);

        __local_bh_disable((unsigned long)__builtin_return_address(0));
        lockdep_softirq_enter();

        cpu = smp_processor_id();
      ............................
      _local_bh_enable();
}

static inline void __local_bh_disable(unsigned long ip)
{
        add_preempt_count(SOFTIRQ_OFFSET);
        barrier();
}

好吧,我想明白了

anyhit 发表于 2015-02-03 14:26

回复 6# wzw200

http://bbs.chinaunix.net/thread-4165519-1-1.html
我之前有发过一个帖子。应该跟你这个疑问略有相同之处。只不过我现在也还未完全明白

其中的关键点儿应该集中在 中断返回 时堆栈恢复 与 软中断调度的区别


   

wzw200 发表于 2015-02-03 16:39

回复 7# anyhit


中断返回 时堆栈恢复 与 软中断调度的区别

这个这几天,我看明白了,我一会到你那里给你回下,
我看这块的时候,都是自己想偏了,CPU怎么运行,还要看代码
QQ:88486969

   
页: [1]
查看完整版本: ksoftirqd 被中断-小问题