kthread_stop always returning -EINTR?
valdis.kletnieks at vt.edu
valdis.kletnieks at vt.edu
Tue Jul 18 13:55:12 EDT 2017
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.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 486 bytes
Desc: not available
Url : http://lists.kernelnewbies.org/pipermail/kernelnewbies/attachments/20170718/0074b7d3/attachment.bin
More information about the Kernelnewbies
mailing list