我正在編寫一個內核模塊,其中我實現了一些將從另一個已修改的模塊中使用的函數。測試系統崩潰時。我得到一個「調度原子」的錯誤。如何知道內核代碼是否是原子?
調試完成後,我意識到當調用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()
函數有點長,但是我已經調試了很多,並且發現系統沒有崩潰,如果我紀念nt在swtoing()
之內的一條線與atomic_set()
...
任何幫助?
編輯2:更多信息
我意識到,內核模塊我修改都充滿了spin_locks
和類似的東西。所以我覺得(原諒我,如果我錯了),我必須做在我創建的函數中,爲了保持鎖定/原子的東西...但我不知道什麼:(
這可能意味着你處於原子環境中(例如持有自旋鎖或在irq韓dler),並且你調用了一些睡覺的函數。 – nos 2012-08-01 17:04:40
你可以提供一些上下文:你自己的代碼崩潰了嗎?你能否展示相關修改?另外,閱讀http://lxr.linux.no/#linux+v3.5/Documentation/atomic_ops.txt – 2012-08-01 17:57:27
@nos,我怎麼知道我在「原子上下文」?如果是這樣,我應該用什麼來代替atomic_set()? – jeanc 2012-08-01 19:02:29