From: Sebastian Andrzej Siewior <bige...@linutronix.de> v4.14.137-rt65-rc1 stable review patch. If anyone has any objections, please let me know.
----------- [ Upstream commit 0532e87d9d44795221aa921ba7024bde689cc894 ] Add kthread_schedule_work() which uses a global kthread for all its jobs. Split the cgroup include to avoid recussive includes from interrupt.h. Fixup everything that fails to build (and did not include all header). Signed-off-by: Sebastian Andrzej Siewior <bige...@linutronix.de> Signed-off-by: Tom Zanussi <zanu...@kernel.org> Conflicts: include/linux/blk-cgroup.h include/linux/kthread.h kernel/kthread.c --- drivers/block/loop.c | 2 +- drivers/spi/spi-rockchip.c | 1 + include/linux/blk-cgroup.h | 1 + include/linux/kthread-cgroup.h | 17 +++++++++++++++++ include/linux/kthread.h | 8 ++++++++ init/main.c | 1 + kernel/kthread.c | 13 +++++++++++++ 7 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 include/linux/kthread-cgroup.h diff --git a/drivers/block/loop.c b/drivers/block/loop.c index bd447de4a5b8..2a07dfc9b3ae 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c @@ -70,7 +70,7 @@ #include <linux/writeback.h> #include <linux/completion.h> #include <linux/highmem.h> -#include <linux/kthread.h> +#include <linux/kthread-cgroup.h> #include <linux/splice.h> #include <linux/sysfs.h> #include <linux/miscdevice.h> diff --git a/drivers/spi/spi-rockchip.c b/drivers/spi/spi-rockchip.c index fdcf3076681b..b56619418cea 100644 --- a/drivers/spi/spi-rockchip.c +++ b/drivers/spi/spi-rockchip.c @@ -22,6 +22,7 @@ #include <linux/spi/spi.h> #include <linux/pm_runtime.h> #include <linux/scatterlist.h> +#include <linux/interrupt.h> #define DRIVER_NAME "rockchip-spi" diff --git a/include/linux/blk-cgroup.h b/include/linux/blk-cgroup.h index 8bbc3716507a..a9454ad4de06 100644 --- a/include/linux/blk-cgroup.h +++ b/include/linux/blk-cgroup.h @@ -20,6 +20,7 @@ #include <linux/radix-tree.h> #include <linux/blkdev.h> #include <linux/atomic.h> +#include <linux/kthread-cgroup.h> /* percpu_counter batch for blkg_[rw]stats, per-cpu drift doesn't matter */ #define BLKG_STAT_CPU_BATCH (INT_MAX / 2) diff --git a/include/linux/kthread-cgroup.h b/include/linux/kthread-cgroup.h new file mode 100644 index 000000000000..53d34bca9d72 --- /dev/null +++ b/include/linux/kthread-cgroup.h @@ -0,0 +1,17 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _LINUX_KTHREAD_CGROUP_H +#define _LINUX_KTHREAD_CGROUP_H +#include <linux/kthread.h> +#include <linux/cgroup.h> + +#ifdef CONFIG_BLK_CGROUP +void kthread_associate_blkcg(struct cgroup_subsys_state *css); +struct cgroup_subsys_state *kthread_blkcg(void); +#else +static inline void kthread_associate_blkcg(struct cgroup_subsys_state *css) { } +static inline struct cgroup_subsys_state *kthread_blkcg(void) +{ + return NULL; +} +#endif +#endif diff --git a/include/linux/kthread.h b/include/linux/kthread.h index 4e663f407bd7..59b85b01fb8b 100644 --- a/include/linux/kthread.h +++ b/include/linux/kthread.h @@ -199,4 +199,12 @@ bool kthread_cancel_delayed_work_sync(struct kthread_delayed_work *work); void kthread_destroy_worker(struct kthread_worker *worker); +extern struct kthread_worker kthread_global_worker; +void kthread_init_global_worker(void); + +static inline bool kthread_schedule_work(struct kthread_work *work) +{ + return kthread_queue_work(&kthread_global_worker, work); +} + #endif /* _LINUX_KTHREAD_H */ diff --git a/init/main.c b/init/main.c index f32aebb5ce54..18c1297b2889 100644 --- a/init/main.c +++ b/init/main.c @@ -1059,6 +1059,7 @@ static noinline void __init kernel_init_freeable(void) smp_prepare_cpus(setup_max_cpus); workqueue_init(); + kthread_init_global_worker(); init_mm_internals(); diff --git a/kernel/kthread.c b/kernel/kthread.c index 430fd79cd3fe..44498522e5d5 100644 --- a/kernel/kthread.c +++ b/kernel/kthread.c @@ -1161,3 +1161,16 @@ void kthread_destroy_worker(struct kthread_worker *worker) kfree(worker); } EXPORT_SYMBOL(kthread_destroy_worker); + +DEFINE_KTHREAD_WORKER(kthread_global_worker); +EXPORT_SYMBOL(kthread_global_worker); + +__init void kthread_init_global_worker(void) +{ + kthread_global_worker.task = kthread_create(kthread_worker_fn, + &kthread_global_worker, + "kswork"); + if (WARN_ON(IS_ERR(kthread_global_worker.task))) + return; + wake_up_process(kthread_global_worker.task); +} -- 2.14.1