安排延迟工作时系统阻塞

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.

改用全局变量。