summaryrefslogtreecommitdiffstats
path: root/debian/patches-rt/task_work-make-TWA_NMI_CURRENT-handling-conditional-.patch
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches-rt/task_work-make-TWA_NMI_CURRENT-handling-conditional-.patch')
-rw-r--r--debian/patches-rt/task_work-make-TWA_NMI_CURRENT-handling-conditional-.patch68
1 files changed, 68 insertions, 0 deletions
diff --git a/debian/patches-rt/task_work-make-TWA_NMI_CURRENT-handling-conditional-.patch b/debian/patches-rt/task_work-make-TWA_NMI_CURRENT-handling-conditional-.patch
new file mode 100644
index 0000000000..957e92705a
--- /dev/null
+++ b/debian/patches-rt/task_work-make-TWA_NMI_CURRENT-handling-conditional-.patch
@@ -0,0 +1,68 @@
+From: Linus Torvalds <torvalds@linux-foundation.org>
+Date: Mon, 29 Jul 2024 12:05:06 -0700
+Subject: [PATCH] task_work: make TWA_NMI_CURRENT handling conditional on
+ IRQ_WORK
+Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/6.10/older/patches-6.10.2-rt14.tar.xz
+
+The TWA_NMI_CURRENT handling very much depends on IRQ_WORK, but that
+isn't universally enabled everywhere.
+
+Maybe the IRQ_WORK infrastructure should just be unconditional - x86
+ends up indirectly enabling it through unconditionally enabling
+PERF_EVENTS, for example. But it also gets enabled by having SMP
+support, or even if you just have PRINTK enabled.
+
+But in the meantime TWA_NMI_CURRENT causes tons of build failures on
+various odd minimal configs. Which did show up in linux-next, but
+despite that nobody bothered to fix it or even inform me until -rc1 was
+out.
+
+Fixes: 466e4d801cd4 ("task_work: Add TWA_NMI_CURRENT as an additional notify mode")
+Reported-by: Naresh Kamboju <naresh.kamboju@linaro.org>
+Reported-by: kernelci.org bot <bot@kernelci.org>
+Reported-by: Guenter Roeck <linux@roeck-us.net>
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+---
+ kernel/task_work.c | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+--- a/kernel/task_work.c
++++ b/kernel/task_work.c
+@@ -7,12 +7,14 @@
+
+ static struct callback_head work_exited; /* all we need is ->next == NULL */
+
++#ifdef CONFIG_IRQ_WORK
+ static void task_work_set_notify_irq(struct irq_work *entry)
+ {
+ test_and_set_tsk_thread_flag(current, TIF_NOTIFY_RESUME);
+ }
+ static DEFINE_PER_CPU(struct irq_work, irq_work_NMI_resume) =
+ IRQ_WORK_INIT_HARD(task_work_set_notify_irq);
++#endif
+
+ /**
+ * task_work_add - ask the @task to execute @work->func()
+@@ -58,6 +60,8 @@ int task_work_add(struct task_struct *ta
+ if (notify == TWA_NMI_CURRENT) {
+ if (WARN_ON_ONCE(task != current))
+ return -EINVAL;
++ if (!IS_ENABLED(CONFIG_IRQ_WORK))
++ return -EINVAL;
+ } else {
+ /* record the work call stack in order to print it in KASAN reports */
+ kasan_record_aux_stack(work);
+@@ -82,9 +86,11 @@ int task_work_add(struct task_struct *ta
+ case TWA_SIGNAL_NO_IPI:
+ __set_notify_signal(task);
+ break;
++#ifdef CONFIG_IRQ_WORK
+ case TWA_NMI_CURRENT:
+ irq_work_queue(this_cpu_ptr(&irq_work_NMI_resume));
+ break;
++#endif
+ default:
+ WARN_ON_ONCE(1);
+ break;