Search code examples
linuxmodulekernelworkqueue

System blocked when delayed work is schedulated


i'm working on an accademic project and i have to understand the usage of linux's workqueue. For this reason i've developed a small module that simply schedule the execution of a work on a custom workqueue after 1000 jiffies. However, when the timeout expires, the system is blocked, i need to restart the VM and i can't collect any info for debug.

These are the portions of the code i'm using:

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;
}

If i quickly (before timer expiration) ask for 'dmesg' on shell, i can read 'the Step 1' print but then i can't use the system. I know probably there is a beginner bug in the code but i can't individuate it. Thanks everybody for the help.


Solution

  • Like many other functions in the Linux kernel, queue_delayed_work expects its argument to exist until the work will be triggered.

    However, you pass the function a local variable (deferred_write) - which has been destroyed when init_module function returns.

    Use global variable instead.