4

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

经过调试,我意识到atomic_set()调用a时系统崩溃了。这意味着我正在从非原子函数调用原子函数?在这种情况下我不能使用 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类似的东西......所以我认为(如果我错了,请原谅我)我必须在我正在创建的函数中做一些事情,以保持锁定/原子的东西......但我不知道是什么:(

4

1 回答 1

1

您可以使用in_atomic宏,但它有一些限制。见评论。

于 2012-08-01T17:01:21.927 回答