On Tue, 18 Jul 2017 13:00:11 -0300, Martin Galvan said: > Hi everyone! I'm doing a bit of testing on the Linux kthread functions, and h > int function(void *data) > { > printk(KERN_DEBUG "CPU: %u\n", smp_processor_id()); > > do_exit(0); /* Not sure if this is ok */ > } Note that this will go bye-bye pretty much immediately. > /* Start the thread */ > wake_up_process(thread); Aaannnd... it's possibly gone already, before you get to the next line of code.. > /* Wait for the thread function to complete */ > result = kthread_stop(thread); So it's going to be hard to stop a thread that's not there anymore. Note this comment from kernel/kthreads.c: /** * kthread_stop - stop a thread created by kthread_create(). * @k: thread created by kthread_create(). * * Sets kthread_should_stop() for @k to return true, wakes it, and * waits for it to exit. This can also be called after kthread_create() * instead of calling wake_up_process(): the thread will exit without * calling threadfn(). * * If threadfn() may call do_exit() itself, the caller must ensure * task_struct can't go away. Your function calls do_exit() itself. It's surprising that your kernel didn't explode when the tasx_struct went away. Looking at the code of kthread_stop, there's phenomenally little error checking (as most heavily-called kernel functions tend to be). It just assumes that 'thread' points at a valid thread structure and runs with it, with the result that you get back possibly random trash as 'result'. Two important kernel concepts: Locking and reference counting. Use them wisely.
Attachment:
pgpr8Ol9cAS4Q.pgp
Description: PGP signature
_______________________________________________ Kernelnewbies mailing list Kernelnewbies@xxxxxxxxxxxxxxxxx https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies