summaryrefslogtreecommitdiffstats
path: root/debian/patches-rt/0265-kthread-add-a-global-worker-thread.patch
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches-rt/0265-kthread-add-a-global-worker-thread.patch')
-rw-r--r--debian/patches-rt/0265-kthread-add-a-global-worker-thread.patch176
1 files changed, 176 insertions, 0 deletions
diff --git a/debian/patches-rt/0265-kthread-add-a-global-worker-thread.patch b/debian/patches-rt/0265-kthread-add-a-global-worker-thread.patch
new file mode 100644
index 000000000..304316c46
--- /dev/null
+++ b/debian/patches-rt/0265-kthread-add-a-global-worker-thread.patch
@@ -0,0 +1,176 @@
+From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+Date: Tue, 12 Feb 2019 15:09:38 +0100
+Subject: [PATCH 265/342] kthread: add a global worker thread.
+Origin: https://git.kernel.org/cgit/linux/kernel/git/rt/linux-stable-rt.git/commit?id=a3be1221a15666a2cca554da5c38c39d106bcbdf
+
+[ 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 <bigeasy@linutronix.de>
+[
+ Fixed up include in blk-cgroup.h reported by Juri Lelli
+ http://lkml.kernel.org/r/20190722083009.GE25636@localhost.localdomain
+]
+Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
+---
+ drivers/block/loop.c | 2 +-
+ drivers/spi/spi-rockchip.c | 1 +
+ include/linux/blk-cgroup.h | 2 +-
+ include/linux/kthread-cgroup.h | 17 +++++++++++++++++
+ include/linux/kthread.h | 17 +++++++----------
+ init/main.c | 1 +
+ kernel/kthread.c | 14 ++++++++++++++
+ 7 files changed, 42 insertions(+), 12 deletions(-)
+ create mode 100644 include/linux/kthread-cgroup.h
+
+diff --git a/drivers/block/loop.c b/drivers/block/loop.c
+index c31a76485c9c..d24660961343 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 185bbdce62b1..63b10236eb05 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 8f1be8b49391..dc26ce6d840d 100644
+--- a/include/linux/blk-cgroup.h
++++ b/include/linux/blk-cgroup.h
+@@ -14,7 +14,7 @@
+ * Nauman Rafique <nauman@google.com>
+ */
+
+-#include <linux/cgroup.h>
++#include <linux/kthread-cgroup.h>
+ #include <linux/percpu_counter.h>
+ #include <linux/seq_file.h>
+ #include <linux/radix-tree.h>
+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 e0498e46d642..31140f0a6c2c 100644
+--- a/include/linux/kthread.h
++++ b/include/linux/kthread.h
+@@ -4,7 +4,6 @@
+ /* Simple interface for creating and stopping kernel threads without mess. */
+ #include <linux/err.h>
+ #include <linux/sched.h>
+-#include <linux/cgroup.h>
+
+ __printf(4, 5)
+ struct task_struct *kthread_create_on_node(int (*threadfn)(void *data),
+@@ -109,7 +108,7 @@ struct kthread_delayed_work {
+ };
+
+ #define KTHREAD_WORKER_INIT(worker) { \
+- .lock = __SPIN_LOCK_UNLOCKED((worker).lock), \
++ .lock = __RAW_SPIN_LOCK_UNLOCKED((worker).lock), \
+ .work_list = LIST_HEAD_INIT((worker).work_list), \
+ .delayed_work_list = LIST_HEAD_INIT((worker).delayed_work_list),\
+ }
+@@ -201,14 +200,12 @@ bool kthread_cancel_delayed_work_sync(struct kthread_delayed_work *work);
+
+ void kthread_destroy_worker(struct kthread_worker *worker);
+
+-#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)
++extern struct kthread_worker kthread_global_worker;
++void kthread_init_global_worker(void);
++
++static inline bool kthread_schedule_work(struct kthread_work *work)
+ {
+- return NULL;
++ return kthread_queue_work(&kthread_global_worker, work);
+ }
+-#endif
++
+ #endif /* _LINUX_KTHREAD_H */
+diff --git a/init/main.c b/init/main.c
+index 703b627a6060..8555afc3f3e1 100644
+--- a/init/main.c
++++ b/init/main.c
+@@ -1136,6 +1136,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 c8cf4731ced8..6bbd391f0d9c 100644
+--- a/kernel/kthread.c
++++ b/kernel/kthread.c
+@@ -20,6 +20,7 @@
+ #include <linux/freezer.h>
+ #include <linux/ptrace.h>
+ #include <linux/uaccess.h>
++#include <linux/cgroup.h>
+ #include <trace/events/sched.h>
+
+ static DEFINE_SPINLOCK(kthread_create_lock);
+@@ -1244,6 +1245,19 @@ void kthread_destroy_worker(struct kthread_worker *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);
++}
++
+ #ifdef CONFIG_BLK_CGROUP
+ /**
+ * kthread_associate_blkcg - associate blkcg to current kthread