Система заблокирована при отложенной работе - PullRequest
0 голосов
/ 19 февраля 2020

Я работаю над проектом accademi c, и я должен понимать использование рабочей очереди linux. По этой причине я разработал небольшой модуль, который просто планирует выполнение работы над пользовательской задачей после 1000 циклов. Однако по истечении времени ожидания система блокируется, мне нужно перезапустить виртуальную машину, и я не могу собрать какую-либо информацию для отладки.

Это части кода, которые я использую:

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

Если я быстро (до истечения срока действия таймера) запрашиваю «dmesg» на оболочке, я могу прочитать распечатку «Шаг 1», но затем я не могу использовать систему. Я знаю, что, возможно, в коде есть ошибка новичка, но я не могу ее индивидуализировать. Спасибо всем за помощь.

1 Ответ

0 голосов
/ 19 февраля 2020

Как и многие другие функции в ядре Linux, queue_delayed_work ожидает, что аргумент существует до тех пор, пока работа не будет запущена.

Однако вы передаете функцию a локальная переменная (deferred_write) - которая была уничтожена при возврате функции init_module.

Используйте взамен global переменную.

...