Se si guarda come kthread()
è implemented, alla riga 209 chiama threadfn(data)
e memorizza il codice di uscita in ret
; quindi chiama do_exit(ret)
.
Quindi un semplice ritorno dal tuo threadfn
è sufficiente.
Se si guarda la documentazione di kthread_stop, si dice che:
- set
kthread_should_stop
al return true;
- riattiva il thread;
- attende il thread per uscire.
Ciò significa che kthread_stop()
deve essere chiamato dall'esterno di un thread per interrompere il thread. Dal momento che aspetta che il thread finisca, non devi chiamarlo all'interno del thread o potresti bloccarlo!
Inoltre, la documentazione dice che informa solo il thread che dovrebbe uscire, e che il thread dovrebbe chiamare kthread_should_stop
per scoprirlo. Quindi, una lunga durata threadfn
potrebbe fare questo:
int thread_fn() {
printk(KERN_INFO "In thread1");
while (!kthread_should_stop()) {
get_some_work_to_do_or_block();
if (have_work_to_do())
do_work();
}
return 0;
}
Ma se la funzione non è longevo, chiamando kthread_should_stop
non è necessario.
Immagino che dovresti essere in grado di dire guardando il codice che avvia un thread e vedendo se imposta lo stack del thread con un indirizzo di ritorno che andrebbe in qualche modo sano di mente. –