jinxinxin163 发表于 2012-02-24 09:31

in_interrupt疑问

关于中断上下文的问题,内核里有一个宏定义in_interrupt
但是in_interrupt主要用意是根据当前preempt_count变量,来判断当前代码是否在一个中断上下文中执行。

#define in_interrupt()        (irq_count())
#define irq_count()        (preempt_count() & (HARDIRQ_MASK | SOFTIRQ_MASK \
                               | NMI_MASK))

那么,如果我在我的代码前面加上一句:
local_bh_disable(void)
因为local_bh_disable会将当前preempt_count()+SOFTIRQ_OFFSET,所以会导致in_interrupt返回1
那是不是说我的代码在执行
local_bh_disable之后就进入中断上下文了?
求高手解疑,谢谢



附:
void local_bh_disable(void)
{
        __local_bh_disable((unsigned long)__builtin_return_address(0));
}
static inline void __local_bh_disable(unsigned long ip)
{
        add_preempt_count(SOFTIRQ_OFFSET);
        barrier();
}

tempname2 发表于 2012-02-24 11:37

是的,可以将执行路径分为中断类和非中断类,非中断类可以被调度,中断类只能简单地被中断类打断。

MagicBoy2010 发表于 2012-02-24 15:32

关注一下本人CU博客中相关内容,比2楼的详细 :)

瀚海书香 发表于 2012-02-25 13:58

回复 1# jinxinxin163
那么,如果我在我的代码前面加上一句:
local_bh_disable(void)
因为local_bh_disable会将当前preempt_count()+SOFTIRQ_OFFSET,所以会导致in_interrupt返回1
那是不是说我的代码在执行
local_bh_disable之后就进入中断上下文了?
是的,之后就进入软中断上下文的。但是还是可能被中断打断。
   

jinxinxin163 发表于 2012-02-27 11:50

回复 4# 瀚海书香


    那内核线程在调用preempt_disable之后可以被软中断打断不?为什么?

瀚海书香 发表于 2012-02-27 12:01

回复 5# jinxinxin163
那内核线程在调用preempt_disable之后可以被软中断打断不?为什么?
可以被打断。因为你只是禁止强制,但是没有禁止软中断,而软中断的优先级高于内核线程,所以会打断内核线程的执行。

   

jinxinxin163 发表于 2012-02-27 13:22

回复 6# 瀚海书香


    禁止抢占跟禁止软中断不是一回事么?
local_bh_disable也不过是把preempt_count()加了 SOFTIRQ_OFFSET而已,都是让preempt_count>0,从而禁止了抢占阿

瀚海书香 发表于 2012-02-27 13:26

回复 7# jinxinxin163
禁止抢占跟禁止软中断不是一回事么?
这两个当然不是一回事了。虽然都是给preempt_count增加,但是增加的位置不同。preempt_count分为三段,分别表示中断计数、软中断计数和抢占计数。

禁止了抢占,并不一定会禁止软中断,因为你只是增加了preempt_count的抢占计数,而没有增加软中断计数,所以当前的环境下禁止抢占,但是允许软中断。

   

jinxinxin163 发表于 2012-02-27 14:54

回复 8# 瀚海书香


    那preempt_disable只是禁止”别的进程“抢占了? preempt_disable只是针对进程上下文而言的?

瀚海书香 发表于 2012-02-28 08:07

回复 9# jinxinxin163
preempt_disable只是针对进程上下文而言的?
preempt_disable的工作是禁止进程抢占。可以这么理解
   
页: [1] 2
查看完整版本: in_interrupt疑问