xref: /linux-6.15/include/linux/kthread.h (revision 4e57b681)
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 */
94