我正在寫一個內核模塊,我需要定期觸發一個函數。該函數將訪問隊列並處理其元素。隊列中元素的數量是動態的,因此處理時間也是如此。如果回調函數的處理時間是動態的,如何使用hrtimer?
在下面的代碼中,我添加了1ms睡眠來表示處理時間。我得到這個錯誤:[116588.117966] BUG: scheduling while atomic: systemd-journal/408/0x00010000
。如果我的理解是正確的,那麼發生這種情況是因爲當hr_timer的失效時間僅爲1us時,我試圖睡1ms。我可以增加這個到期時間,但是隊列的處理時間有時可能超過秒,有時甚至是幾小時。請幫我實現這一點。
unsigned long timer_interval_ns = 1e3;
static struct hrtimer hr_timer;
enum hrtimer_restart timer_callback(struct hrtimer *timer_for_restart)
{
uint64_t rawtime;
struct timespec curtime;
ktime_t currtime , interval;
/* My Operations would take ~ 1ms, so adding 1ms for simplicity*/
msleep(1);
currtime = ktime_get();
interval = ktime_set(0,timer_interval_ns);
hrtimer_forward(timer_for_restart, currtime, interval);
return HRTIMER_RESTART;
}
static int __init timer_init(void) {
ktime_t ktime = ktime_set(0, timer_interval_ns);
hrtimer_init(&hr_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
hr_timer.function = &timer_callback;
hrtimer_start(&hr_timer, ktime, HRTIMER_MODE_REL);
return 0;
}
「計劃,而原子」 表示你已經嘗試找個地方睡覺,你不應該 - 像內自旋鎖保護關鍵部分或**中斷處理程序**。 – LPs
@LPs,那麼你有什麼想法爲什麼上面的簡單代碼會拋出這樣的錯誤 – Karthik
我的猜測是,msleep不能在定時器回調中使用。如果你想在定時器回調的上下文中模擬一個長時間的執行(它有點類似於中斷上下文),你應該使用一個活動循環足夠長的時間。 –