momo zone

调核人的blog

辨识并小心 内核原子环境

今天把一段控制代码移到netlink 回调函数中, 结果一到netlink 流程的某一段kernel就彻底挂了。思来想去,一阵抓耳挠腮后 感觉会不会因为netlink 是中断上下文,而我的控制代码中有睡眠动作的原因 ?   先看了下那段控制代码,大概在第6层调用的时候碰到了vmalloc  ,条件一满足了。 至于netlink是不是中断上下文我就不知道了,幸运的是kernel里面有这样几个宏:

#define in_atomic() ((preempt_count() & ~PREEMPT_ACTIVE) != 0)

#define in_irq() (hardirq_count())
#define in_softirq() (softirq_count())
#define in_interrupt() (irq_count())
#define in_serving_softirq() (softirq_count() & SOFTIRQ_OFFSET)

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

其中in_interrupt 就是对应hardirq 和softirq 两方。 我插入这个宏测试了一下,发现确实不再中断上下文。 然后郁闷了一下,再试试是否在原子上下文吧。 结果这下命中了,好吧,我刚刚知道netlink 流程是在原子上下文。 接下来怎么改代码呢,把控制逻辑放到工作队列?  这样岂不是变成异步模式了, 不行 ,在想想吧 ……………………………..

Advertisements

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: