J'écris un code pour le module noyau Linux et j'y vois un comportement étrange. Voici mon code:Comportement étrange de printk dans le module noyau Linux
int data = 0;
void threadfn1()
{
int j;
for(j = 0; j < 10; j++)
printk(KERN_INFO "I AM THREAD 1 %d\n",j);
data++;
}
void threadfn2()
{
int j;
for(j = 0; j < 10; j++)
printk(KERN_INFO "I AM THREAD 2 %d\n",j);
data++;
}
static int __init abc_init(void)
{
struct task_struct *t1 = kthread_run(threadfn1, NULL, "thread1");
struct task_struct *t2 = kthread_run(threadfn2, NULL, "thread2");
while(1)
{
printk("debug\n"); // runs ok
if(data >= 2)
{
kthread_stop(t1);
kthread_stop(t2);
break;
}
}
printk(KERN_INFO "HELLO WORLD\n");
}
Fondamentalement, je tentais d'attendre les discussions pour terminer, puis imprimer quelque chose après. Le code ci-dessus n'atteint cette cible mais avec "printk("debug\n");"
pas commenté. Dès que je commente printk("debug\n");
pour exécuter le code sans débogage et charger le module via la commande insmod, le module se bloque et il semble qu'il se perd dans la récursivité. Je ne sais pas pourquoi printk affecte mon code d'une telle manière?
Toute aide serait appréciée.
ce qui concerne.
volatile fonctionnerait quelque peu, mais c'est toujours une mauvaise idée car vous ne pouvez pas vous assurer que data ++ est une instruction atomique. Sur un système multiprocesseur avec plusieurs threads luttant pour la même variable, cela vous garantit une condition de course garantie. –
Grand point. Ne pas utiliser volatile ici. Besoin de plus de café. ;-) –