我正在写一个内核模块,我需要定期触发一个函数。该函数将访问队列并处理其元素。队列中元素的数量是动态的,因此处理时间也是如此。如果回调函数的处理时间是动态的,如何使用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不能在定时器回调中使用。如果你想在定时器回调的上下文中模拟一个长时间的执行(它有点类似于中断上下文),你应该使用一个活动循环足够长的时间。 –