首页 > 解决方案 > 安排延迟工作时系统阻塞

问题描述

我正在做一个学术项目,我必须了解 linux 工作队列的用法。出于这个原因,我开发了一个小模块,它可以在 1000 次 jiffies 之后简单地安排在自定义工作队列上执行工作。但是,当超时到期时,系统被阻止,我需要重新启动 VM,并且我无法收集任何信息进行调试。

这些是我正在使用的代码部分:

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”,我可以阅读“第 1 步”打印但我无法使用系统。我知道代码中可能存在初学者错误,但我无法对其进行个体化。谢谢大家的帮助。

标签: linuxmodulekernelworkqueue

解决方案


与 Linux 内核中的许多其他函数一样,queue_delayed_work它期望其参数存在,直到工作被触发。

但是,您向函数传递了一个局部变量( ) -当函数返回时deferred_write,该变量已被销毁。init_module

改用全局变量。


推荐阅读