2013-02-15 144 views
3

還有一個過程不斷創建需要通過此代碼進行處理的文件。 此代碼不斷地通過比較文件系統的內容和包含處理結果的sqlite數據庫來爲文件系統掃描需要處理的新文件 - 每個文件一個記錄。此過程運行於nice -n 19以免干擾其他進程創建新文件。 這對於大量(> 1k)的文件完全適用,但隨後與BUG: scheduling while atomic一起爆炸。 據this「BUG:調度原子?」的可能原因是什麼?

「而原子計劃」表明您已經試過睡覺 的地方,你不應該

但在代碼的唯一的睡眠是這樣

void doFiles(void) { 
    for (...) { // for each file in the file-system 
     ... // check database - do processing if needed 
    } 
    sleep(1); 
} 
int main(int argc, char *argv[], char *envp[]) { 
    while (true) doFiles(); 
    return -1; 
} 

代碼在對照數據庫檢查文件系統中的每個文件後,將會進入該睡眠狀態。由於新文件將不時添加,因此需要重複該過程。這段代碼中沒有多線程。除了誤放睡眠之外,還有其他可能的原因是「BUG:調度原子」嗎?

編輯:額外的錯誤輸出:

note: mirlin[1083] exited with preempt_count 1 
BUG: scheduling while atomic: mirlin/1083/0x40000002 
Modules linked in: g_cdc_ms musb_hdrc nop_usb_xceiv irqk edmak dm365mmap cmemk 
Backtrace: 
[<c002a5a0>] (dump_backtrace+0x0/0x110) from [<c028e56c>] (dump_stack+0x18/0x1c) 
r6:c1099460 r5:c04ea000 r4:00000000 r3:20000013 
[<c028e554>] (dump_stack+0x0/0x1c) from [<c00337b8>] (__schedule_bug+0x58/0x64) 
[<c0033760>] (__schedule_bug+0x0/0x64) from [<c028e864>] (schedule+0x84/0x378) 
r4:c10992c0 r3:00000000 
[<c028e7e0>] (schedule+0x0/0x378) from [<c0033a80>] (__cond_resched+0x28/0x38) 
[<c0033a58>] (__cond_resched+0x0/0x38) from [<c028ec6c>] (_cond_resched+0x34/0x44) 
r4:00013000 r3:00000001 
[<c028ec38>] (_cond_resched+0x0/0x44) from [<c0082f64>] (unmap_vmas+0x570/0x620) 
[<c00829f4>] (unmap_vmas+0x0/0x620) from [<c0085c10>] (exit_mmap+0xc0/0x1ec) 
[<c0085b50>] (exit_mmap+0x0/0x1ec) from [<c0037610>] (mmput+0x40/0xfc) 
r9:00000001 r8:80000005 r6:c04ea000 r5:00000000 r4:c0427300 
[<c00375d0>] (mmput+0x0/0xfc) from [<c003b5e4>] (exit_mm+0x150/0x158) 
r5:c10992c0 r4:c0427300 
[<c003b494>] (exit_mm+0x0/0x158) from [<c003cd44>] (do_exit+0x198/0x67c) 
r7:c03120d1 r6:c10992c0 r5:0000000b r4:c10992c0 
... 
+0

呵呵。是你的任何代碼內核代碼,就像你自己的內核模塊或任何東西?據我所知,所有的用戶空間代碼可以在任何時候「睡眠」...... – us2012 2013-02-15 21:15:38

+4

BUG:調度雖然原子與用戶級應用程序代碼無關。這是內核代碼,因此無論是內核分發的特定Linux內核,還是使用自定義配置的內核(如果已經這樣做了),或者使用了您所涉及的驅動程序/模塊 - 第三方標準,或者你自己的... – twalberg 2013-02-15 21:27:32

+0

@ us2012不可以。內核是linux-2.6.32.17-psp03.01.01.39,在'scheduling while atomic'消息標識的進程中沒有內核代碼。 – jacknad 2013-02-15 21:29:13

回答

-1

此錯誤是由不良構建引起的。 乾淨的構建本身並沒有幫助。 解決此問題需要全新結帳和構建。

2

正如其他人所說,你可以睡()任何時候你想在用戶代碼。

看起來像您平臺上的驅動程序出現問題。驅動程序可能實際上不會調用sleep()或schedule(),但通常它會調用內核函數,然後調用其中一個函數。

這看起來好像是在嵌入式TI ARM處理器上使用內存映射文件I/O。

相關問題