如何知道内核代码是否是原子的?

时间:2012-08-01 16:57:59

标签: c linux-kernel atomic

我正在编写一个内核模块,我将实现一些将在我修改过的其他模块中使用的函数。测试系统崩溃时。我得到了“原子时调度”错误。

调试后,我意识到在调用atomic_set()时系统崩溃了。这意味着我从非原子函数调用原子函数?我不能在这种情况下使用atomic_set()吗?我该怎么用?

另外,正如我所说,我修改了一些原始内核文件来调用我的函数。我怎么知道我工作的地方是否是原子代码?

编辑:添加实际代码

net/netfilter/ipvs/ip_vs_core.c第451行,我调用了我的函数:

my_callback(svc, skb);

然后,在另一个文件中我有:

int my_callback(struct ip_vs_service *svc, struct sk_buff *skb)
{
        int swto;

        printk(KERN_INFO "callback called \n");

        swto = swtoing(svc);
        return swto;
}

我的swtoing()函数有点长,但我调试了很多,并且如果我使用swtoing()评论atomic_set()中的一行,系统不会崩溃...

任何帮助?

编辑2:更多信息

我意识到我正在修改的内核模块是spin_locks的全部和类似的东西...所以我想(如果我错了,请原谅我)我必须在我正在创建的函数中做一些事情,为了保持锁定/原子的东西......但我不知道是什么:(

1 个答案:

答案 0 :(得分:1)

您可以使用in_atomic宏,但有一些限制。请参阅评论。