Je travaille sur un projet universitaire et je dois comprendre l'utilisation de la file d'attente de travail de Linux. Pour cette raison, j'ai développé un petit module qui programme simplement l'exécution d'un travail sur une file d'attente personnalisée après 1000 jiffies. Cependant, lorsque le délai expire, le système est bloqué, je dois redémarrer la machine virtuelle et je ne peux collecter aucune information pour le débogage.

Voici les parties du code que j'utilise :

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

Si je demande rapidement (avant l'expiration de la minuterie) « dmesg » sur le shell, je peux lire « l'étape 1 », mais je ne peux pas utiliser le système. Je sais qu'il y a probablement un bogue de débutant dans le code mais je ne peux pas l'individualiser. Merci à tous pour votre aide.

0
Tommaso 19 févr. 2020 à 19:56

1 réponse

Meilleure réponse

Comme beaucoup d'autres fonctions du noyau Linux, queue_delayed_work s'attend à ce que son argument existe jusqu'à ce que le travail soit déclenché.

Cependant, vous passez à la fonction une variable locale (deferred_write) - qui a été détruite lorsque la fonction init_module revient.

Utilisez plutôt la variable globale.

0
Tsyvarev 19 févr. 2020 à 20:50