安排延迟工作时系统阻塞
System blocked when delayed work is schedulated
我正在从事一个学术项目,我必须了解 linux 的工作队列的用法。
出于这个原因,我开发了一个小模块,可以简单地安排在 1000 jiffies 之后在自定义工作队列上执行工作。
但是,当超时到期时,系统被阻塞,我需要重新启动虚拟机并且我无法收集任何信息进行调试。
这些是我正在使用的部分代码:
static void enqueue_message(struct work_struct *work){
printk("%s: Step 2\n", MODULE_NAME);
return;
}
int init_module(void){
struct workqueue_struct *workqueue;
struct delayed_work deferred_write;
workqueue = alloc_workqueue("pending_writes",WQ_MEM_RECLAIM, 0);
INIT_DELAYED_WORK(&deferred_write, enqueue_message);
queue_delayed_work(workqueue, &deferred_write, 1000);
printk("%s: Step 1\n", MODULE_NAME);
return 0;
}
如果我快速(在计时器到期之前)在 shell 上请求 'dmesg',我可以阅读 'the Step 1' 打印,但我无法使用该系统。
我知道代码中可能存在初学者错误,但我无法区分它。
谢谢大家的帮助。
与 Linux 内核中的许多其他函数一样,queue_delayed_work
期望它的参数 存在 直到工作被触发。
但是,您向函数传递了一个 局部变量 (deferred_write
) - 当 [=12] 时它已被 销毁 =] 函数 returns.
改用全局变量。
我正在从事一个学术项目,我必须了解 linux 的工作队列的用法。 出于这个原因,我开发了一个小模块,可以简单地安排在 1000 jiffies 之后在自定义工作队列上执行工作。 但是,当超时到期时,系统被阻塞,我需要重新启动虚拟机并且我无法收集任何信息进行调试。
这些是我正在使用的部分代码:
static void enqueue_message(struct work_struct *work){
printk("%s: Step 2\n", MODULE_NAME);
return;
}
int init_module(void){
struct workqueue_struct *workqueue;
struct delayed_work deferred_write;
workqueue = alloc_workqueue("pending_writes",WQ_MEM_RECLAIM, 0);
INIT_DELAYED_WORK(&deferred_write, enqueue_message);
queue_delayed_work(workqueue, &deferred_write, 1000);
printk("%s: Step 1\n", MODULE_NAME);
return 0;
}
如果我快速(在计时器到期之前)在 shell 上请求 'dmesg',我可以阅读 'the Step 1' 打印,但我无法使用该系统。 我知道代码中可能存在初学者错误,但我无法区分它。 谢谢大家的帮助。
与 Linux 内核中的许多其他函数一样,queue_delayed_work
期望它的参数 存在 直到工作被触发。
但是,您向函数传递了一个 局部变量 (deferred_write
) - 当 [=12] 时它已被 销毁 =] 函数 returns.
改用全局变量。