xref: /linux-6.15/kernel/kthread.c (revision 8fa7292f)
1457c8996SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
21da177e4SLinus Torvalds /* Kernel thread helper functions.
31da177e4SLinus Torvalds  *   Copyright (C) 2004 IBM Corporation, Rusty Russell.
49bf5b9ebSChristoph Hellwig  *   Copyright (C) 2009 Red Hat, Inc.
51da177e4SLinus Torvalds  *
673c27992SEric W. Biederman  * Creation is done via kthreadd, so that we get a clean environment
71da177e4SLinus Torvalds  * even if we're invoked from userspace (think modprobe, hotplug cpu,
81da177e4SLinus Torvalds  * etc.).
91da177e4SLinus Torvalds  */
10ae7e81c0SIngo Molnar #include <uapi/linux/sched/types.h>
119bf5b9ebSChristoph Hellwig #include <linux/mm.h>
129bf5b9ebSChristoph Hellwig #include <linux/mmu_context.h>
131da177e4SLinus Torvalds #include <linux/sched.h>
149bf5b9ebSChristoph Hellwig #include <linux/sched/mm.h>
1529930025SIngo Molnar #include <linux/sched/task.h>
161da177e4SLinus Torvalds #include <linux/kthread.h>
171da177e4SLinus Torvalds #include <linux/completion.h>
181da177e4SLinus Torvalds #include <linux/err.h>
198af0c18aSSuren Baghdasaryan #include <linux/cgroup.h>
2058568d2aSMiao Xie #include <linux/cpuset.h>
211da177e4SLinus Torvalds #include <linux/unistd.h>
221da177e4SLinus Torvalds #include <linux/file.h>
239984de1aSPaul Gortmaker #include <linux/export.h>
2497d1f15bSArjan van de Ven #include <linux/mutex.h>
25b56c0d89STejun Heo #include <linux/slab.h>
26b56c0d89STejun Heo #include <linux/freezer.h>
27a74fb73cSAl Viro #include <linux/ptrace.h>
28cd42d559STejun Heo #include <linux/uaccess.h>
2998fa15f3SAnshuman Khandual #include <linux/numa.h>
309cc5b865SMarcelo Tosatti #include <linux/sched/isolation.h>
31ad8d75ffSSteven Rostedt #include <trace/events/sched.h>
321da177e4SLinus Torvalds 
339bf5b9ebSChristoph Hellwig 
3473c27992SEric W. Biederman static DEFINE_SPINLOCK(kthread_create_lock);
3573c27992SEric W. Biederman static LIST_HEAD(kthread_create_list);
3673c27992SEric W. Biederman struct task_struct *kthreadd_task;
371da177e4SLinus Torvalds 
38d1a89197SFrederic Weisbecker static LIST_HEAD(kthreads_hotplug);
39d1a89197SFrederic Weisbecker static DEFINE_MUTEX(kthreads_hotplug_lock);
40d1a89197SFrederic Weisbecker 
411da177e4SLinus Torvalds struct kthread_create_info
421da177e4SLinus Torvalds {
4373c27992SEric W. Biederman 	/* Information passed to kthread() from kthreadd. */
4473e0c116SMike Christie 	char *full_name;
451da177e4SLinus Torvalds 	int (*threadfn)(void *data);
461da177e4SLinus Torvalds 	void *data;
47207205a2SEric Dumazet 	int node;
481da177e4SLinus Torvalds 
4973c27992SEric W. Biederman 	/* Result passed back to kthread_create() from kthreadd. */
501da177e4SLinus Torvalds 	struct task_struct *result;
51786235eeSTetsuo Handa 	struct completion *done;
5265f27f38SDavid Howells 
5373c27992SEric W. Biederman 	struct list_head list;
541da177e4SLinus Torvalds };
551da177e4SLinus Torvalds 
5663706172SOleg Nesterov struct kthread {
572a1d4460SThomas Gleixner 	unsigned long flags;
582a1d4460SThomas Gleixner 	unsigned int cpu;
59d1a89197SFrederic Weisbecker 	unsigned int node;
605eacb68aSFrederic Weisbecker 	int started;
616b124879SEric W. Biederman 	int result;
6252782c92SJ. Bruce Fields 	int (*threadfn)(void *);
6382805ab7STejun Heo 	void *data;
642a1d4460SThomas Gleixner 	struct completion parked;
6563706172SOleg Nesterov 	struct completion exited;
660b508bc9SShaohua Li #ifdef CONFIG_BLK_CGROUP
6705e3db95SShaohua Li 	struct cgroup_subsys_state *blkcg_css;
6805e3db95SShaohua Li #endif
69d6986ce2SYafang Shao 	/* To store the full name if task comm is truncated. */
70d6986ce2SYafang Shao 	char *full_name;
71d1a89197SFrederic Weisbecker 	struct task_struct *task;
72d1a89197SFrederic Weisbecker 	struct list_head hotplug_node;
734d13f430SFrederic Weisbecker 	struct cpumask *preferred_affinity;
741da177e4SLinus Torvalds };
751da177e4SLinus Torvalds 
762a1d4460SThomas Gleixner enum KTHREAD_BITS {
772a1d4460SThomas Gleixner 	KTHREAD_IS_PER_CPU = 0,
782a1d4460SThomas Gleixner 	KTHREAD_SHOULD_STOP,
792a1d4460SThomas Gleixner 	KTHREAD_SHOULD_PARK,
802a1d4460SThomas Gleixner };
812a1d4460SThomas Gleixner 
to_kthread(struct task_struct * k)824ecdafc8SOleg Nesterov static inline struct kthread *to_kthread(struct task_struct *k)
834ecdafc8SOleg Nesterov {
841da5c46fSOleg Nesterov 	WARN_ON(!(k->flags & PF_KTHREAD));
85e32cf5dfSEric W. Biederman 	return k->worker_private;
864ecdafc8SOleg Nesterov }
874ecdafc8SOleg Nesterov 
883a7956e2SPeter Zijlstra /*
893a7956e2SPeter Zijlstra  * Variant of to_kthread() that doesn't assume @p is a kthread.
903a7956e2SPeter Zijlstra  *
913a7956e2SPeter Zijlstra  * Per construction; when:
923a7956e2SPeter Zijlstra  *
93e32cf5dfSEric W. Biederman  *   (p->flags & PF_KTHREAD) && p->worker_private
943a7956e2SPeter Zijlstra  *
953a7956e2SPeter Zijlstra  * the task is both a kthread and struct kthread is persistent. However
963a7956e2SPeter Zijlstra  * PF_KTHREAD on it's own is not, kernel_thread() can exec() (See umh.c and
973a7956e2SPeter Zijlstra  * begin_new_exec()).
983a7956e2SPeter Zijlstra  */
__to_kthread(struct task_struct * p)993a7956e2SPeter Zijlstra static inline struct kthread *__to_kthread(struct task_struct *p)
1003a7956e2SPeter Zijlstra {
101e32cf5dfSEric W. Biederman 	void *kthread = p->worker_private;
1023a7956e2SPeter Zijlstra 	if (kthread && !(p->flags & PF_KTHREAD))
1033a7956e2SPeter Zijlstra 		kthread = NULL;
1043a7956e2SPeter Zijlstra 	return kthread;
1053a7956e2SPeter Zijlstra }
1063a7956e2SPeter Zijlstra 
get_kthread_comm(char * buf,size_t buf_size,struct task_struct * tsk)107d6986ce2SYafang Shao void get_kthread_comm(char *buf, size_t buf_size, struct task_struct *tsk)
108d6986ce2SYafang Shao {
109d6986ce2SYafang Shao 	struct kthread *kthread = to_kthread(tsk);
110d6986ce2SYafang Shao 
111d6986ce2SYafang Shao 	if (!kthread || !kthread->full_name) {
1124cc0473dSYafang Shao 		strscpy(buf, tsk->comm, buf_size);
113d6986ce2SYafang Shao 		return;
114d6986ce2SYafang Shao 	}
115d6986ce2SYafang Shao 
116d6986ce2SYafang Shao 	strscpy_pad(buf, kthread->full_name, buf_size);
117d6986ce2SYafang Shao }
118d6986ce2SYafang Shao 
set_kthread_struct(struct task_struct * p)11940966e31SEric W. Biederman bool set_kthread_struct(struct task_struct *p)
12000b89fe0SValentin Schneider {
12100b89fe0SValentin Schneider 	struct kthread *kthread;
12200b89fe0SValentin Schneider 
12340966e31SEric W. Biederman 	if (WARN_ON_ONCE(to_kthread(p)))
12440966e31SEric W. Biederman 		return false;
12500b89fe0SValentin Schneider 
12600b89fe0SValentin Schneider 	kthread = kzalloc(sizeof(*kthread), GFP_KERNEL);
12740966e31SEric W. Biederman 	if (!kthread)
12840966e31SEric W. Biederman 		return false;
12940966e31SEric W. Biederman 
13040966e31SEric W. Biederman 	init_completion(&kthread->exited);
13140966e31SEric W. Biederman 	init_completion(&kthread->parked);
132d1a89197SFrederic Weisbecker 	INIT_LIST_HEAD(&kthread->hotplug_node);
13340966e31SEric W. Biederman 	p->vfork_done = &kthread->exited;
13440966e31SEric W. Biederman 
135d1a89197SFrederic Weisbecker 	kthread->task = p;
136d1a89197SFrederic Weisbecker 	kthread->node = tsk_fork_get_node(current);
137e32cf5dfSEric W. Biederman 	p->worker_private = kthread;
13840966e31SEric W. Biederman 	return true;
13900b89fe0SValentin Schneider }
14000b89fe0SValentin Schneider 
free_kthread_struct(struct task_struct * k)1411da5c46fSOleg Nesterov void free_kthread_struct(struct task_struct *k)
1421da5c46fSOleg Nesterov {
14305e3db95SShaohua Li 	struct kthread *kthread;
14405e3db95SShaohua Li 
1451da5c46fSOleg Nesterov 	/*
14640966e31SEric W. Biederman 	 * Can be NULL if kmalloc() in set_kthread_struct() failed.
1471da5c46fSOleg Nesterov 	 */
14805e3db95SShaohua Li 	kthread = to_kthread(k);
149d6986ce2SYafang Shao 	if (!kthread)
150d6986ce2SYafang Shao 		return;
151d6986ce2SYafang Shao 
1520b508bc9SShaohua Li #ifdef CONFIG_BLK_CGROUP
153d6986ce2SYafang Shao 	WARN_ON_ONCE(kthread->blkcg_css);
15405e3db95SShaohua Li #endif
155e32cf5dfSEric W. Biederman 	k->worker_private = NULL;
156d6986ce2SYafang Shao 	kfree(kthread->full_name);
15705e3db95SShaohua Li 	kfree(kthread);
1581da5c46fSOleg Nesterov }
1591da5c46fSOleg Nesterov 
1609e37bd30SRandy Dunlap /**
1619e37bd30SRandy Dunlap  * kthread_should_stop - should this kthread return now?
1629e37bd30SRandy Dunlap  *
16372fd4a35SRobert P. J. Day  * When someone calls kthread_stop() on your kthread, it will be woken
1649e37bd30SRandy Dunlap  * and this will return true.  You should then return, and your return
1659e37bd30SRandy Dunlap  * value will be passed through to kthread_stop().
1669e37bd30SRandy Dunlap  */
kthread_should_stop(void)1672a1d4460SThomas Gleixner bool kthread_should_stop(void)
1681da177e4SLinus Torvalds {
1692a1d4460SThomas Gleixner 	return test_bit(KTHREAD_SHOULD_STOP, &to_kthread(current)->flags);
1701da177e4SLinus Torvalds }
1711da177e4SLinus Torvalds EXPORT_SYMBOL(kthread_should_stop);
1721da177e4SLinus Torvalds 
__kthread_should_park(struct task_struct * k)173be33db21SGreg Kroah-Hartman static bool __kthread_should_park(struct task_struct *k)
1740121805dSMatthias Kaehlcke {
1750121805dSMatthias Kaehlcke 	return test_bit(KTHREAD_SHOULD_PARK, &to_kthread(k)->flags);
1760121805dSMatthias Kaehlcke }
1770121805dSMatthias Kaehlcke 
17882805ab7STejun Heo /**
1792a1d4460SThomas Gleixner  * kthread_should_park - should this kthread park now?
1802a1d4460SThomas Gleixner  *
1812a1d4460SThomas Gleixner  * When someone calls kthread_park() on your kthread, it will be woken
1822a1d4460SThomas Gleixner  * and this will return true.  You should then do the necessary
1832a1d4460SThomas Gleixner  * cleanup and call kthread_parkme()
1842a1d4460SThomas Gleixner  *
1852a1d4460SThomas Gleixner  * Similar to kthread_should_stop(), but this keeps the thread alive
1862a1d4460SThomas Gleixner  * and in a park position. kthread_unpark() "restarts" the thread and
1872a1d4460SThomas Gleixner  * calls the thread function again.
1882a1d4460SThomas Gleixner  */
kthread_should_park(void)1892a1d4460SThomas Gleixner bool kthread_should_park(void)
1902a1d4460SThomas Gleixner {
1910121805dSMatthias Kaehlcke 	return __kthread_should_park(current);
1922a1d4460SThomas Gleixner }
19318896451SDavid Kershner EXPORT_SYMBOL_GPL(kthread_should_park);
1942a1d4460SThomas Gleixner 
kthread_should_stop_or_park(void)195ef73d6a4SArve Hjønnevåg bool kthread_should_stop_or_park(void)
196ef73d6a4SArve Hjønnevåg {
197ef73d6a4SArve Hjønnevåg 	struct kthread *kthread = __to_kthread(current);
198ef73d6a4SArve Hjønnevåg 
199ef73d6a4SArve Hjønnevåg 	if (!kthread)
200ef73d6a4SArve Hjønnevåg 		return false;
201ef73d6a4SArve Hjønnevåg 
202ef73d6a4SArve Hjønnevåg 	return kthread->flags & (BIT(KTHREAD_SHOULD_STOP) | BIT(KTHREAD_SHOULD_PARK));
203ef73d6a4SArve Hjønnevåg }
204ef73d6a4SArve Hjønnevåg 
2052a1d4460SThomas Gleixner /**
2068a32c441STejun Heo  * kthread_freezable_should_stop - should this freezable kthread return now?
2078a32c441STejun Heo  * @was_frozen: optional out parameter, indicates whether %current was frozen
2088a32c441STejun Heo  *
2098a32c441STejun Heo  * kthread_should_stop() for freezable kthreads, which will enter
2108a32c441STejun Heo  * refrigerator if necessary.  This function is safe from kthread_stop() /
2118a32c441STejun Heo  * freezer deadlock and freezable kthreads should use this function instead
2128a32c441STejun Heo  * of calling try_to_freeze() directly.
2138a32c441STejun Heo  */
kthread_freezable_should_stop(bool * was_frozen)2148a32c441STejun Heo bool kthread_freezable_should_stop(bool *was_frozen)
2158a32c441STejun Heo {
2168a32c441STejun Heo 	bool frozen = false;
2178a32c441STejun Heo 
2188a32c441STejun Heo 	might_sleep();
2198a32c441STejun Heo 
2208a32c441STejun Heo 	if (unlikely(freezing(current)))
2218a32c441STejun Heo 		frozen = __refrigerator(true);
2228a32c441STejun Heo 
2238a32c441STejun Heo 	if (was_frozen)
2248a32c441STejun Heo 		*was_frozen = frozen;
2258a32c441STejun Heo 
2268a32c441STejun Heo 	return kthread_should_stop();
2278a32c441STejun Heo }
2288a32c441STejun Heo EXPORT_SYMBOL_GPL(kthread_freezable_should_stop);
2298a32c441STejun Heo 
2308a32c441STejun Heo /**
23152782c92SJ. Bruce Fields  * kthread_func - return the function specified on kthread creation
23252782c92SJ. Bruce Fields  * @task: kthread task in question
23352782c92SJ. Bruce Fields  *
23452782c92SJ. Bruce Fields  * Returns NULL if the task is not a kthread.
23552782c92SJ. Bruce Fields  */
kthread_func(struct task_struct * task)23652782c92SJ. Bruce Fields void *kthread_func(struct task_struct *task)
23752782c92SJ. Bruce Fields {
2383a7956e2SPeter Zijlstra 	struct kthread *kthread = __to_kthread(task);
2393a7956e2SPeter Zijlstra 	if (kthread)
2403a7956e2SPeter Zijlstra 		return kthread->threadfn;
24152782c92SJ. Bruce Fields 	return NULL;
24252782c92SJ. Bruce Fields }
24352782c92SJ. Bruce Fields EXPORT_SYMBOL_GPL(kthread_func);
24452782c92SJ. Bruce Fields 
24552782c92SJ. Bruce Fields /**
24682805ab7STejun Heo  * kthread_data - return data value specified on kthread creation
24782805ab7STejun Heo  * @task: kthread task in question
24882805ab7STejun Heo  *
24982805ab7STejun Heo  * Return the data value specified when kthread @task was created.
25082805ab7STejun Heo  * The caller is responsible for ensuring the validity of @task when
25182805ab7STejun Heo  * calling this function.
25282805ab7STejun Heo  */
kthread_data(struct task_struct * task)25382805ab7STejun Heo void *kthread_data(struct task_struct *task)
25482805ab7STejun Heo {
25582805ab7STejun Heo 	return to_kthread(task)->data;
25682805ab7STejun Heo }
25752782c92SJ. Bruce Fields EXPORT_SYMBOL_GPL(kthread_data);
25882805ab7STejun Heo 
259cd42d559STejun Heo /**
260e700591aSPetr Mladek  * kthread_probe_data - speculative version of kthread_data()
261cd42d559STejun Heo  * @task: possible kthread task in question
262cd42d559STejun Heo  *
263cd42d559STejun Heo  * @task could be a kthread task.  Return the data value specified when it
264cd42d559STejun Heo  * was created if accessible.  If @task isn't a kthread task or its data is
265cd42d559STejun Heo  * inaccessible for any reason, %NULL is returned.  This function requires
266cd42d559STejun Heo  * that @task itself is safe to dereference.
267cd42d559STejun Heo  */
kthread_probe_data(struct task_struct * task)268e700591aSPetr Mladek void *kthread_probe_data(struct task_struct *task)
269cd42d559STejun Heo {
2703a7956e2SPeter Zijlstra 	struct kthread *kthread = __to_kthread(task);
271cd42d559STejun Heo 	void *data = NULL;
272cd42d559STejun Heo 
2733a7956e2SPeter Zijlstra 	if (kthread)
274fe557319SChristoph Hellwig 		copy_from_kernel_nofault(&data, &kthread->data, sizeof(data));
275cd42d559STejun Heo 	return data;
276cd42d559STejun Heo }
277cd42d559STejun Heo 
__kthread_parkme(struct kthread * self)2782a1d4460SThomas Gleixner static void __kthread_parkme(struct kthread *self)
2792a1d4460SThomas Gleixner {
280741a76b3SPeter Zijlstra 	for (;;) {
2811cef1150SPeter Zijlstra 		/*
2821cef1150SPeter Zijlstra 		 * TASK_PARKED is a special state; we must serialize against
2831cef1150SPeter Zijlstra 		 * possible pending wakeups to avoid store-store collisions on
2841cef1150SPeter Zijlstra 		 * task->state.
2851cef1150SPeter Zijlstra 		 *
2861cef1150SPeter Zijlstra 		 * Such a collision might possibly result in the task state
2871cef1150SPeter Zijlstra 		 * changin from TASK_PARKED and us failing the
2881cef1150SPeter Zijlstra 		 * wait_task_inactive() in kthread_park().
2891cef1150SPeter Zijlstra 		 */
2901cef1150SPeter Zijlstra 		set_special_state(TASK_PARKED);
291741a76b3SPeter Zijlstra 		if (!test_bit(KTHREAD_SHOULD_PARK, &self->flags))
292741a76b3SPeter Zijlstra 			break;
2931cef1150SPeter Zijlstra 
29426c7295bSLiang Chen 		/*
29526c7295bSLiang Chen 		 * Thread is going to call schedule(), do not preempt it,
29626c7295bSLiang Chen 		 * or the caller of kthread_park() may spend more time in
29726c7295bSLiang Chen 		 * wait_task_inactive().
29826c7295bSLiang Chen 		 */
29926c7295bSLiang Chen 		preempt_disable();
300f83ee19bSPeter Zijlstra 		complete(&self->parked);
30126c7295bSLiang Chen 		schedule_preempt_disabled();
30226c7295bSLiang Chen 		preempt_enable();
3032a1d4460SThomas Gleixner 	}
3042a1d4460SThomas Gleixner 	__set_current_state(TASK_RUNNING);
3052a1d4460SThomas Gleixner }
3062a1d4460SThomas Gleixner 
kthread_parkme(void)3072a1d4460SThomas Gleixner void kthread_parkme(void)
3082a1d4460SThomas Gleixner {
3092a1d4460SThomas Gleixner 	__kthread_parkme(to_kthread(current));
3102a1d4460SThomas Gleixner }
31118896451SDavid Kershner EXPORT_SYMBOL_GPL(kthread_parkme);
3122a1d4460SThomas Gleixner 
313bbda86e9SEric W. Biederman /**
314bbda86e9SEric W. Biederman  * kthread_exit - Cause the current kthread return @result to kthread_stop().
315bbda86e9SEric W. Biederman  * @result: The integer value to return to kthread_stop().
316bbda86e9SEric W. Biederman  *
317bbda86e9SEric W. Biederman  * While kthread_exit can be called directly, it exists so that
318bbda86e9SEric W. Biederman  * functions which do some additional work in non-modular code such as
319bbda86e9SEric W. Biederman  * module_put_and_kthread_exit can be implemented.
320bbda86e9SEric W. Biederman  *
321bbda86e9SEric W. Biederman  * Does not return.
322bbda86e9SEric W. Biederman  */
kthread_exit(long result)323bbda86e9SEric W. Biederman void __noreturn kthread_exit(long result)
324bbda86e9SEric W. Biederman {
3256b124879SEric W. Biederman 	struct kthread *kthread = to_kthread(current);
3266b124879SEric W. Biederman 	kthread->result = result;
327d1a89197SFrederic Weisbecker 	if (!list_empty(&kthread->hotplug_node)) {
328d1a89197SFrederic Weisbecker 		mutex_lock(&kthreads_hotplug_lock);
329d1a89197SFrederic Weisbecker 		list_del(&kthread->hotplug_node);
330d1a89197SFrederic Weisbecker 		mutex_unlock(&kthreads_hotplug_lock);
3314d13f430SFrederic Weisbecker 
3324d13f430SFrederic Weisbecker 		if (kthread->preferred_affinity) {
3334d13f430SFrederic Weisbecker 			kfree(kthread->preferred_affinity);
3344d13f430SFrederic Weisbecker 			kthread->preferred_affinity = NULL;
3354d13f430SFrederic Weisbecker 		}
336d1a89197SFrederic Weisbecker 	}
3376b124879SEric W. Biederman 	do_exit(0);
338bbda86e9SEric W. Biederman }
3393a35c130SMickaël Salaün EXPORT_SYMBOL(kthread_exit);
340bbda86e9SEric W. Biederman 
341cead1855SEric W. Biederman /**
3425eb6f228SEric W. Biederman  * kthread_complete_and_exit - Exit the current kthread.
343cead1855SEric W. Biederman  * @comp: Completion to complete
344cead1855SEric W. Biederman  * @code: The integer value to return to kthread_stop().
345cead1855SEric W. Biederman  *
3466a25212dSPrathu Baronia  * If present, complete @comp and then return code to kthread_stop().
347cead1855SEric W. Biederman  *
348cead1855SEric W. Biederman  * A kernel thread whose module may be removed after the completion of
3496a25212dSPrathu Baronia  * @comp can use this function to exit safely.
350cead1855SEric W. Biederman  *
351cead1855SEric W. Biederman  * Does not return.
352cead1855SEric W. Biederman  */
kthread_complete_and_exit(struct completion * comp,long code)353cead1855SEric W. Biederman void __noreturn kthread_complete_and_exit(struct completion *comp, long code)
354cead1855SEric W. Biederman {
355cead1855SEric W. Biederman 	if (comp)
356cead1855SEric W. Biederman 		complete(comp);
357cead1855SEric W. Biederman 
358cead1855SEric W. Biederman 	kthread_exit(code);
359cead1855SEric W. Biederman }
360cead1855SEric W. Biederman EXPORT_SYMBOL(kthread_complete_and_exit);
361cead1855SEric W. Biederman 
kthread_fetch_affinity(struct kthread * kthread,struct cpumask * cpumask)362d1a89197SFrederic Weisbecker static void kthread_fetch_affinity(struct kthread *kthread, struct cpumask *cpumask)
363d1a89197SFrederic Weisbecker {
3644d13f430SFrederic Weisbecker 	const struct cpumask *pref;
365d1a89197SFrederic Weisbecker 
3664d13f430SFrederic Weisbecker 	if (kthread->preferred_affinity) {
3674d13f430SFrederic Weisbecker 		pref = kthread->preferred_affinity;
3684d13f430SFrederic Weisbecker 	} else {
3694d13f430SFrederic Weisbecker 		if (WARN_ON_ONCE(kthread->node == NUMA_NO_NODE))
3704d13f430SFrederic Weisbecker 			return;
3714d13f430SFrederic Weisbecker 		pref = cpumask_of_node(kthread->node);
3724d13f430SFrederic Weisbecker 	}
3734d13f430SFrederic Weisbecker 
3744d13f430SFrederic Weisbecker 	cpumask_and(cpumask, pref, housekeeping_cpumask(HK_TYPE_KTHREAD));
375d1a89197SFrederic Weisbecker 	if (cpumask_empty(cpumask))
376d1a89197SFrederic Weisbecker 		cpumask_copy(cpumask, housekeeping_cpumask(HK_TYPE_KTHREAD));
377d1a89197SFrederic Weisbecker }
378d1a89197SFrederic Weisbecker 
kthread_affine_node(void)379d1a89197SFrederic Weisbecker static void kthread_affine_node(void)
380d1a89197SFrederic Weisbecker {
381d1a89197SFrederic Weisbecker 	struct kthread *kthread = to_kthread(current);
382d1a89197SFrederic Weisbecker 	cpumask_var_t affinity;
383d1a89197SFrederic Weisbecker 
384d1a89197SFrederic Weisbecker 	WARN_ON_ONCE(kthread_is_per_cpu(current));
385d1a89197SFrederic Weisbecker 
386d1a89197SFrederic Weisbecker 	if (kthread->node == NUMA_NO_NODE) {
387d1a89197SFrederic Weisbecker 		housekeeping_affine(current, HK_TYPE_KTHREAD);
388d1a89197SFrederic Weisbecker 	} else {
389d1a89197SFrederic Weisbecker 		if (!zalloc_cpumask_var(&affinity, GFP_KERNEL)) {
390d1a89197SFrederic Weisbecker 			WARN_ON_ONCE(1);
391d1a89197SFrederic Weisbecker 			return;
392d1a89197SFrederic Weisbecker 		}
393d1a89197SFrederic Weisbecker 
394d1a89197SFrederic Weisbecker 		mutex_lock(&kthreads_hotplug_lock);
395d1a89197SFrederic Weisbecker 		WARN_ON_ONCE(!list_empty(&kthread->hotplug_node));
396d1a89197SFrederic Weisbecker 		list_add_tail(&kthread->hotplug_node, &kthreads_hotplug);
397d1a89197SFrederic Weisbecker 		/*
398d1a89197SFrederic Weisbecker 		 * The node cpumask is racy when read from kthread() but:
399d1a89197SFrederic Weisbecker 		 * - a racing CPU going down will either fail on the subsequent
400d1a89197SFrederic Weisbecker 		 *   call to set_cpus_allowed_ptr() or be migrated to housekeepers
401d1a89197SFrederic Weisbecker 		 *   afterwards by the scheduler.
402d1a89197SFrederic Weisbecker 		 * - a racing CPU going up will be handled by kthreads_online_cpu()
403d1a89197SFrederic Weisbecker 		 */
404d1a89197SFrederic Weisbecker 		kthread_fetch_affinity(kthread, affinity);
405d1a89197SFrederic Weisbecker 		set_cpus_allowed_ptr(current, affinity);
406d1a89197SFrederic Weisbecker 		mutex_unlock(&kthreads_hotplug_lock);
407d1a89197SFrederic Weisbecker 
408d1a89197SFrederic Weisbecker 		free_cpumask_var(affinity);
409d1a89197SFrederic Weisbecker 	}
410d1a89197SFrederic Weisbecker }
411d1a89197SFrederic Weisbecker 
kthread(void * _create)4121da177e4SLinus Torvalds static int kthread(void *_create)
4131da177e4SLinus Torvalds {
4141a7243caSSebastian Andrzej Siewior 	static const struct sched_param param = { .sched_priority = 0 };
41573c27992SEric W. Biederman 	/* Copy data: it's on kthread's stack */
41663706172SOleg Nesterov 	struct kthread_create_info *create = _create;
41763706172SOleg Nesterov 	int (*threadfn)(void *data) = create->threadfn;
41863706172SOleg Nesterov 	void *data = create->data;
419786235eeSTetsuo Handa 	struct completion *done;
4201da5c46fSOleg Nesterov 	struct kthread *self;
42163706172SOleg Nesterov 	int ret;
42263706172SOleg Nesterov 
42300b89fe0SValentin Schneider 	self = to_kthread(current);
4241da177e4SLinus Torvalds 
425d25c83c6SPetr Mladek 	/* Release the structure when caller killed by a fatal signal. */
426786235eeSTetsuo Handa 	done = xchg(&create->done, NULL);
427786235eeSTetsuo Handa 	if (!done) {
42873e0c116SMike Christie 		kfree(create->full_name);
429786235eeSTetsuo Handa 		kfree(create);
430bbda86e9SEric W. Biederman 		kthread_exit(-EINTR);
4311da5c46fSOleg Nesterov 	}
4321da5c46fSOleg Nesterov 
43373e0c116SMike Christie 	self->full_name = create->full_name;
43452782c92SJ. Bruce Fields 	self->threadfn = threadfn;
4351da5c46fSOleg Nesterov 	self->data = data;
4361da5c46fSOleg Nesterov 
4371a7243caSSebastian Andrzej Siewior 	/*
4381a7243caSSebastian Andrzej Siewior 	 * The new thread inherited kthreadd's priority and CPU mask. Reset
4391a7243caSSebastian Andrzej Siewior 	 * back to default in case they have been changed.
4401a7243caSSebastian Andrzej Siewior 	 */
4411a7243caSSebastian Andrzej Siewior 	sched_setscheduler_nocheck(current, SCHED_NORMAL, &param);
4421a7243caSSebastian Andrzej Siewior 
4431da177e4SLinus Torvalds 	/* OK, tell user we're spawned, wait for stop or wakeup */
444a076e4bcSOleg Nesterov 	__set_current_state(TASK_UNINTERRUPTIBLE);
4453217ab97SVitaliy Gusev 	create->result = current;
44626c7295bSLiang Chen 	/*
44726c7295bSLiang Chen 	 * Thread is going to call schedule(), do not preempt it,
44826c7295bSLiang Chen 	 * or the creator may spend more time in wait_task_inactive().
44926c7295bSLiang Chen 	 */
45026c7295bSLiang Chen 	preempt_disable();
451786235eeSTetsuo Handa 	complete(done);
45226c7295bSLiang Chen 	schedule_preempt_disabled();
45326c7295bSLiang Chen 	preempt_enable();
4541da177e4SLinus Torvalds 
4555eacb68aSFrederic Weisbecker 	self->started = 1;
4565eacb68aSFrederic Weisbecker 
4574d13f430SFrederic Weisbecker 	if (!(current->flags & PF_NO_SETAFFINITY) && !self->preferred_affinity)
458d1a89197SFrederic Weisbecker 		kthread_affine_node();
459d1a89197SFrederic Weisbecker 
46063706172SOleg Nesterov 	ret = -EINTR;
4611da5c46fSOleg Nesterov 	if (!test_bit(KTHREAD_SHOULD_STOP, &self->flags)) {
46277f88796STejun Heo 		cgroup_kthread_ready();
4631da5c46fSOleg Nesterov 		__kthread_parkme(self);
4642a1d4460SThomas Gleixner 		ret = threadfn(data);
4652a1d4460SThomas Gleixner 	}
466bbda86e9SEric W. Biederman 	kthread_exit(ret);
4671da177e4SLinus Torvalds }
4681da177e4SLinus Torvalds 
469cb5021caSYanfei Xu /* called from kernel_clone() to get node information for about to be created task */
tsk_fork_get_node(struct task_struct * tsk)470207205a2SEric Dumazet int tsk_fork_get_node(struct task_struct *tsk)
471207205a2SEric Dumazet {
472207205a2SEric Dumazet #ifdef CONFIG_NUMA
473207205a2SEric Dumazet 	if (tsk == kthreadd_task)
474207205a2SEric Dumazet 		return tsk->pref_node_fork;
475207205a2SEric Dumazet #endif
47681c98869SNishanth Aravamudan 	return NUMA_NO_NODE;
477207205a2SEric Dumazet }
478207205a2SEric Dumazet 
create_kthread(struct kthread_create_info * create)47973c27992SEric W. Biederman static void create_kthread(struct kthread_create_info *create)
4801da177e4SLinus Torvalds {
4811da177e4SLinus Torvalds 	int pid;
4821da177e4SLinus Torvalds 
483207205a2SEric Dumazet #ifdef CONFIG_NUMA
484207205a2SEric Dumazet 	current->pref_node_fork = create->node;
485207205a2SEric Dumazet #endif
4861da177e4SLinus Torvalds 	/* We want our own signal handler (we take no signals by default). */
48773e0c116SMike Christie 	pid = kernel_thread(kthread, create, create->full_name,
488cf587db2SMike Christie 			    CLONE_FS | CLONE_FILES | SIGCHLD);
489cdd140bdSOleg Nesterov 	if (pid < 0) {
490d25c83c6SPetr Mladek 		/* Release the structure when caller killed by a fatal signal. */
491786235eeSTetsuo Handa 		struct completion *done = xchg(&create->done, NULL);
492786235eeSTetsuo Handa 
49373e0c116SMike Christie 		kfree(create->full_name);
494786235eeSTetsuo Handa 		if (!done) {
495786235eeSTetsuo Handa 			kfree(create);
496786235eeSTetsuo Handa 			return;
497786235eeSTetsuo Handa 		}
4981da177e4SLinus Torvalds 		create->result = ERR_PTR(pid);
499786235eeSTetsuo Handa 		complete(done);
5001da177e4SLinus Torvalds 	}
501cdd140bdSOleg Nesterov }
5021da177e4SLinus Torvalds 
503c0b942a7SNicolas Iooss static __printf(4, 0)
__kthread_create_on_node(int (* threadfn)(void * data),void * data,int node,const char namefmt[],va_list args)504c0b942a7SNicolas Iooss struct task_struct *__kthread_create_on_node(int (*threadfn)(void *data),
5052a1d4460SThomas Gleixner 						    void *data, int node,
5061da177e4SLinus Torvalds 						    const char namefmt[],
507255451e4SPetr Mladek 						    va_list args)
5081da177e4SLinus Torvalds {
509786235eeSTetsuo Handa 	DECLARE_COMPLETION_ONSTACK(done);
510786235eeSTetsuo Handa 	struct task_struct *task;
511786235eeSTetsuo Handa 	struct kthread_create_info *create = kmalloc(sizeof(*create),
512786235eeSTetsuo Handa 						     GFP_KERNEL);
5131da177e4SLinus Torvalds 
514786235eeSTetsuo Handa 	if (!create)
515786235eeSTetsuo Handa 		return ERR_PTR(-ENOMEM);
516786235eeSTetsuo Handa 	create->threadfn = threadfn;
517786235eeSTetsuo Handa 	create->data = data;
518786235eeSTetsuo Handa 	create->node = node;
519786235eeSTetsuo Handa 	create->done = &done;
52073e0c116SMike Christie 	create->full_name = kvasprintf(GFP_KERNEL, namefmt, args);
52173e0c116SMike Christie 	if (!create->full_name) {
52273e0c116SMike Christie 		task = ERR_PTR(-ENOMEM);
52373e0c116SMike Christie 		goto free_create;
52473e0c116SMike Christie 	}
5251da177e4SLinus Torvalds 
52673c27992SEric W. Biederman 	spin_lock(&kthread_create_lock);
527786235eeSTetsuo Handa 	list_add_tail(&create->list, &kthread_create_list);
52873c27992SEric W. Biederman 	spin_unlock(&kthread_create_lock);
52973c27992SEric W. Biederman 
530cbd9b67bSDmitry Adamushko 	wake_up_process(kthreadd_task);
531786235eeSTetsuo Handa 	/*
532786235eeSTetsuo Handa 	 * Wait for completion in killable state, for I might be chosen by
533786235eeSTetsuo Handa 	 * the OOM killer while kthreadd is trying to allocate memory for
534786235eeSTetsuo Handa 	 * new kernel thread.
535786235eeSTetsuo Handa 	 */
536786235eeSTetsuo Handa 	if (unlikely(wait_for_completion_killable(&done))) {
537786235eeSTetsuo Handa 		/*
538d25c83c6SPetr Mladek 		 * If I was killed by a fatal signal before kthreadd (or new
539d25c83c6SPetr Mladek 		 * kernel thread) calls complete(), leave the cleanup of this
540d25c83c6SPetr Mladek 		 * structure to that thread.
541786235eeSTetsuo Handa 		 */
542786235eeSTetsuo Handa 		if (xchg(&create->done, NULL))
5438fe6929cSTetsuo Handa 			return ERR_PTR(-EINTR);
544786235eeSTetsuo Handa 		/*
545786235eeSTetsuo Handa 		 * kthreadd (or new kernel thread) will call complete()
546786235eeSTetsuo Handa 		 * shortly.
547786235eeSTetsuo Handa 		 */
548786235eeSTetsuo Handa 		wait_for_completion(&done);
549786235eeSTetsuo Handa 	}
550786235eeSTetsuo Handa 	task = create->result;
55173e0c116SMike Christie free_create:
552786235eeSTetsuo Handa 	kfree(create);
553786235eeSTetsuo Handa 	return task;
5541da177e4SLinus Torvalds }
555255451e4SPetr Mladek 
556255451e4SPetr Mladek /**
557255451e4SPetr Mladek  * kthread_create_on_node - create a kthread.
558255451e4SPetr Mladek  * @threadfn: the function to run until signal_pending(current).
559255451e4SPetr Mladek  * @data: data ptr for @threadfn.
560255451e4SPetr Mladek  * @node: task and thread structures for the thread are allocated on this node
561255451e4SPetr Mladek  * @namefmt: printf-style name for the thread.
562255451e4SPetr Mladek  *
563255451e4SPetr Mladek  * Description: This helper function creates and names a kernel
564255451e4SPetr Mladek  * thread.  The thread will be stopped: use wake_up_process() to start
565255451e4SPetr Mladek  * it.  See also kthread_run().  The new thread has SCHED_NORMAL policy and
566255451e4SPetr Mladek  * is affine to all CPUs.
567255451e4SPetr Mladek  *
568255451e4SPetr Mladek  * If thread is going to be bound on a particular cpu, give its node
569255451e4SPetr Mladek  * in @node, to get NUMA affinity for kthread stack, or else give NUMA_NO_NODE.
570255451e4SPetr Mladek  * When woken, the thread will run @threadfn() with @data as its
571111e7049SEric W. Biederman  * argument. @threadfn() can either return directly if it is a
572255451e4SPetr Mladek  * standalone thread for which no one will call kthread_stop(), or
573255451e4SPetr Mladek  * return when 'kthread_should_stop()' is true (which means
574255451e4SPetr Mladek  * kthread_stop() has been called).  The return value should be zero
575255451e4SPetr Mladek  * or a negative error number; it will be passed to kthread_stop().
576255451e4SPetr Mladek  *
577255451e4SPetr Mladek  * Returns a task_struct or ERR_PTR(-ENOMEM) or ERR_PTR(-EINTR).
578255451e4SPetr Mladek  */
kthread_create_on_node(int (* threadfn)(void * data),void * data,int node,const char namefmt[],...)579255451e4SPetr Mladek struct task_struct *kthread_create_on_node(int (*threadfn)(void *data),
580255451e4SPetr Mladek 					   void *data, int node,
581255451e4SPetr Mladek 					   const char namefmt[],
582255451e4SPetr Mladek 					   ...)
583255451e4SPetr Mladek {
584255451e4SPetr Mladek 	struct task_struct *task;
585255451e4SPetr Mladek 	va_list args;
586255451e4SPetr Mladek 
587255451e4SPetr Mladek 	va_start(args, namefmt);
588255451e4SPetr Mladek 	task = __kthread_create_on_node(threadfn, data, node, namefmt, args);
589255451e4SPetr Mladek 	va_end(args);
590255451e4SPetr Mladek 
591255451e4SPetr Mladek 	return task;
592255451e4SPetr Mladek }
593207205a2SEric Dumazet EXPORT_SYMBOL(kthread_create_on_node);
5941da177e4SLinus Torvalds 
__kthread_bind_mask(struct task_struct * p,const struct cpumask * mask,unsigned int state)5952f064a59SPeter Zijlstra static void __kthread_bind_mask(struct task_struct *p, const struct cpumask *mask, unsigned int state)
5962a1d4460SThomas Gleixner {
59725834c73SPeter Zijlstra 	unsigned long flags;
59825834c73SPeter Zijlstra 
599f2530dc7SThomas Gleixner 	if (!wait_task_inactive(p, state)) {
600f2530dc7SThomas Gleixner 		WARN_ON(1);
601f2530dc7SThomas Gleixner 		return;
602f2530dc7SThomas Gleixner 	}
60325834c73SPeter Zijlstra 
6042a1d4460SThomas Gleixner 	/* It's safe because the task is inactive. */
60525834c73SPeter Zijlstra 	raw_spin_lock_irqsave(&p->pi_lock, flags);
60625834c73SPeter Zijlstra 	do_set_cpus_allowed(p, mask);
60714a40ffcSTejun Heo 	p->flags |= PF_NO_SETAFFINITY;
60825834c73SPeter Zijlstra 	raw_spin_unlock_irqrestore(&p->pi_lock, flags);
60925834c73SPeter Zijlstra }
61025834c73SPeter Zijlstra 
__kthread_bind(struct task_struct * p,unsigned int cpu,unsigned int state)6112f064a59SPeter Zijlstra static void __kthread_bind(struct task_struct *p, unsigned int cpu, unsigned int state)
61225834c73SPeter Zijlstra {
61325834c73SPeter Zijlstra 	__kthread_bind_mask(p, cpumask_of(cpu), state);
61425834c73SPeter Zijlstra }
61525834c73SPeter Zijlstra 
kthread_bind_mask(struct task_struct * p,const struct cpumask * mask)61625834c73SPeter Zijlstra void kthread_bind_mask(struct task_struct *p, const struct cpumask *mask)
61725834c73SPeter Zijlstra {
6185eacb68aSFrederic Weisbecker 	struct kthread *kthread = to_kthread(p);
61925834c73SPeter Zijlstra 	__kthread_bind_mask(p, mask, TASK_UNINTERRUPTIBLE);
6205eacb68aSFrederic Weisbecker 	WARN_ON_ONCE(kthread->started);
6212a1d4460SThomas Gleixner }
6222a1d4460SThomas Gleixner 
6239e37bd30SRandy Dunlap /**
624881232b7SPeter Zijlstra  * kthread_bind - bind a just-created kthread to a cpu.
625881232b7SPeter Zijlstra  * @p: thread created by kthread_create().
626881232b7SPeter Zijlstra  * @cpu: cpu (might not be online, must be possible) for @k to run on.
627881232b7SPeter Zijlstra  *
628881232b7SPeter Zijlstra  * Description: This function is equivalent to set_cpus_allowed(),
629881232b7SPeter Zijlstra  * except that @cpu doesn't need to be online, and the thread must be
630881232b7SPeter Zijlstra  * stopped (i.e., just returned from kthread_create()).
631881232b7SPeter Zijlstra  */
kthread_bind(struct task_struct * p,unsigned int cpu)632881232b7SPeter Zijlstra void kthread_bind(struct task_struct *p, unsigned int cpu)
633881232b7SPeter Zijlstra {
6345eacb68aSFrederic Weisbecker 	struct kthread *kthread = to_kthread(p);
635f2530dc7SThomas Gleixner 	__kthread_bind(p, cpu, TASK_UNINTERRUPTIBLE);
6365eacb68aSFrederic Weisbecker 	WARN_ON_ONCE(kthread->started);
637881232b7SPeter Zijlstra }
638881232b7SPeter Zijlstra EXPORT_SYMBOL(kthread_bind);
639881232b7SPeter Zijlstra 
640881232b7SPeter Zijlstra /**
6412a1d4460SThomas Gleixner  * kthread_create_on_cpu - Create a cpu bound kthread
6422a1d4460SThomas Gleixner  * @threadfn: the function to run until signal_pending(current).
6432a1d4460SThomas Gleixner  * @data: data ptr for @threadfn.
6442a1d4460SThomas Gleixner  * @cpu: The cpu on which the thread should be bound,
6452a1d4460SThomas Gleixner  * @namefmt: printf-style name for the thread. Format is restricted
6462a1d4460SThomas Gleixner  *	     to "name.*%u". Code fills in cpu number.
6472a1d4460SThomas Gleixner  *
6482a1d4460SThomas Gleixner  * Description: This helper function creates and names a kernel thread
6492a1d4460SThomas Gleixner  */
kthread_create_on_cpu(int (* threadfn)(void * data),void * data,unsigned int cpu,const char * namefmt)6502a1d4460SThomas Gleixner struct task_struct *kthread_create_on_cpu(int (*threadfn)(void *data),
6512a1d4460SThomas Gleixner 					  void *data, unsigned int cpu,
6522a1d4460SThomas Gleixner 					  const char *namefmt)
6532a1d4460SThomas Gleixner {
6542a1d4460SThomas Gleixner 	struct task_struct *p;
6552a1d4460SThomas Gleixner 
65610922838SNishanth Aravamudan 	p = kthread_create_on_node(threadfn, data, cpu_to_node(cpu), namefmt,
6572a1d4460SThomas Gleixner 				   cpu);
6582a1d4460SThomas Gleixner 	if (IS_ERR(p))
6592a1d4460SThomas Gleixner 		return p;
660a65d4096SPetr Mladek 	kthread_bind(p, cpu);
661a65d4096SPetr Mladek 	/* CPU hotplug need to bind once again when unparking the thread. */
6622a1d4460SThomas Gleixner 	to_kthread(p)->cpu = cpu;
6632a1d4460SThomas Gleixner 	return p;
6642a1d4460SThomas Gleixner }
665800977f6SCai Huoqing EXPORT_SYMBOL(kthread_create_on_cpu);
6662a1d4460SThomas Gleixner 
kthread_set_per_cpu(struct task_struct * k,int cpu)667ac687e6eSPeter Zijlstra void kthread_set_per_cpu(struct task_struct *k, int cpu)
668ac687e6eSPeter Zijlstra {
669ac687e6eSPeter Zijlstra 	struct kthread *kthread = to_kthread(k);
670ac687e6eSPeter Zijlstra 	if (!kthread)
671ac687e6eSPeter Zijlstra 		return;
672ac687e6eSPeter Zijlstra 
673ac687e6eSPeter Zijlstra 	WARN_ON_ONCE(!(k->flags & PF_NO_SETAFFINITY));
674ac687e6eSPeter Zijlstra 
675ac687e6eSPeter Zijlstra 	if (cpu < 0) {
676ac687e6eSPeter Zijlstra 		clear_bit(KTHREAD_IS_PER_CPU, &kthread->flags);
677ac687e6eSPeter Zijlstra 		return;
678ac687e6eSPeter Zijlstra 	}
679ac687e6eSPeter Zijlstra 
680ac687e6eSPeter Zijlstra 	kthread->cpu = cpu;
681ac687e6eSPeter Zijlstra 	set_bit(KTHREAD_IS_PER_CPU, &kthread->flags);
682ac687e6eSPeter Zijlstra }
683ac687e6eSPeter Zijlstra 
kthread_is_per_cpu(struct task_struct * p)6843a7956e2SPeter Zijlstra bool kthread_is_per_cpu(struct task_struct *p)
685ac687e6eSPeter Zijlstra {
6863a7956e2SPeter Zijlstra 	struct kthread *kthread = __to_kthread(p);
687ac687e6eSPeter Zijlstra 	if (!kthread)
688ac687e6eSPeter Zijlstra 		return false;
689ac687e6eSPeter Zijlstra 
690ac687e6eSPeter Zijlstra 	return test_bit(KTHREAD_IS_PER_CPU, &kthread->flags);
691ac687e6eSPeter Zijlstra }
692ac687e6eSPeter Zijlstra 
693cf380a4aSOleg Nesterov /**
694cf380a4aSOleg Nesterov  * kthread_unpark - unpark a thread created by kthread_create().
695cf380a4aSOleg Nesterov  * @k:		thread created by kthread_create().
696cf380a4aSOleg Nesterov  *
697cf380a4aSOleg Nesterov  * Sets kthread_should_park() for @k to return false, wakes it, and
698cf380a4aSOleg Nesterov  * waits for it to return. If the thread is marked percpu then its
699cf380a4aSOleg Nesterov  * bound to the cpu again.
700cf380a4aSOleg Nesterov  */
kthread_unpark(struct task_struct * k)701cf380a4aSOleg Nesterov void kthread_unpark(struct task_struct *k)
702f2530dc7SThomas Gleixner {
703cf380a4aSOleg Nesterov 	struct kthread *kthread = to_kthread(k);
704cf380a4aSOleg Nesterov 
705214e01adSFrederic Weisbecker 	if (!test_bit(KTHREAD_SHOULD_PARK, &kthread->flags))
706214e01adSFrederic Weisbecker 		return;
707a65d4096SPetr Mladek 	/*
708a65d4096SPetr Mladek 	 * Newly created kthread was parked when the CPU was offline.
709a65d4096SPetr Mladek 	 * The binding was lost and we need to set it again.
710a65d4096SPetr Mladek 	 */
711f2530dc7SThomas Gleixner 	if (test_bit(KTHREAD_IS_PER_CPU, &kthread->flags))
712f2530dc7SThomas Gleixner 		__kthread_bind(k, kthread->cpu, TASK_PARKED);
71385f1abe0SPeter Zijlstra 
71485f1abe0SPeter Zijlstra 	clear_bit(KTHREAD_SHOULD_PARK, &kthread->flags);
7151cef1150SPeter Zijlstra 	/*
7161cef1150SPeter Zijlstra 	 * __kthread_parkme() will either see !SHOULD_PARK or get the wakeup.
7171cef1150SPeter Zijlstra 	 */
718f2530dc7SThomas Gleixner 	wake_up_state(k, TASK_PARKED);
719f2530dc7SThomas Gleixner }
72018896451SDavid Kershner EXPORT_SYMBOL_GPL(kthread_unpark);
7212a1d4460SThomas Gleixner 
7222a1d4460SThomas Gleixner /**
7232a1d4460SThomas Gleixner  * kthread_park - park a thread created by kthread_create().
7242a1d4460SThomas Gleixner  * @k: thread created by kthread_create().
7252a1d4460SThomas Gleixner  *
7262a1d4460SThomas Gleixner  * Sets kthread_should_park() for @k to return true, wakes it, and
7272a1d4460SThomas Gleixner  * waits for it to return. This can also be called after kthread_create()
7282a1d4460SThomas Gleixner  * instead of calling wake_up_process(): the thread will park without
7292a1d4460SThomas Gleixner  * calling threadfn().
7302a1d4460SThomas Gleixner  *
7312a1d4460SThomas Gleixner  * Returns 0 if the thread is parked, -ENOSYS if the thread exited.
7322a1d4460SThomas Gleixner  * If called by the kthread itself just the park bit is set.
7332a1d4460SThomas Gleixner  */
kthread_park(struct task_struct * k)7342a1d4460SThomas Gleixner int kthread_park(struct task_struct *k)
7352a1d4460SThomas Gleixner {
736cf380a4aSOleg Nesterov 	struct kthread *kthread = to_kthread(k);
7372a1d4460SThomas Gleixner 
738cf380a4aSOleg Nesterov 	if (WARN_ON(k->flags & PF_EXITING))
739cf380a4aSOleg Nesterov 		return -ENOSYS;
740cf380a4aSOleg Nesterov 
741f83ee19bSPeter Zijlstra 	if (WARN_ON_ONCE(test_bit(KTHREAD_SHOULD_PARK, &kthread->flags)))
742f83ee19bSPeter Zijlstra 		return -EBUSY;
743f83ee19bSPeter Zijlstra 
7442a1d4460SThomas Gleixner 	set_bit(KTHREAD_SHOULD_PARK, &kthread->flags);
7452a1d4460SThomas Gleixner 	if (k != current) {
7462a1d4460SThomas Gleixner 		wake_up_process(k);
7471cef1150SPeter Zijlstra 		/*
7481cef1150SPeter Zijlstra 		 * Wait for __kthread_parkme() to complete(), this means we
7491cef1150SPeter Zijlstra 		 * _will_ have TASK_PARKED and are about to call schedule().
7501cef1150SPeter Zijlstra 		 */
7512a1d4460SThomas Gleixner 		wait_for_completion(&kthread->parked);
7521cef1150SPeter Zijlstra 		/*
7531cef1150SPeter Zijlstra 		 * Now wait for that schedule() to complete and the task to
7541cef1150SPeter Zijlstra 		 * get scheduled out.
7551cef1150SPeter Zijlstra 		 */
7561cef1150SPeter Zijlstra 		WARN_ON_ONCE(!wait_task_inactive(k, TASK_PARKED));
7572a1d4460SThomas Gleixner 	}
758cf380a4aSOleg Nesterov 
759cf380a4aSOleg Nesterov 	return 0;
7602a1d4460SThomas Gleixner }
76118896451SDavid Kershner EXPORT_SYMBOL_GPL(kthread_park);
7622a1d4460SThomas Gleixner 
7632a1d4460SThomas Gleixner /**
7649e37bd30SRandy Dunlap  * kthread_stop - stop a thread created by kthread_create().
7659e37bd30SRandy Dunlap  * @k: thread created by kthread_create().
7669e37bd30SRandy Dunlap  *
7679e37bd30SRandy Dunlap  * Sets kthread_should_stop() for @k to return true, wakes it, and
7689ae26027SOleg Nesterov  * waits for it to exit. This can also be called after kthread_create()
7699ae26027SOleg Nesterov  * instead of calling wake_up_process(): the thread will exit without
7709ae26027SOleg Nesterov  * calling threadfn().
7719ae26027SOleg Nesterov  *
772bbda86e9SEric W. Biederman  * If threadfn() may call kthread_exit() itself, the caller must ensure
7739ae26027SOleg Nesterov  * task_struct can't go away.
7749e37bd30SRandy Dunlap  *
7759e37bd30SRandy Dunlap  * Returns the result of threadfn(), or %-EINTR if wake_up_process()
7769e37bd30SRandy Dunlap  * was never called.
7779e37bd30SRandy Dunlap  */
kthread_stop(struct task_struct * k)7781da177e4SLinus Torvalds int kthread_stop(struct task_struct *k)
7791da177e4SLinus Torvalds {
780b5c5442bSOleg Nesterov 	struct kthread *kthread;
7811da177e4SLinus Torvalds 	int ret;
7821da177e4SLinus Torvalds 
78363706172SOleg Nesterov 	trace_sched_kthread_stop(k);
784b5c5442bSOleg Nesterov 
785b5c5442bSOleg Nesterov 	get_task_struct(k);
786efb29fbfSOleg Nesterov 	kthread = to_kthread(k);
7872a1d4460SThomas Gleixner 	set_bit(KTHREAD_SHOULD_STOP, &kthread->flags);
788cf380a4aSOleg Nesterov 	kthread_unpark(k);
789a7c01fa9SJason A. Donenfeld 	set_tsk_thread_flag(k, TIF_NOTIFY_SIGNAL);
7901da177e4SLinus Torvalds 	wake_up_process(k);
79163706172SOleg Nesterov 	wait_for_completion(&kthread->exited);
7926b124879SEric W. Biederman 	ret = kthread->result;
7931da177e4SLinus Torvalds 	put_task_struct(k);
7940a16b607SMathieu Desnoyers 
795b5c5442bSOleg Nesterov 	trace_sched_kthread_stop_ret(ret);
7961da177e4SLinus Torvalds 	return ret;
7971da177e4SLinus Torvalds }
79852e92e57SAdrian Bunk EXPORT_SYMBOL(kthread_stop);
7991da177e4SLinus Torvalds 
8006309727eSAndreas Gruenbacher /**
8016309727eSAndreas Gruenbacher  * kthread_stop_put - stop a thread and put its task struct
8026309727eSAndreas Gruenbacher  * @k: thread created by kthread_create().
8036309727eSAndreas Gruenbacher  *
8046309727eSAndreas Gruenbacher  * Stops a thread created by kthread_create() and put its task_struct.
8056309727eSAndreas Gruenbacher  * Only use when holding an extra task struct reference obtained by
8066309727eSAndreas Gruenbacher  * calling get_task_struct().
8076309727eSAndreas Gruenbacher  */
kthread_stop_put(struct task_struct * k)8086309727eSAndreas Gruenbacher int kthread_stop_put(struct task_struct *k)
8096309727eSAndreas Gruenbacher {
8106309727eSAndreas Gruenbacher 	int ret;
8116309727eSAndreas Gruenbacher 
8126309727eSAndreas Gruenbacher 	ret = kthread_stop(k);
8136309727eSAndreas Gruenbacher 	put_task_struct(k);
8146309727eSAndreas Gruenbacher 	return ret;
8156309727eSAndreas Gruenbacher }
8166309727eSAndreas Gruenbacher EXPORT_SYMBOL(kthread_stop_put);
8176309727eSAndreas Gruenbacher 
kthreadd(void * unused)818e804a4a4SSatyam Sharma int kthreadd(void *unused)
8191da177e4SLinus Torvalds {
8203a3f61ceSKees Cook 	static const char comm[TASK_COMM_LEN] = "kthreadd";
82173c27992SEric W. Biederman 	struct task_struct *tsk = current;
82273c27992SEric W. Biederman 
823e804a4a4SSatyam Sharma 	/* Setup a clean context for our children to inherit. */
8243a3f61ceSKees Cook 	set_task_comm(tsk, comm);
82510ab825bSOleg Nesterov 	ignore_signals(tsk);
82604d4e665SFrederic Weisbecker 	set_cpus_allowed_ptr(tsk, housekeeping_cpumask(HK_TYPE_KTHREAD));
827aee4faa4SLai Jiangshan 	set_mems_allowed(node_states[N_MEMORY]);
82873c27992SEric W. Biederman 
82934b087e4STejun Heo 	current->flags |= PF_NOFREEZE;
83077f88796STejun Heo 	cgroup_init_kthreadd();
83173c27992SEric W. Biederman 
83273c27992SEric W. Biederman 	for (;;) {
83373c27992SEric W. Biederman 		set_current_state(TASK_INTERRUPTIBLE);
83473c27992SEric W. Biederman 		if (list_empty(&kthread_create_list))
83573c27992SEric W. Biederman 			schedule();
83673c27992SEric W. Biederman 		__set_current_state(TASK_RUNNING);
83773c27992SEric W. Biederman 
83873c27992SEric W. Biederman 		spin_lock(&kthread_create_lock);
83973c27992SEric W. Biederman 		while (!list_empty(&kthread_create_list)) {
84073c27992SEric W. Biederman 			struct kthread_create_info *create;
84173c27992SEric W. Biederman 
84273c27992SEric W. Biederman 			create = list_entry(kthread_create_list.next,
84373c27992SEric W. Biederman 					    struct kthread_create_info, list);
84473c27992SEric W. Biederman 			list_del_init(&create->list);
84573c27992SEric W. Biederman 			spin_unlock(&kthread_create_lock);
84673c27992SEric W. Biederman 
84773c27992SEric W. Biederman 			create_kthread(create);
84873c27992SEric W. Biederman 
84973c27992SEric W. Biederman 			spin_lock(&kthread_create_lock);
85073c27992SEric W. Biederman 		}
85173c27992SEric W. Biederman 		spin_unlock(&kthread_create_lock);
85273c27992SEric W. Biederman 	}
8531da177e4SLinus Torvalds 
8541da177e4SLinus Torvalds 	return 0;
8551da177e4SLinus Torvalds }
856b56c0d89STejun Heo 
kthread_affine_preferred(struct task_struct * p,const struct cpumask * mask)8574d13f430SFrederic Weisbecker int kthread_affine_preferred(struct task_struct *p, const struct cpumask *mask)
8584d13f430SFrederic Weisbecker {
8594d13f430SFrederic Weisbecker 	struct kthread *kthread = to_kthread(p);
8604d13f430SFrederic Weisbecker 	cpumask_var_t affinity;
8614d13f430SFrederic Weisbecker 	unsigned long flags;
8621b0332a4SYu-Chun Lin 	int ret = 0;
8634d13f430SFrederic Weisbecker 
8644d13f430SFrederic Weisbecker 	if (!wait_task_inactive(p, TASK_UNINTERRUPTIBLE) || kthread->started) {
8654d13f430SFrederic Weisbecker 		WARN_ON(1);
8664d13f430SFrederic Weisbecker 		return -EINVAL;
8674d13f430SFrederic Weisbecker 	}
8684d13f430SFrederic Weisbecker 
8694d13f430SFrederic Weisbecker 	WARN_ON_ONCE(kthread->preferred_affinity);
8704d13f430SFrederic Weisbecker 
8714d13f430SFrederic Weisbecker 	if (!zalloc_cpumask_var(&affinity, GFP_KERNEL))
8724d13f430SFrederic Weisbecker 		return -ENOMEM;
8734d13f430SFrederic Weisbecker 
8744d13f430SFrederic Weisbecker 	kthread->preferred_affinity = kzalloc(sizeof(struct cpumask), GFP_KERNEL);
8754d13f430SFrederic Weisbecker 	if (!kthread->preferred_affinity) {
8764d13f430SFrederic Weisbecker 		ret = -ENOMEM;
8774d13f430SFrederic Weisbecker 		goto out;
8784d13f430SFrederic Weisbecker 	}
8794d13f430SFrederic Weisbecker 
8804d13f430SFrederic Weisbecker 	mutex_lock(&kthreads_hotplug_lock);
8814d13f430SFrederic Weisbecker 	cpumask_copy(kthread->preferred_affinity, mask);
8824d13f430SFrederic Weisbecker 	WARN_ON_ONCE(!list_empty(&kthread->hotplug_node));
8834d13f430SFrederic Weisbecker 	list_add_tail(&kthread->hotplug_node, &kthreads_hotplug);
8844d13f430SFrederic Weisbecker 	kthread_fetch_affinity(kthread, affinity);
8854d13f430SFrederic Weisbecker 
8864d13f430SFrederic Weisbecker 	/* It's safe because the task is inactive. */
8874d13f430SFrederic Weisbecker 	raw_spin_lock_irqsave(&p->pi_lock, flags);
8884d13f430SFrederic Weisbecker 	do_set_cpus_allowed(p, affinity);
8894d13f430SFrederic Weisbecker 	raw_spin_unlock_irqrestore(&p->pi_lock, flags);
8904d13f430SFrederic Weisbecker 
8914d13f430SFrederic Weisbecker 	mutex_unlock(&kthreads_hotplug_lock);
8924d13f430SFrederic Weisbecker out:
8934d13f430SFrederic Weisbecker 	free_cpumask_var(affinity);
8944d13f430SFrederic Weisbecker 
8951b0332a4SYu-Chun Lin 	return ret;
8964d13f430SFrederic Weisbecker }
8974d13f430SFrederic Weisbecker 
898d1a89197SFrederic Weisbecker /*
899d1a89197SFrederic Weisbecker  * Re-affine kthreads according to their preferences
900d1a89197SFrederic Weisbecker  * and the newly online CPU. The CPU down part is handled
901d1a89197SFrederic Weisbecker  * by select_fallback_rq() which default re-affines to
9024d13f430SFrederic Weisbecker  * housekeepers from other nodes in case the preferred
9034d13f430SFrederic Weisbecker  * affinity doesn't apply anymore.
904d1a89197SFrederic Weisbecker  */
kthreads_online_cpu(unsigned int cpu)905d1a89197SFrederic Weisbecker static int kthreads_online_cpu(unsigned int cpu)
906d1a89197SFrederic Weisbecker {
907d1a89197SFrederic Weisbecker 	cpumask_var_t affinity;
908d1a89197SFrederic Weisbecker 	struct kthread *k;
909d1a89197SFrederic Weisbecker 	int ret;
910d1a89197SFrederic Weisbecker 
911d1a89197SFrederic Weisbecker 	guard(mutex)(&kthreads_hotplug_lock);
912d1a89197SFrederic Weisbecker 
913d1a89197SFrederic Weisbecker 	if (list_empty(&kthreads_hotplug))
914d1a89197SFrederic Weisbecker 		return 0;
915d1a89197SFrederic Weisbecker 
916d1a89197SFrederic Weisbecker 	if (!zalloc_cpumask_var(&affinity, GFP_KERNEL))
917d1a89197SFrederic Weisbecker 		return -ENOMEM;
918d1a89197SFrederic Weisbecker 
919d1a89197SFrederic Weisbecker 	ret = 0;
920d1a89197SFrederic Weisbecker 
921d1a89197SFrederic Weisbecker 	list_for_each_entry(k, &kthreads_hotplug, hotplug_node) {
922d1a89197SFrederic Weisbecker 		if (WARN_ON_ONCE((k->task->flags & PF_NO_SETAFFINITY) ||
9234d13f430SFrederic Weisbecker 				 kthread_is_per_cpu(k->task))) {
924d1a89197SFrederic Weisbecker 			ret = -EINVAL;
925d1a89197SFrederic Weisbecker 			continue;
926d1a89197SFrederic Weisbecker 		}
927d1a89197SFrederic Weisbecker 		kthread_fetch_affinity(k, affinity);
928d1a89197SFrederic Weisbecker 		set_cpus_allowed_ptr(k->task, affinity);
929d1a89197SFrederic Weisbecker 	}
930d1a89197SFrederic Weisbecker 
931d1a89197SFrederic Weisbecker 	free_cpumask_var(affinity);
932d1a89197SFrederic Weisbecker 
933d1a89197SFrederic Weisbecker 	return ret;
934d1a89197SFrederic Weisbecker }
935d1a89197SFrederic Weisbecker 
kthreads_init(void)936d1a89197SFrederic Weisbecker static int kthreads_init(void)
937d1a89197SFrederic Weisbecker {
938d1a89197SFrederic Weisbecker 	return cpuhp_setup_state(CPUHP_AP_KTHREADS_ONLINE, "kthreads:online",
939d1a89197SFrederic Weisbecker 				kthreads_online_cpu, NULL);
940d1a89197SFrederic Weisbecker }
941d1a89197SFrederic Weisbecker early_initcall(kthreads_init);
942d1a89197SFrederic Weisbecker 
__kthread_init_worker(struct kthread_worker * worker,const char * name,struct lock_class_key * key)9433989144fSPetr Mladek void __kthread_init_worker(struct kthread_worker *worker,
9444f32e9b1SYong Zhang 				const char *name,
9454f32e9b1SYong Zhang 				struct lock_class_key *key)
9464f32e9b1SYong Zhang {
947dbf52682SPetr Mladek 	memset(worker, 0, sizeof(struct kthread_worker));
948fe99a4f4SJulia Cartwright 	raw_spin_lock_init(&worker->lock);
9494f32e9b1SYong Zhang 	lockdep_set_class_and_name(&worker->lock, key, name);
9504f32e9b1SYong Zhang 	INIT_LIST_HEAD(&worker->work_list);
95122597dc3SPetr Mladek 	INIT_LIST_HEAD(&worker->delayed_work_list);
9524f32e9b1SYong Zhang }
9533989144fSPetr Mladek EXPORT_SYMBOL_GPL(__kthread_init_worker);
9544f32e9b1SYong Zhang 
955b56c0d89STejun Heo /**
956b56c0d89STejun Heo  * kthread_worker_fn - kthread function to process kthread_worker
957b56c0d89STejun Heo  * @worker_ptr: pointer to initialized kthread_worker
958b56c0d89STejun Heo  *
959fbae2d44SPetr Mladek  * This function implements the main cycle of kthread worker. It processes
960fbae2d44SPetr Mladek  * work_list until it is stopped with kthread_stop(). It sleeps when the queue
961fbae2d44SPetr Mladek  * is empty.
962b56c0d89STejun Heo  *
963fbae2d44SPetr Mladek  * The works are not allowed to keep any locks, disable preemption or interrupts
964fbae2d44SPetr Mladek  * when they finish. There is defined a safe point for freezing when one work
965fbae2d44SPetr Mladek  * finishes and before a new one is started.
9668197b3d4SPetr Mladek  *
9678197b3d4SPetr Mladek  * Also the works must not be handled by more than one worker at the same time,
9688197b3d4SPetr Mladek  * see also kthread_queue_work().
969b56c0d89STejun Heo  */
kthread_worker_fn(void * worker_ptr)970b56c0d89STejun Heo int kthread_worker_fn(void *worker_ptr)
971b56c0d89STejun Heo {
972b56c0d89STejun Heo 	struct kthread_worker *worker = worker_ptr;
973b56c0d89STejun Heo 	struct kthread_work *work;
974b56c0d89STejun Heo 
975fbae2d44SPetr Mladek 	/*
976fbae2d44SPetr Mladek 	 * FIXME: Update the check and remove the assignment when all kthread
977fbae2d44SPetr Mladek 	 * worker users are created using kthread_create_worker*() functions.
978fbae2d44SPetr Mladek 	 */
979fbae2d44SPetr Mladek 	WARN_ON(worker->task && worker->task != current);
980b56c0d89STejun Heo 	worker->task = current;
981dbf52682SPetr Mladek 
982dbf52682SPetr Mladek 	if (worker->flags & KTW_FREEZABLE)
983dbf52682SPetr Mladek 		set_freezable();
984dbf52682SPetr Mladek 
985b56c0d89STejun Heo repeat:
986b56c0d89STejun Heo 	set_current_state(TASK_INTERRUPTIBLE);	/* mb paired w/ kthread_stop */
987b56c0d89STejun Heo 
988b56c0d89STejun Heo 	if (kthread_should_stop()) {
989b56c0d89STejun Heo 		__set_current_state(TASK_RUNNING);
990fe99a4f4SJulia Cartwright 		raw_spin_lock_irq(&worker->lock);
991b56c0d89STejun Heo 		worker->task = NULL;
992fe99a4f4SJulia Cartwright 		raw_spin_unlock_irq(&worker->lock);
993b56c0d89STejun Heo 		return 0;
994b56c0d89STejun Heo 	}
995b56c0d89STejun Heo 
996b56c0d89STejun Heo 	work = NULL;
997fe99a4f4SJulia Cartwright 	raw_spin_lock_irq(&worker->lock);
998b56c0d89STejun Heo 	if (!list_empty(&worker->work_list)) {
999b56c0d89STejun Heo 		work = list_first_entry(&worker->work_list,
1000b56c0d89STejun Heo 					struct kthread_work, node);
1001b56c0d89STejun Heo 		list_del_init(&work->node);
1002b56c0d89STejun Heo 	}
100346f3d976STejun Heo 	worker->current_work = work;
1004fe99a4f4SJulia Cartwright 	raw_spin_unlock_irq(&worker->lock);
1005b56c0d89STejun Heo 
1006b56c0d89STejun Heo 	if (work) {
1007f630c7c6SRob Clark 		kthread_work_func_t func = work->func;
1008b56c0d89STejun Heo 		__set_current_state(TASK_RUNNING);
1009f630c7c6SRob Clark 		trace_sched_kthread_work_execute_start(work);
1010b56c0d89STejun Heo 		work->func(work);
1011f630c7c6SRob Clark 		/*
1012f630c7c6SRob Clark 		 * Avoid dereferencing work after this point.  The trace
1013f630c7c6SRob Clark 		 * event only cares about the address.
1014f630c7c6SRob Clark 		 */
1015f630c7c6SRob Clark 		trace_sched_kthread_work_execute_end(work, func);
10166b9ccbc0SChen Yu 	} else if (!freezing(current)) {
1017b56c0d89STejun Heo 		schedule();
10186b9ccbc0SChen Yu 	} else {
10196b9ccbc0SChen Yu 		/*
10206b9ccbc0SChen Yu 		 * Handle the case where the current remains
10216b9ccbc0SChen Yu 		 * TASK_INTERRUPTIBLE. try_to_freeze() expects
10226b9ccbc0SChen Yu 		 * the current to be TASK_RUNNING.
10236b9ccbc0SChen Yu 		 */
10246b9ccbc0SChen Yu 		__set_current_state(TASK_RUNNING);
10256b9ccbc0SChen Yu 	}
1026b56c0d89STejun Heo 
1027b56c0d89STejun Heo 	try_to_freeze();
102822cf8bc6SShaohua Li 	cond_resched();
1029b56c0d89STejun Heo 	goto repeat;
1030b56c0d89STejun Heo }
1031b56c0d89STejun Heo EXPORT_SYMBOL_GPL(kthread_worker_fn);
1032b56c0d89STejun Heo 
1033c0b942a7SNicolas Iooss static __printf(3, 0) struct kthread_worker *
__kthread_create_worker_on_node(unsigned int flags,int node,const char namefmt[],va_list args)103441f70d8eSFrederic Weisbecker __kthread_create_worker_on_node(unsigned int flags, int node,
1035dbf52682SPetr Mladek 				const char namefmt[], va_list args)
1036fbae2d44SPetr Mladek {
1037fbae2d44SPetr Mladek 	struct kthread_worker *worker;
1038fbae2d44SPetr Mladek 	struct task_struct *task;
1039fbae2d44SPetr Mladek 
1040fbae2d44SPetr Mladek 	worker = kzalloc(sizeof(*worker), GFP_KERNEL);
1041fbae2d44SPetr Mladek 	if (!worker)
1042fbae2d44SPetr Mladek 		return ERR_PTR(-ENOMEM);
1043fbae2d44SPetr Mladek 
1044fbae2d44SPetr Mladek 	kthread_init_worker(worker);
1045fbae2d44SPetr Mladek 
1046fbae2d44SPetr Mladek 	task = __kthread_create_on_node(kthread_worker_fn, worker,
10478fb9dcbdSOleg Nesterov 					node, namefmt, args);
1048fbae2d44SPetr Mladek 	if (IS_ERR(task))
1049fbae2d44SPetr Mladek 		goto fail_task;
1050fbae2d44SPetr Mladek 
1051dbf52682SPetr Mladek 	worker->flags = flags;
1052fbae2d44SPetr Mladek 	worker->task = task;
105341f70d8eSFrederic Weisbecker 
1054fbae2d44SPetr Mladek 	return worker;
1055fbae2d44SPetr Mladek 
1056fbae2d44SPetr Mladek fail_task:
1057fbae2d44SPetr Mladek 	kfree(worker);
1058fbae2d44SPetr Mladek 	return ERR_CAST(task);
1059fbae2d44SPetr Mladek }
1060fbae2d44SPetr Mladek 
1061fbae2d44SPetr Mladek /**
1062d8b4bf4eSRandy Dunlap  * kthread_create_worker_on_node - create a kthread worker
1063dbf52682SPetr Mladek  * @flags: flags modifying the default behavior of the worker
106441f70d8eSFrederic Weisbecker  * @node: task structure for the thread is allocated on this node
1065fbae2d44SPetr Mladek  * @namefmt: printf-style name for the kthread worker (task).
1066fbae2d44SPetr Mladek  *
1067fbae2d44SPetr Mladek  * Returns a pointer to the allocated worker on success, ERR_PTR(-ENOMEM)
1068fbae2d44SPetr Mladek  * when the needed structures could not get allocated, and ERR_PTR(-EINTR)
1069d25c83c6SPetr Mladek  * when the caller was killed by a fatal signal.
1070fbae2d44SPetr Mladek  */
1071fbae2d44SPetr Mladek struct kthread_worker *
kthread_create_worker_on_node(unsigned int flags,int node,const char namefmt[],...)107241f70d8eSFrederic Weisbecker kthread_create_worker_on_node(unsigned int flags, int node, const char namefmt[], ...)
1073fbae2d44SPetr Mladek {
1074fbae2d44SPetr Mladek 	struct kthread_worker *worker;
1075fbae2d44SPetr Mladek 	va_list args;
1076fbae2d44SPetr Mladek 
1077fbae2d44SPetr Mladek 	va_start(args, namefmt);
107841f70d8eSFrederic Weisbecker 	worker = __kthread_create_worker_on_node(flags, node, namefmt, args);
1079fbae2d44SPetr Mladek 	va_end(args);
1080fbae2d44SPetr Mladek 
1081fbae2d44SPetr Mladek 	return worker;
1082fbae2d44SPetr Mladek }
108341f70d8eSFrederic Weisbecker EXPORT_SYMBOL(kthread_create_worker_on_node);
1084fbae2d44SPetr Mladek 
1085fbae2d44SPetr Mladek /**
1086fbae2d44SPetr Mladek  * kthread_create_worker_on_cpu - create a kthread worker and bind it
10877b7b8a2cSRandy Dunlap  *	to a given CPU and the associated NUMA node.
1088fbae2d44SPetr Mladek  * @cpu: CPU number
1089dbf52682SPetr Mladek  * @flags: flags modifying the default behavior of the worker
109041f70d8eSFrederic Weisbecker  * @namefmt: printf-style name for the thread. Format is restricted
109141f70d8eSFrederic Weisbecker  *	     to "name.*%u". Code fills in cpu number.
1092fbae2d44SPetr Mladek  *
1093fbae2d44SPetr Mladek  * Use a valid CPU number if you want to bind the kthread worker
1094fbae2d44SPetr Mladek  * to the given CPU and the associated NUMA node.
1095fbae2d44SPetr Mladek  *
1096fbae2d44SPetr Mladek  * A good practice is to add the cpu number also into the worker name.
1097fbae2d44SPetr Mladek  * For example, use kthread_create_worker_on_cpu(cpu, "helper/%d", cpu).
1098fbae2d44SPetr Mladek  *
1099ebb2bdceSPetr Mladek  * CPU hotplug:
1100ebb2bdceSPetr Mladek  * The kthread worker API is simple and generic. It just provides a way
1101ebb2bdceSPetr Mladek  * to create, use, and destroy workers.
1102ebb2bdceSPetr Mladek  *
1103ebb2bdceSPetr Mladek  * It is up to the API user how to handle CPU hotplug. They have to decide
1104ebb2bdceSPetr Mladek  * how to handle pending work items, prevent queuing new ones, and
1105ebb2bdceSPetr Mladek  * restore the functionality when the CPU goes off and on. There are a
1106ebb2bdceSPetr Mladek  * few catches:
1107ebb2bdceSPetr Mladek  *
1108ebb2bdceSPetr Mladek  *    - CPU affinity gets lost when it is scheduled on an offline CPU.
1109ebb2bdceSPetr Mladek  *
1110ebb2bdceSPetr Mladek  *    - The worker might not exist when the CPU was off when the user
1111ebb2bdceSPetr Mladek  *      created the workers.
1112ebb2bdceSPetr Mladek  *
1113ebb2bdceSPetr Mladek  * Good practice is to implement two CPU hotplug callbacks and to
1114ebb2bdceSPetr Mladek  * destroy/create the worker when the CPU goes down/up.
1115ebb2bdceSPetr Mladek  *
1116ebb2bdceSPetr Mladek  * Return:
1117ebb2bdceSPetr Mladek  * The pointer to the allocated worker on success, ERR_PTR(-ENOMEM)
1118fbae2d44SPetr Mladek  * when the needed structures could not get allocated, and ERR_PTR(-EINTR)
1119d25c83c6SPetr Mladek  * when the caller was killed by a fatal signal.
1120fbae2d44SPetr Mladek  */
1121fbae2d44SPetr Mladek struct kthread_worker *
kthread_create_worker_on_cpu(int cpu,unsigned int flags,const char namefmt[])1122dbf52682SPetr Mladek kthread_create_worker_on_cpu(int cpu, unsigned int flags,
112341f70d8eSFrederic Weisbecker 			     const char namefmt[])
1124fbae2d44SPetr Mladek {
1125fbae2d44SPetr Mladek 	struct kthread_worker *worker;
1126fbae2d44SPetr Mladek 
1127b04e317bSFrederic Weisbecker 	worker = kthread_create_worker_on_node(flags, cpu_to_node(cpu), namefmt, cpu);
1128b04e317bSFrederic Weisbecker 	if (!IS_ERR(worker))
1129b04e317bSFrederic Weisbecker 		kthread_bind(worker->task, cpu);
1130fbae2d44SPetr Mladek 
1131fbae2d44SPetr Mladek 	return worker;
1132fbae2d44SPetr Mladek }
1133fbae2d44SPetr Mladek EXPORT_SYMBOL(kthread_create_worker_on_cpu);
1134fbae2d44SPetr Mladek 
113537be45d4SPetr Mladek /*
113637be45d4SPetr Mladek  * Returns true when the work could not be queued at the moment.
113737be45d4SPetr Mladek  * It happens when it is already pending in a worker list
113837be45d4SPetr Mladek  * or when it is being cancelled.
113937be45d4SPetr Mladek  */
queuing_blocked(struct kthread_worker * worker,struct kthread_work * work)114037be45d4SPetr Mladek static inline bool queuing_blocked(struct kthread_worker *worker,
114137be45d4SPetr Mladek 				   struct kthread_work *work)
114237be45d4SPetr Mladek {
114337be45d4SPetr Mladek 	lockdep_assert_held(&worker->lock);
114437be45d4SPetr Mladek 
114537be45d4SPetr Mladek 	return !list_empty(&work->node) || work->canceling;
114637be45d4SPetr Mladek }
114737be45d4SPetr Mladek 
kthread_insert_work_sanity_check(struct kthread_worker * worker,struct kthread_work * work)11488197b3d4SPetr Mladek static void kthread_insert_work_sanity_check(struct kthread_worker *worker,
11498197b3d4SPetr Mladek 					     struct kthread_work *work)
11508197b3d4SPetr Mladek {
11518197b3d4SPetr Mladek 	lockdep_assert_held(&worker->lock);
11528197b3d4SPetr Mladek 	WARN_ON_ONCE(!list_empty(&work->node));
11538197b3d4SPetr Mladek 	/* Do not use a work with >1 worker, see kthread_queue_work() */
11548197b3d4SPetr Mladek 	WARN_ON_ONCE(work->worker && work->worker != worker);
11558197b3d4SPetr Mladek }
11568197b3d4SPetr Mladek 
11579a2e03d8STejun Heo /* insert @work before @pos in @worker */
kthread_insert_work(struct kthread_worker * worker,struct kthread_work * work,struct list_head * pos)11583989144fSPetr Mladek static void kthread_insert_work(struct kthread_worker *worker,
11599a2e03d8STejun Heo 				struct kthread_work *work,
11609a2e03d8STejun Heo 				struct list_head *pos)
11619a2e03d8STejun Heo {
11628197b3d4SPetr Mladek 	kthread_insert_work_sanity_check(worker, work);
11639a2e03d8STejun Heo 
1164f630c7c6SRob Clark 	trace_sched_kthread_work_queue_work(worker, work);
1165f630c7c6SRob Clark 
11669a2e03d8STejun Heo 	list_add_tail(&work->node, pos);
116746f3d976STejun Heo 	work->worker = worker;
1168ed1403ecSLai Jiangshan 	if (!worker->current_work && likely(worker->task))
11699a2e03d8STejun Heo 		wake_up_process(worker->task);
11709a2e03d8STejun Heo }
11719a2e03d8STejun Heo 
1172b56c0d89STejun Heo /**
11733989144fSPetr Mladek  * kthread_queue_work - queue a kthread_work
1174b56c0d89STejun Heo  * @worker: target kthread_worker
1175b56c0d89STejun Heo  * @work: kthread_work to queue
1176b56c0d89STejun Heo  *
1177b56c0d89STejun Heo  * Queue @work to work processor @task for async execution.  @task
117897549ce6STio Zhang  * must have been created with kthread_create_worker().  Returns %true
1179b56c0d89STejun Heo  * if @work was successfully queued, %false if it was already pending.
11808197b3d4SPetr Mladek  *
11818197b3d4SPetr Mladek  * Reinitialize the work if it needs to be used by another worker.
11828197b3d4SPetr Mladek  * For example, when the worker was stopped and started again.
1183b56c0d89STejun Heo  */
kthread_queue_work(struct kthread_worker * worker,struct kthread_work * work)11843989144fSPetr Mladek bool kthread_queue_work(struct kthread_worker *worker,
1185b56c0d89STejun Heo 			struct kthread_work *work)
1186b56c0d89STejun Heo {
1187b56c0d89STejun Heo 	bool ret = false;
1188b56c0d89STejun Heo 	unsigned long flags;
1189b56c0d89STejun Heo 
1190fe99a4f4SJulia Cartwright 	raw_spin_lock_irqsave(&worker->lock, flags);
119137be45d4SPetr Mladek 	if (!queuing_blocked(worker, work)) {
11923989144fSPetr Mladek 		kthread_insert_work(worker, work, &worker->work_list);
1193b56c0d89STejun Heo 		ret = true;
1194b56c0d89STejun Heo 	}
1195fe99a4f4SJulia Cartwright 	raw_spin_unlock_irqrestore(&worker->lock, flags);
1196b56c0d89STejun Heo 	return ret;
1197b56c0d89STejun Heo }
11983989144fSPetr Mladek EXPORT_SYMBOL_GPL(kthread_queue_work);
1199b56c0d89STejun Heo 
120022597dc3SPetr Mladek /**
120122597dc3SPetr Mladek  * kthread_delayed_work_timer_fn - callback that queues the associated kthread
120222597dc3SPetr Mladek  *	delayed work when the timer expires.
1203fe5c3b69SKees Cook  * @t: pointer to the expired timer
120422597dc3SPetr Mladek  *
120522597dc3SPetr Mladek  * The format of the function is defined by struct timer_list.
120622597dc3SPetr Mladek  * It should have been called from irqsafe timer with irq already off.
120722597dc3SPetr Mladek  */
kthread_delayed_work_timer_fn(struct timer_list * t)1208fe5c3b69SKees Cook void kthread_delayed_work_timer_fn(struct timer_list *t)
120922597dc3SPetr Mladek {
1210fe5c3b69SKees Cook 	struct kthread_delayed_work *dwork = from_timer(dwork, t, timer);
121122597dc3SPetr Mladek 	struct kthread_work *work = &dwork->work;
121222597dc3SPetr Mladek 	struct kthread_worker *worker = work->worker;
1213ad01423aSSebastian Andrzej Siewior 	unsigned long flags;
121422597dc3SPetr Mladek 
121522597dc3SPetr Mladek 	/*
121622597dc3SPetr Mladek 	 * This might happen when a pending work is reinitialized.
121722597dc3SPetr Mladek 	 * It means that it is used a wrong way.
121822597dc3SPetr Mladek 	 */
121922597dc3SPetr Mladek 	if (WARN_ON_ONCE(!worker))
122022597dc3SPetr Mladek 		return;
122122597dc3SPetr Mladek 
1222ad01423aSSebastian Andrzej Siewior 	raw_spin_lock_irqsave(&worker->lock, flags);
122322597dc3SPetr Mladek 	/* Work must not be used with >1 worker, see kthread_queue_work(). */
122422597dc3SPetr Mladek 	WARN_ON_ONCE(work->worker != worker);
122522597dc3SPetr Mladek 
122622597dc3SPetr Mladek 	/* Move the work from worker->delayed_work_list. */
122722597dc3SPetr Mladek 	WARN_ON_ONCE(list_empty(&work->node));
122822597dc3SPetr Mladek 	list_del_init(&work->node);
12296993d0fdSZqiang 	if (!work->canceling)
123022597dc3SPetr Mladek 		kthread_insert_work(worker, work, &worker->work_list);
123122597dc3SPetr Mladek 
1232ad01423aSSebastian Andrzej Siewior 	raw_spin_unlock_irqrestore(&worker->lock, flags);
123322597dc3SPetr Mladek }
123422597dc3SPetr Mladek EXPORT_SYMBOL(kthread_delayed_work_timer_fn);
123522597dc3SPetr Mladek 
__kthread_queue_delayed_work(struct kthread_worker * worker,struct kthread_delayed_work * dwork,unsigned long delay)1236bc88f85cSBen Dooks static void __kthread_queue_delayed_work(struct kthread_worker *worker,
123722597dc3SPetr Mladek 					 struct kthread_delayed_work *dwork,
123822597dc3SPetr Mladek 					 unsigned long delay)
123922597dc3SPetr Mladek {
124022597dc3SPetr Mladek 	struct timer_list *timer = &dwork->timer;
124122597dc3SPetr Mladek 	struct kthread_work *work = &dwork->work;
124222597dc3SPetr Mladek 
12434b243563SSami Tolvanen 	WARN_ON_ONCE(timer->function != kthread_delayed_work_timer_fn);
124422597dc3SPetr Mladek 
124522597dc3SPetr Mladek 	/*
124622597dc3SPetr Mladek 	 * If @delay is 0, queue @dwork->work immediately.  This is for
124722597dc3SPetr Mladek 	 * both optimization and correctness.  The earliest @timer can
124822597dc3SPetr Mladek 	 * expire is on the closest next tick and delayed_work users depend
124922597dc3SPetr Mladek 	 * on that there's no such delay when @delay is 0.
125022597dc3SPetr Mladek 	 */
125122597dc3SPetr Mladek 	if (!delay) {
125222597dc3SPetr Mladek 		kthread_insert_work(worker, work, &worker->work_list);
125322597dc3SPetr Mladek 		return;
125422597dc3SPetr Mladek 	}
125522597dc3SPetr Mladek 
125622597dc3SPetr Mladek 	/* Be paranoid and try to detect possible races already now. */
125722597dc3SPetr Mladek 	kthread_insert_work_sanity_check(worker, work);
125822597dc3SPetr Mladek 
125922597dc3SPetr Mladek 	list_add(&work->node, &worker->delayed_work_list);
126022597dc3SPetr Mladek 	work->worker = worker;
126122597dc3SPetr Mladek 	timer->expires = jiffies + delay;
126222597dc3SPetr Mladek 	add_timer(timer);
126322597dc3SPetr Mladek }
126422597dc3SPetr Mladek 
126522597dc3SPetr Mladek /**
126622597dc3SPetr Mladek  * kthread_queue_delayed_work - queue the associated kthread work
126722597dc3SPetr Mladek  *	after a delay.
126822597dc3SPetr Mladek  * @worker: target kthread_worker
126922597dc3SPetr Mladek  * @dwork: kthread_delayed_work to queue
127022597dc3SPetr Mladek  * @delay: number of jiffies to wait before queuing
127122597dc3SPetr Mladek  *
127222597dc3SPetr Mladek  * If the work has not been pending it starts a timer that will queue
127322597dc3SPetr Mladek  * the work after the given @delay. If @delay is zero, it queues the
127422597dc3SPetr Mladek  * work immediately.
127522597dc3SPetr Mladek  *
127622597dc3SPetr Mladek  * Return: %false if the @work has already been pending. It means that
127722597dc3SPetr Mladek  * either the timer was running or the work was queued. It returns %true
127822597dc3SPetr Mladek  * otherwise.
127922597dc3SPetr Mladek  */
kthread_queue_delayed_work(struct kthread_worker * worker,struct kthread_delayed_work * dwork,unsigned long delay)128022597dc3SPetr Mladek bool kthread_queue_delayed_work(struct kthread_worker *worker,
128122597dc3SPetr Mladek 				struct kthread_delayed_work *dwork,
128222597dc3SPetr Mladek 				unsigned long delay)
128322597dc3SPetr Mladek {
128422597dc3SPetr Mladek 	struct kthread_work *work = &dwork->work;
128522597dc3SPetr Mladek 	unsigned long flags;
128622597dc3SPetr Mladek 	bool ret = false;
128722597dc3SPetr Mladek 
1288fe99a4f4SJulia Cartwright 	raw_spin_lock_irqsave(&worker->lock, flags);
128922597dc3SPetr Mladek 
129037be45d4SPetr Mladek 	if (!queuing_blocked(worker, work)) {
129122597dc3SPetr Mladek 		__kthread_queue_delayed_work(worker, dwork, delay);
129222597dc3SPetr Mladek 		ret = true;
129322597dc3SPetr Mladek 	}
129422597dc3SPetr Mladek 
1295fe99a4f4SJulia Cartwright 	raw_spin_unlock_irqrestore(&worker->lock, flags);
129622597dc3SPetr Mladek 	return ret;
129722597dc3SPetr Mladek }
129822597dc3SPetr Mladek EXPORT_SYMBOL_GPL(kthread_queue_delayed_work);
129922597dc3SPetr Mladek 
13009a2e03d8STejun Heo struct kthread_flush_work {
13019a2e03d8STejun Heo 	struct kthread_work	work;
13029a2e03d8STejun Heo 	struct completion	done;
13039a2e03d8STejun Heo };
13049a2e03d8STejun Heo 
kthread_flush_work_fn(struct kthread_work * work)13059a2e03d8STejun Heo static void kthread_flush_work_fn(struct kthread_work *work)
13069a2e03d8STejun Heo {
13079a2e03d8STejun Heo 	struct kthread_flush_work *fwork =
13089a2e03d8STejun Heo 		container_of(work, struct kthread_flush_work, work);
13099a2e03d8STejun Heo 	complete(&fwork->done);
13109a2e03d8STejun Heo }
13119a2e03d8STejun Heo 
1312b56c0d89STejun Heo /**
13133989144fSPetr Mladek  * kthread_flush_work - flush a kthread_work
1314b56c0d89STejun Heo  * @work: work to flush
1315b56c0d89STejun Heo  *
1316b56c0d89STejun Heo  * If @work is queued or executing, wait for it to finish execution.
1317b56c0d89STejun Heo  */
kthread_flush_work(struct kthread_work * work)13183989144fSPetr Mladek void kthread_flush_work(struct kthread_work *work)
1319b56c0d89STejun Heo {
132046f3d976STejun Heo 	struct kthread_flush_work fwork = {
132146f3d976STejun Heo 		KTHREAD_WORK_INIT(fwork.work, kthread_flush_work_fn),
132246f3d976STejun Heo 		COMPLETION_INITIALIZER_ONSTACK(fwork.done),
132346f3d976STejun Heo 	};
132446f3d976STejun Heo 	struct kthread_worker *worker;
132546f3d976STejun Heo 	bool noop = false;
1326b56c0d89STejun Heo 
132746f3d976STejun Heo 	worker = work->worker;
132846f3d976STejun Heo 	if (!worker)
132946f3d976STejun Heo 		return;
1330b56c0d89STejun Heo 
1331fe99a4f4SJulia Cartwright 	raw_spin_lock_irq(&worker->lock);
13328197b3d4SPetr Mladek 	/* Work must not be used with >1 worker, see kthread_queue_work(). */
13338197b3d4SPetr Mladek 	WARN_ON_ONCE(work->worker != worker);
1334b56c0d89STejun Heo 
133546f3d976STejun Heo 	if (!list_empty(&work->node))
13363989144fSPetr Mladek 		kthread_insert_work(worker, &fwork.work, work->node.next);
133746f3d976STejun Heo 	else if (worker->current_work == work)
13383989144fSPetr Mladek 		kthread_insert_work(worker, &fwork.work,
13393989144fSPetr Mladek 				    worker->work_list.next);
134046f3d976STejun Heo 	else
134146f3d976STejun Heo 		noop = true;
1342b56c0d89STejun Heo 
1343fe99a4f4SJulia Cartwright 	raw_spin_unlock_irq(&worker->lock);
134446f3d976STejun Heo 
134546f3d976STejun Heo 	if (!noop)
134646f3d976STejun Heo 		wait_for_completion(&fwork.done);
1347b56c0d89STejun Heo }
13483989144fSPetr Mladek EXPORT_SYMBOL_GPL(kthread_flush_work);
1349b56c0d89STejun Heo 
135037be45d4SPetr Mladek /*
135134b3d534SPetr Mladek  * Make sure that the timer is neither set nor running and could
135234b3d534SPetr Mladek  * not manipulate the work list_head any longer.
135337be45d4SPetr Mladek  *
135434b3d534SPetr Mladek  * The function is called under worker->lock. The lock is temporary
135534b3d534SPetr Mladek  * released but the timer can't be set again in the meantime.
135637be45d4SPetr Mladek  */
kthread_cancel_delayed_work_timer(struct kthread_work * work,unsigned long * flags)135734b3d534SPetr Mladek static void kthread_cancel_delayed_work_timer(struct kthread_work *work,
135837be45d4SPetr Mladek 					      unsigned long *flags)
135937be45d4SPetr Mladek {
136037be45d4SPetr Mladek 	struct kthread_delayed_work *dwork =
136137be45d4SPetr Mladek 		container_of(work, struct kthread_delayed_work, work);
136237be45d4SPetr Mladek 	struct kthread_worker *worker = work->worker;
136337be45d4SPetr Mladek 
136437be45d4SPetr Mladek 	/*
1365*8fa7292fSThomas Gleixner 	 * timer_delete_sync() must be called to make sure that the timer
136637be45d4SPetr Mladek 	 * callback is not running. The lock must be temporary released
136737be45d4SPetr Mladek 	 * to avoid a deadlock with the callback. In the meantime,
136837be45d4SPetr Mladek 	 * any queuing is blocked by setting the canceling counter.
136937be45d4SPetr Mladek 	 */
137037be45d4SPetr Mladek 	work->canceling++;
1371fe99a4f4SJulia Cartwright 	raw_spin_unlock_irqrestore(&worker->lock, *flags);
1372*8fa7292fSThomas Gleixner 	timer_delete_sync(&dwork->timer);
1373fe99a4f4SJulia Cartwright 	raw_spin_lock_irqsave(&worker->lock, *flags);
137437be45d4SPetr Mladek 	work->canceling--;
137537be45d4SPetr Mladek }
137637be45d4SPetr Mladek 
137737be45d4SPetr Mladek /*
13785fa54346SPetr Mladek  * This function removes the work from the worker queue.
13795fa54346SPetr Mladek  *
13805fa54346SPetr Mladek  * It is called under worker->lock. The caller must make sure that
13815fa54346SPetr Mladek  * the timer used by delayed work is not running, e.g. by calling
13825fa54346SPetr Mladek  * kthread_cancel_delayed_work_timer().
138334b3d534SPetr Mladek  *
138434b3d534SPetr Mladek  * The work might still be in use when this function finishes. See the
138534b3d534SPetr Mladek  * current_work proceed by the worker.
138634b3d534SPetr Mladek  *
138734b3d534SPetr Mladek  * Return: %true if @work was pending and successfully canceled,
138834b3d534SPetr Mladek  *	%false if @work was not pending
138934b3d534SPetr Mladek  */
__kthread_cancel_work(struct kthread_work * work)13905fa54346SPetr Mladek static bool __kthread_cancel_work(struct kthread_work *work)
139134b3d534SPetr Mladek {
139234b3d534SPetr Mladek 	/*
139337be45d4SPetr Mladek 	 * Try to remove the work from a worker list. It might either
139437be45d4SPetr Mladek 	 * be from worker->work_list or from worker->delayed_work_list.
139537be45d4SPetr Mladek 	 */
139637be45d4SPetr Mladek 	if (!list_empty(&work->node)) {
139737be45d4SPetr Mladek 		list_del_init(&work->node);
139837be45d4SPetr Mladek 		return true;
139937be45d4SPetr Mladek 	}
140037be45d4SPetr Mladek 
140137be45d4SPetr Mladek 	return false;
140237be45d4SPetr Mladek }
140337be45d4SPetr Mladek 
14049a6b06c8SPetr Mladek /**
14059a6b06c8SPetr Mladek  * kthread_mod_delayed_work - modify delay of or queue a kthread delayed work
14069a6b06c8SPetr Mladek  * @worker: kthread worker to use
14079a6b06c8SPetr Mladek  * @dwork: kthread delayed work to queue
14089a6b06c8SPetr Mladek  * @delay: number of jiffies to wait before queuing
14099a6b06c8SPetr Mladek  *
14109a6b06c8SPetr Mladek  * If @dwork is idle, equivalent to kthread_queue_delayed_work(). Otherwise,
14119a6b06c8SPetr Mladek  * modify @dwork's timer so that it expires after @delay. If @delay is zero,
14129a6b06c8SPetr Mladek  * @work is guaranteed to be queued immediately.
14139a6b06c8SPetr Mladek  *
1414d71ba164SPetr Mladek  * Return: %false if @dwork was idle and queued, %true otherwise.
14159a6b06c8SPetr Mladek  *
14169a6b06c8SPetr Mladek  * A special case is when the work is being canceled in parallel.
14179a6b06c8SPetr Mladek  * It might be caused either by the real kthread_cancel_delayed_work_sync()
14189a6b06c8SPetr Mladek  * or yet another kthread_mod_delayed_work() call. We let the other command
1419d71ba164SPetr Mladek  * win and return %true here. The return value can be used for reference
1420d71ba164SPetr Mladek  * counting and the number of queued works stays the same. Anyway, the caller
1421d71ba164SPetr Mladek  * is supposed to synchronize these operations a reasonable way.
14229a6b06c8SPetr Mladek  *
14239a6b06c8SPetr Mladek  * This function is safe to call from any context including IRQ handler.
14249a6b06c8SPetr Mladek  * See __kthread_cancel_work() and kthread_delayed_work_timer_fn()
14259a6b06c8SPetr Mladek  * for details.
14269a6b06c8SPetr Mladek  */
kthread_mod_delayed_work(struct kthread_worker * worker,struct kthread_delayed_work * dwork,unsigned long delay)14279a6b06c8SPetr Mladek bool kthread_mod_delayed_work(struct kthread_worker *worker,
14289a6b06c8SPetr Mladek 			      struct kthread_delayed_work *dwork,
14299a6b06c8SPetr Mladek 			      unsigned long delay)
14309a6b06c8SPetr Mladek {
14319a6b06c8SPetr Mladek 	struct kthread_work *work = &dwork->work;
14329a6b06c8SPetr Mladek 	unsigned long flags;
1433d71ba164SPetr Mladek 	int ret;
14349a6b06c8SPetr Mladek 
1435fe99a4f4SJulia Cartwright 	raw_spin_lock_irqsave(&worker->lock, flags);
14369a6b06c8SPetr Mladek 
14379a6b06c8SPetr Mladek 	/* Do not bother with canceling when never queued. */
1438d71ba164SPetr Mladek 	if (!work->worker) {
1439d71ba164SPetr Mladek 		ret = false;
14409a6b06c8SPetr Mladek 		goto fast_queue;
1441d71ba164SPetr Mladek 	}
14429a6b06c8SPetr Mladek 
14439a6b06c8SPetr Mladek 	/* Work must not be used with >1 worker, see kthread_queue_work() */
14449a6b06c8SPetr Mladek 	WARN_ON_ONCE(work->worker != worker);
14459a6b06c8SPetr Mladek 
14465fa54346SPetr Mladek 	/*
14475fa54346SPetr Mladek 	 * Temporary cancel the work but do not fight with another command
14485fa54346SPetr Mladek 	 * that is canceling the work as well.
14495fa54346SPetr Mladek 	 *
14505fa54346SPetr Mladek 	 * It is a bit tricky because of possible races with another
14515fa54346SPetr Mladek 	 * mod_delayed_work() and cancel_delayed_work() callers.
14525fa54346SPetr Mladek 	 *
14535fa54346SPetr Mladek 	 * The timer must be canceled first because worker->lock is released
14545fa54346SPetr Mladek 	 * when doing so. But the work can be removed from the queue (list)
14555fa54346SPetr Mladek 	 * only when it can be queued again so that the return value can
14565fa54346SPetr Mladek 	 * be used for reference counting.
14575fa54346SPetr Mladek 	 */
14585fa54346SPetr Mladek 	kthread_cancel_delayed_work_timer(work, &flags);
1459d71ba164SPetr Mladek 	if (work->canceling) {
1460d71ba164SPetr Mladek 		/* The number of works in the queue does not change. */
1461d71ba164SPetr Mladek 		ret = true;
14629a6b06c8SPetr Mladek 		goto out;
1463d71ba164SPetr Mladek 	}
14645fa54346SPetr Mladek 	ret = __kthread_cancel_work(work);
14659a6b06c8SPetr Mladek 
14669a6b06c8SPetr Mladek fast_queue:
14679a6b06c8SPetr Mladek 	__kthread_queue_delayed_work(worker, dwork, delay);
14689a6b06c8SPetr Mladek out:
1469fe99a4f4SJulia Cartwright 	raw_spin_unlock_irqrestore(&worker->lock, flags);
14709a6b06c8SPetr Mladek 	return ret;
14719a6b06c8SPetr Mladek }
14729a6b06c8SPetr Mladek EXPORT_SYMBOL_GPL(kthread_mod_delayed_work);
14739a6b06c8SPetr Mladek 
__kthread_cancel_work_sync(struct kthread_work * work,bool is_dwork)147437be45d4SPetr Mladek static bool __kthread_cancel_work_sync(struct kthread_work *work, bool is_dwork)
147537be45d4SPetr Mladek {
147637be45d4SPetr Mladek 	struct kthread_worker *worker = work->worker;
147737be45d4SPetr Mladek 	unsigned long flags;
147837be45d4SPetr Mladek 	int ret = false;
147937be45d4SPetr Mladek 
148037be45d4SPetr Mladek 	if (!worker)
148137be45d4SPetr Mladek 		goto out;
148237be45d4SPetr Mladek 
1483fe99a4f4SJulia Cartwright 	raw_spin_lock_irqsave(&worker->lock, flags);
148437be45d4SPetr Mladek 	/* Work must not be used with >1 worker, see kthread_queue_work(). */
148537be45d4SPetr Mladek 	WARN_ON_ONCE(work->worker != worker);
148637be45d4SPetr Mladek 
14875fa54346SPetr Mladek 	if (is_dwork)
14885fa54346SPetr Mladek 		kthread_cancel_delayed_work_timer(work, &flags);
14895fa54346SPetr Mladek 
14905fa54346SPetr Mladek 	ret = __kthread_cancel_work(work);
149137be45d4SPetr Mladek 
149237be45d4SPetr Mladek 	if (worker->current_work != work)
149337be45d4SPetr Mladek 		goto out_fast;
149437be45d4SPetr Mladek 
149537be45d4SPetr Mladek 	/*
149637be45d4SPetr Mladek 	 * The work is in progress and we need to wait with the lock released.
149737be45d4SPetr Mladek 	 * In the meantime, block any queuing by setting the canceling counter.
149837be45d4SPetr Mladek 	 */
149937be45d4SPetr Mladek 	work->canceling++;
1500fe99a4f4SJulia Cartwright 	raw_spin_unlock_irqrestore(&worker->lock, flags);
150137be45d4SPetr Mladek 	kthread_flush_work(work);
1502fe99a4f4SJulia Cartwright 	raw_spin_lock_irqsave(&worker->lock, flags);
150337be45d4SPetr Mladek 	work->canceling--;
150437be45d4SPetr Mladek 
150537be45d4SPetr Mladek out_fast:
1506fe99a4f4SJulia Cartwright 	raw_spin_unlock_irqrestore(&worker->lock, flags);
150737be45d4SPetr Mladek out:
150837be45d4SPetr Mladek 	return ret;
150937be45d4SPetr Mladek }
151037be45d4SPetr Mladek 
151137be45d4SPetr Mladek /**
151237be45d4SPetr Mladek  * kthread_cancel_work_sync - cancel a kthread work and wait for it to finish
151337be45d4SPetr Mladek  * @work: the kthread work to cancel
151437be45d4SPetr Mladek  *
151537be45d4SPetr Mladek  * Cancel @work and wait for its execution to finish.  This function
151637be45d4SPetr Mladek  * can be used even if the work re-queues itself. On return from this
151737be45d4SPetr Mladek  * function, @work is guaranteed to be not pending or executing on any CPU.
151837be45d4SPetr Mladek  *
151937be45d4SPetr Mladek  * kthread_cancel_work_sync(&delayed_work->work) must not be used for
152037be45d4SPetr Mladek  * delayed_work's. Use kthread_cancel_delayed_work_sync() instead.
152137be45d4SPetr Mladek  *
152237be45d4SPetr Mladek  * The caller must ensure that the worker on which @work was last
152337be45d4SPetr Mladek  * queued can't be destroyed before this function returns.
152437be45d4SPetr Mladek  *
152537be45d4SPetr Mladek  * Return: %true if @work was pending, %false otherwise.
152637be45d4SPetr Mladek  */
kthread_cancel_work_sync(struct kthread_work * work)152737be45d4SPetr Mladek bool kthread_cancel_work_sync(struct kthread_work *work)
152837be45d4SPetr Mladek {
152937be45d4SPetr Mladek 	return __kthread_cancel_work_sync(work, false);
153037be45d4SPetr Mladek }
153137be45d4SPetr Mladek EXPORT_SYMBOL_GPL(kthread_cancel_work_sync);
153237be45d4SPetr Mladek 
153337be45d4SPetr Mladek /**
153437be45d4SPetr Mladek  * kthread_cancel_delayed_work_sync - cancel a kthread delayed work and
153537be45d4SPetr Mladek  *	wait for it to finish.
153637be45d4SPetr Mladek  * @dwork: the kthread delayed work to cancel
153737be45d4SPetr Mladek  *
153837be45d4SPetr Mladek  * This is kthread_cancel_work_sync() for delayed works.
153937be45d4SPetr Mladek  *
154037be45d4SPetr Mladek  * Return: %true if @dwork was pending, %false otherwise.
154137be45d4SPetr Mladek  */
kthread_cancel_delayed_work_sync(struct kthread_delayed_work * dwork)154237be45d4SPetr Mladek bool kthread_cancel_delayed_work_sync(struct kthread_delayed_work *dwork)
154337be45d4SPetr Mladek {
154437be45d4SPetr Mladek 	return __kthread_cancel_work_sync(&dwork->work, true);
154537be45d4SPetr Mladek }
154637be45d4SPetr Mladek EXPORT_SYMBOL_GPL(kthread_cancel_delayed_work_sync);
154737be45d4SPetr Mladek 
1548b56c0d89STejun Heo /**
15493989144fSPetr Mladek  * kthread_flush_worker - flush all current works on a kthread_worker
1550b56c0d89STejun Heo  * @worker: worker to flush
1551b56c0d89STejun Heo  *
1552b56c0d89STejun Heo  * Wait until all currently executing or pending works on @worker are
1553b56c0d89STejun Heo  * finished.
1554b56c0d89STejun Heo  */
kthread_flush_worker(struct kthread_worker * worker)15553989144fSPetr Mladek void kthread_flush_worker(struct kthread_worker *worker)
1556b56c0d89STejun Heo {
1557b56c0d89STejun Heo 	struct kthread_flush_work fwork = {
1558b56c0d89STejun Heo 		KTHREAD_WORK_INIT(fwork.work, kthread_flush_work_fn),
1559b56c0d89STejun Heo 		COMPLETION_INITIALIZER_ONSTACK(fwork.done),
1560b56c0d89STejun Heo 	};
1561b56c0d89STejun Heo 
15623989144fSPetr Mladek 	kthread_queue_work(worker, &fwork.work);
1563b56c0d89STejun Heo 	wait_for_completion(&fwork.done);
1564b56c0d89STejun Heo }
15653989144fSPetr Mladek EXPORT_SYMBOL_GPL(kthread_flush_worker);
156635033fe9SPetr Mladek 
156735033fe9SPetr Mladek /**
156835033fe9SPetr Mladek  * kthread_destroy_worker - destroy a kthread worker
156935033fe9SPetr Mladek  * @worker: worker to be destroyed
157035033fe9SPetr Mladek  *
157135033fe9SPetr Mladek  * Flush and destroy @worker.  The simple flush is enough because the kthread
157235033fe9SPetr Mladek  * worker API is used only in trivial scenarios.  There are no multi-step state
157335033fe9SPetr Mladek  * machines needed.
1574eb79fa7eSZqiang  *
1575eb79fa7eSZqiang  * Note that this function is not responsible for handling delayed work, so
1576eb79fa7eSZqiang  * caller should be responsible for queuing or canceling all delayed work items
1577eb79fa7eSZqiang  * before invoke this function.
157835033fe9SPetr Mladek  */
kthread_destroy_worker(struct kthread_worker * worker)157935033fe9SPetr Mladek void kthread_destroy_worker(struct kthread_worker *worker)
158035033fe9SPetr Mladek {
158135033fe9SPetr Mladek 	struct task_struct *task;
158235033fe9SPetr Mladek 
158335033fe9SPetr Mladek 	task = worker->task;
158435033fe9SPetr Mladek 	if (WARN_ON(!task))
158535033fe9SPetr Mladek 		return;
158635033fe9SPetr Mladek 
158735033fe9SPetr Mladek 	kthread_flush_worker(worker);
158835033fe9SPetr Mladek 	kthread_stop(task);
1589eb79fa7eSZqiang 	WARN_ON(!list_empty(&worker->delayed_work_list));
159035033fe9SPetr Mladek 	WARN_ON(!list_empty(&worker->work_list));
159135033fe9SPetr Mladek 	kfree(worker);
159235033fe9SPetr Mladek }
159335033fe9SPetr Mladek EXPORT_SYMBOL(kthread_destroy_worker);
159405e3db95SShaohua Li 
1595f5678e7fSChristoph Hellwig /**
1596f5678e7fSChristoph Hellwig  * kthread_use_mm - make the calling kthread operate on an address space
1597f5678e7fSChristoph Hellwig  * @mm: address space to operate on
15989bf5b9ebSChristoph Hellwig  */
kthread_use_mm(struct mm_struct * mm)1599f5678e7fSChristoph Hellwig void kthread_use_mm(struct mm_struct *mm)
16009bf5b9ebSChristoph Hellwig {
16019bf5b9ebSChristoph Hellwig 	struct mm_struct *active_mm;
16029bf5b9ebSChristoph Hellwig 	struct task_struct *tsk = current;
16039bf5b9ebSChristoph Hellwig 
1604f5678e7fSChristoph Hellwig 	WARN_ON_ONCE(!(tsk->flags & PF_KTHREAD));
1605f5678e7fSChristoph Hellwig 	WARN_ON_ONCE(tsk->mm);
1606f5678e7fSChristoph Hellwig 
1607aa464ba9SNicholas Piggin 	/*
1608aa464ba9SNicholas Piggin 	 * It is possible for mm to be the same as tsk->active_mm, but
1609aa464ba9SNicholas Piggin 	 * we must still mmgrab(mm) and mmdrop_lazy_tlb(active_mm),
1610aa464ba9SNicholas Piggin 	 * because these references are not equivalent.
1611aa464ba9SNicholas Piggin 	 */
16126cad87b0SNicholas Piggin 	mmgrab(mm);
16136cad87b0SNicholas Piggin 
16149bf5b9ebSChristoph Hellwig 	task_lock(tsk);
161538cf307cSPeter Zijlstra 	/* Hold off tlb flush IPIs while switching mm's */
161638cf307cSPeter Zijlstra 	local_irq_disable();
16179bf5b9ebSChristoph Hellwig 	active_mm = tsk->active_mm;
16189bf5b9ebSChristoph Hellwig 	tsk->active_mm = mm;
16199bf5b9ebSChristoph Hellwig 	tsk->mm = mm;
1620618758edSMathieu Desnoyers 	membarrier_update_current_mm(mm);
162138cf307cSPeter Zijlstra 	switch_mm_irqs_off(active_mm, mm, tsk);
162238cf307cSPeter Zijlstra 	local_irq_enable();
16239bf5b9ebSChristoph Hellwig 	task_unlock(tsk);
16249bf5b9ebSChristoph Hellwig #ifdef finish_arch_post_lock_switch
16259bf5b9ebSChristoph Hellwig 	finish_arch_post_lock_switch();
16269bf5b9ebSChristoph Hellwig #endif
16279bf5b9ebSChristoph Hellwig 
1628618758edSMathieu Desnoyers 	/*
1629618758edSMathieu Desnoyers 	 * When a kthread starts operating on an address space, the loop
1630618758edSMathieu Desnoyers 	 * in membarrier_{private,global}_expedited() may not observe
1631618758edSMathieu Desnoyers 	 * that tsk->mm, and not issue an IPI. Membarrier requires a
1632618758edSMathieu Desnoyers 	 * memory barrier after storing to tsk->mm, before accessing
1633618758edSMathieu Desnoyers 	 * user-space memory. A full memory barrier for membarrier
1634618758edSMathieu Desnoyers 	 * {PRIVATE,GLOBAL}_EXPEDITED is implicitly provided by
1635aa464ba9SNicholas Piggin 	 * mmdrop_lazy_tlb().
1636618758edSMathieu Desnoyers 	 */
1637aa464ba9SNicholas Piggin 	mmdrop_lazy_tlb(active_mm);
16389bf5b9ebSChristoph Hellwig }
1639f5678e7fSChristoph Hellwig EXPORT_SYMBOL_GPL(kthread_use_mm);
16409bf5b9ebSChristoph Hellwig 
1641f5678e7fSChristoph Hellwig /**
1642f5678e7fSChristoph Hellwig  * kthread_unuse_mm - reverse the effect of kthread_use_mm()
1643f5678e7fSChristoph Hellwig  * @mm: address space to operate on
16449bf5b9ebSChristoph Hellwig  */
kthread_unuse_mm(struct mm_struct * mm)1645f5678e7fSChristoph Hellwig void kthread_unuse_mm(struct mm_struct *mm)
16469bf5b9ebSChristoph Hellwig {
16479bf5b9ebSChristoph Hellwig 	struct task_struct *tsk = current;
16489bf5b9ebSChristoph Hellwig 
1649f5678e7fSChristoph Hellwig 	WARN_ON_ONCE(!(tsk->flags & PF_KTHREAD));
1650f5678e7fSChristoph Hellwig 	WARN_ON_ONCE(!tsk->mm);
1651f5678e7fSChristoph Hellwig 
16529bf5b9ebSChristoph Hellwig 	task_lock(tsk);
1653618758edSMathieu Desnoyers 	/*
1654618758edSMathieu Desnoyers 	 * When a kthread stops operating on an address space, the loop
1655618758edSMathieu Desnoyers 	 * in membarrier_{private,global}_expedited() may not observe
1656618758edSMathieu Desnoyers 	 * that tsk->mm, and not issue an IPI. Membarrier requires a
1657618758edSMathieu Desnoyers 	 * memory barrier after accessing user-space memory, before
1658618758edSMathieu Desnoyers 	 * clearing tsk->mm.
1659618758edSMathieu Desnoyers 	 */
1660618758edSMathieu Desnoyers 	smp_mb__after_spinlock();
166138cf307cSPeter Zijlstra 	local_irq_disable();
16629bf5b9ebSChristoph Hellwig 	tsk->mm = NULL;
1663618758edSMathieu Desnoyers 	membarrier_update_current_mm(NULL);
1664aa464ba9SNicholas Piggin 	mmgrab_lazy_tlb(mm);
16659bf5b9ebSChristoph Hellwig 	/* active_mm is still 'mm' */
16669bf5b9ebSChristoph Hellwig 	enter_lazy_tlb(mm, tsk);
166738cf307cSPeter Zijlstra 	local_irq_enable();
16689bf5b9ebSChristoph Hellwig 	task_unlock(tsk);
1669aa464ba9SNicholas Piggin 
1670aa464ba9SNicholas Piggin 	mmdrop(mm);
16719bf5b9ebSChristoph Hellwig }
1672f5678e7fSChristoph Hellwig EXPORT_SYMBOL_GPL(kthread_unuse_mm);
16739bf5b9ebSChristoph Hellwig 
16740b508bc9SShaohua Li #ifdef CONFIG_BLK_CGROUP
167505e3db95SShaohua Li /**
167605e3db95SShaohua Li  * kthread_associate_blkcg - associate blkcg to current kthread
167705e3db95SShaohua Li  * @css: the cgroup info
167805e3db95SShaohua Li  *
167905e3db95SShaohua Li  * Current thread must be a kthread. The thread is running jobs on behalf of
168005e3db95SShaohua Li  * other threads. In some cases, we expect the jobs attach cgroup info of
168105e3db95SShaohua Li  * original threads instead of that of current thread. This function stores
168205e3db95SShaohua Li  * original thread's cgroup info in current kthread context for later
168305e3db95SShaohua Li  * retrieval.
168405e3db95SShaohua Li  */
kthread_associate_blkcg(struct cgroup_subsys_state * css)168505e3db95SShaohua Li void kthread_associate_blkcg(struct cgroup_subsys_state *css)
168605e3db95SShaohua Li {
168705e3db95SShaohua Li 	struct kthread *kthread;
168805e3db95SShaohua Li 
168905e3db95SShaohua Li 	if (!(current->flags & PF_KTHREAD))
169005e3db95SShaohua Li 		return;
169105e3db95SShaohua Li 	kthread = to_kthread(current);
169205e3db95SShaohua Li 	if (!kthread)
169305e3db95SShaohua Li 		return;
169405e3db95SShaohua Li 
169505e3db95SShaohua Li 	if (kthread->blkcg_css) {
169605e3db95SShaohua Li 		css_put(kthread->blkcg_css);
169705e3db95SShaohua Li 		kthread->blkcg_css = NULL;
169805e3db95SShaohua Li 	}
169905e3db95SShaohua Li 	if (css) {
170005e3db95SShaohua Li 		css_get(css);
170105e3db95SShaohua Li 		kthread->blkcg_css = css;
170205e3db95SShaohua Li 	}
170305e3db95SShaohua Li }
170405e3db95SShaohua Li EXPORT_SYMBOL(kthread_associate_blkcg);
170505e3db95SShaohua Li 
170605e3db95SShaohua Li /**
170705e3db95SShaohua Li  * kthread_blkcg - get associated blkcg css of current kthread
170805e3db95SShaohua Li  *
170905e3db95SShaohua Li  * Current thread must be a kthread.
171005e3db95SShaohua Li  */
kthread_blkcg(void)171105e3db95SShaohua Li struct cgroup_subsys_state *kthread_blkcg(void)
171205e3db95SShaohua Li {
171305e3db95SShaohua Li 	struct kthread *kthread;
171405e3db95SShaohua Li 
171505e3db95SShaohua Li 	if (current->flags & PF_KTHREAD) {
171605e3db95SShaohua Li 		kthread = to_kthread(current);
171705e3db95SShaohua Li 		if (kthread)
171805e3db95SShaohua Li 			return kthread->blkcg_css;
171905e3db95SShaohua Li 	}
172005e3db95SShaohua Li 	return NULL;
172105e3db95SShaohua Li }
172205e3db95SShaohua Li #endif
1723