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

[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
...@@ -69,6 +69,18 @@ void kthread_bind(struct task_struct *k, unsigned int cpu); ...@@ -69,6 +69,18 @@ void kthread_bind(struct task_struct *k, unsigned int cpu);
* was never called. */ * was never called. */
int kthread_stop(struct task_struct *k); 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? * kthread_should_stop: should this kthread return now?
* *
......
...@@ -164,6 +164,12 @@ void kthread_bind(struct task_struct *k, unsigned int cpu) ...@@ -164,6 +164,12 @@ void kthread_bind(struct task_struct *k, unsigned int cpu)
EXPORT_SYMBOL(kthread_bind); EXPORT_SYMBOL(kthread_bind);
int kthread_stop(struct task_struct *k) 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; int ret;
...@@ -178,7 +184,10 @@ int kthread_stop(struct task_struct *k) ...@@ -178,7 +184,10 @@ int kthread_stop(struct task_struct *k)
/* Now set kthread_should_stop() to true, and wake it up. */ /* Now set kthread_should_stop() to true, and wake it up. */
kthread_stop_info.k = k; kthread_stop_info.k = k;
wake_up_process(k); if (s)
up(s);
else
wake_up_process(k);
put_task_struct(k); put_task_struct(k);
/* Once it dies, reset stop ptr, gather result and we're done. */ /* Once it dies, reset stop ptr, gather result and we're done. */
...@@ -189,7 +198,7 @@ int kthread_stop(struct task_struct *k) ...@@ -189,7 +198,7 @@ int kthread_stop(struct task_struct *k)
return ret; return ret;
} }
EXPORT_SYMBOL(kthread_stop); EXPORT_SYMBOL(kthread_stop_sem);
static __init int helper_init(void) static __init int helper_init(void)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment