Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 61e1a9ea authored by Alan Stern's avatar Alan Stern Committed by Linus Torvalds
Browse files

[PATCH] Add kthread_stop_sem()



Enhance the kthread API by adding kthread_stop_sem, for use in stopping
threads that spend their idle time waiting on a semaphore.

Signed-off-by: default avatarAlan Stern <stern@rowland.harvard.edu>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 83521d3e
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -69,6 +69,18 @@ void kthread_bind(struct task_struct *k, unsigned int cpu);
 * was never called. */
int kthread_stop(struct task_struct *k);

/**
 * kthread_stop_sem: stop a thread created by kthread_create().
 * @k: thread created by kthread_create().
 * @s: semaphore that @k waits on while idle.
 *
 * Does essentially the same thing as kthread_stop() above, but wakes
 * @k by calling up(@s).
 *
 * Returns the result of threadfn(), or -EINTR if wake_up_process()
 * was never called. */
int kthread_stop_sem(struct task_struct *k, struct semaphore *s);

/**
 * kthread_should_stop: should this kthread return now?
 *
+11 −2
Original line number Diff line number Diff line
@@ -164,6 +164,12 @@ void kthread_bind(struct task_struct *k, unsigned int cpu)
EXPORT_SYMBOL(kthread_bind);

int kthread_stop(struct task_struct *k)
{
	return kthread_stop_sem(k, NULL);
}
EXPORT_SYMBOL(kthread_stop);

int kthread_stop_sem(struct task_struct *k, struct semaphore *s)
{
	int ret;

@@ -178,6 +184,9 @@ int kthread_stop(struct task_struct *k)

	/* Now set kthread_should_stop() to true, and wake it up. */
	kthread_stop_info.k = k;
	if (s)
		up(s);
	else
		wake_up_process(k);
	put_task_struct(k);

@@ -189,7 +198,7 @@ int kthread_stop(struct task_struct *k)

	return ret;
}
EXPORT_SYMBOL(kthread_stop);
EXPORT_SYMBOL(kthread_stop_sem);

static __init int helper_init(void)
{