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, ¶m);
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