2012-08-01 74 views
4

我正在編寫一個內核模塊,其中我實現了一些將從另一個已修改的模塊中使用的函數。測試系統崩潰時。我得到一個「調度原子」的錯誤。如何知道內核代碼是否是原子?

調試完成後,我意識到當調用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和類似的東西。所以我覺得(原諒我,如果我錯了),我必須做在我創建的函數中,爲了保持鎖定/原子的東西...但我不知道什麼:(

+0

這可能意味着你處於原子環境中(例如持有自旋鎖或在irq韓dler),並且你調用了一些睡覺的函數。 – nos 2012-08-01 17:04:40

+0

你可以提供一些上下文:你自己的代碼崩潰了嗎?你能否展示相關修改?另外,閱讀http://lxr.linux.no/#linux+v3.5/Documentation/atomic_ops.txt – 2012-08-01 17:57:27

+0

@nos,我怎麼知道我在「原子上下文」?如果是這樣,我應該用什麼來代替atomic_set()? – jeanc 2012-08-01 19:02:29

回答

1

您可以使用in_atomic宏但有一些限制。請參閱註釋。

+0

感謝您的幫助。我已編輯該問題以添加更多信息 – jeanc 2012-08-02 02:01:05

+0

關於(不使用)in_atomic宏的更多信息:https://lwn.net/Articles/274695/ – yman 2017-01-31 07:58:15

相關問題