[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: Alan Stern <stern@rowland.harvard.edu> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
83521d3eb8
commit
61e1a9ea4b
2 changed files with 23 additions and 2 deletions
|
@ -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)
|
||||||
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)
|
||||||
|
|
||||||
/* 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)
|
||||||
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue