Merge git://oss.sgi.com:8090/xfs-2.6
[linux-2.6] / include / linux / kthread.h
1 #ifndef _LINUX_KTHREAD_H
2 #define _LINUX_KTHREAD_H
3 /* Simple interface for creating and stopping kernel threads without mess. */
4 #include <linux/err.h>
5 #include <linux/sched.h>
6
7 /**
8  * kthread_create: create a kthread.
9  * @threadfn: the function to run until signal_pending(current).
10  * @data: data ptr for @threadfn.
11  * @namefmt: printf-style name for the thread.
12  *
13  * Description: This helper function creates and names a kernel
14  * thread.  The thread will be stopped: use wake_up_process() to start
15  * it.  See also kthread_run(), kthread_create_on_cpu().
16  *
17  * When woken, the thread will run @threadfn() with @data as its
18  * argument. @threadfn can either call do_exit() directly if it is a
19  * standalone thread for which noone will call kthread_stop(), or
20  * return when 'kthread_should_stop()' is true (which means
21  * kthread_stop() has been called).  The return value should be zero
22  * or a negative error number: it will be passed to kthread_stop().
23  *
24  * Returns a task_struct or ERR_PTR(-ENOMEM).
25  */
26 struct task_struct *kthread_create(int (*threadfn)(void *data),
27                                    void *data,
28                                    const char namefmt[], ...);
29
30 /**
31  * kthread_run: create and wake a thread.
32  * @threadfn: the function to run until signal_pending(current).
33  * @data: data ptr for @threadfn.
34  * @namefmt: printf-style name for the thread.
35  *
36  * Description: Convenient wrapper for kthread_create() followed by
37  * wake_up_process().  Returns the kthread, or ERR_PTR(-ENOMEM). */
38 #define kthread_run(threadfn, data, namefmt, ...)                          \
39 ({                                                                         \
40         struct task_struct *__k                                            \
41                 = kthread_create(threadfn, data, namefmt, ## __VA_ARGS__); \
42         if (!IS_ERR(__k))                                                  \
43                 wake_up_process(__k);                                      \
44         __k;                                                               \
45 })
46
47 /**
48  * kthread_bind: bind a just-created kthread to a cpu.
49  * @k: thread created by kthread_create().
50  * @cpu: cpu (might not be online, must be possible) for @k to run on.
51  *
52  * Description: This function is equivalent to set_cpus_allowed(),
53  * except that @cpu doesn't need to be online, and the thread must be
54  * stopped (ie. just returned from kthread_create().
55  */
56 void kthread_bind(struct task_struct *k, unsigned int cpu);
57
58 /**
59  * kthread_stop: stop a thread created by kthread_create().
60  * @k: thread created by kthread_create().
61  *
62  * Sets kthread_should_stop() for @k to return true, wakes it, and
63  * waits for it to exit.  Your threadfn() must not call do_exit()
64  * itself if you use this function!  This can also be called after
65  * kthread_create() instead of calling wake_up_process(): the thread
66  * will exit without calling threadfn().
67  *
68  * Returns the result of threadfn(), or -EINTR if wake_up_process()
69  * was never called. */
70 int kthread_stop(struct task_struct *k);
71
72 /**
73  * kthread_stop_sem: stop a thread created by kthread_create().
74  * @k: thread created by kthread_create().
75  * @s: semaphore that @k waits on while idle.
76  *
77  * Does essentially the same thing as kthread_stop() above, but wakes
78  * @k by calling up(@s).
79  *
80  * Returns the result of threadfn(), or -EINTR if wake_up_process()
81  * was never called. */
82 int kthread_stop_sem(struct task_struct *k, struct semaphore *s);
83
84 /**
85  * kthread_should_stop: should this kthread return now?
86  *
87  * When someone calls kthread_stop on your kthread, it will be woken
88  * and this will return true.  You should then return, and your return
89  * value will be passed through to kthread_stop().
90  */
91 int kthread_should_stop(void);
92
93 #endif /* _LINUX_KTHREAD_H */