kthread_stop always returning -EINTR?
valdis.kletnieks at vt.edu
valdis.kletnieks at vt.edu
Tue Jul 18 14:46:23 EDT 2017
On Tue, 18 Jul 2017 15:13:08 -0300, Martin Galvan said:
> I thought kthread_create/bind don't actually run the thread function?
> At least that's what the comment says.
It's the wake_up_process() that causes the problem...
> > * 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.
>
> Yeah, my bad. I'm guessing I should've just returned zero?
That's not the problem. The problem is the task_struct went away when
you called do_exit(), and it can do so in between the two lines wake_up_process()
and kthread_stop(). Classic race condition.
> > 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'.
>
> Would it be worth it to send out a patch to add some error checking?
> I'd be happy to fix this.
It will be NAK'ed *really* fast. It's assumed that kernel programmers know
what they're doing, so if their kernel breaks because they call kthread_stop()
on a non-existent thread, it's their own fault. It *tells* you flat out:
* If threadfn() may call do_exit() itself, the caller must ensure
* task_struct can't go away.
> > Two important kernel concepts: Locking and reference counting. Use them wisely.
>
> Will do, though I'm not sure how those would apply here since (AFAIK)
> there are no variables shared between the threads.
It's not variables shared between the threads. What you're doing here is more
the equivalent of returning the address of a variable in the stack:
int *dont_do_this()
{
int a;
return (&a);
}
Except here, it's not an int, it's a whole task_struct that you're doing a
use-after-release.
-------------- 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/26dec180/attachment.bin
More information about the Kernelnewbies
mailing list