summaryrefslogtreecommitdiffstats
path: root/debian/patches-rt/0146-softirq-Add-RT-specific-softirq-accounting.patch
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches-rt/0146-softirq-Add-RT-specific-softirq-accounting.patch')
-rw-r--r--debian/patches-rt/0146-softirq-Add-RT-specific-softirq-accounting.patch75
1 files changed, 75 insertions, 0 deletions
diff --git a/debian/patches-rt/0146-softirq-Add-RT-specific-softirq-accounting.patch b/debian/patches-rt/0146-softirq-Add-RT-specific-softirq-accounting.patch
new file mode 100644
index 000000000..c4bcb9bd1
--- /dev/null
+++ b/debian/patches-rt/0146-softirq-Add-RT-specific-softirq-accounting.patch
@@ -0,0 +1,75 @@
+From a69df864da6d43ae3de6a4d995eaebca51a582b4 Mon Sep 17 00:00:00 2001
+From: Thomas Gleixner <tglx@linutronix.de>
+Date: Tue, 9 Mar 2021 09:55:53 +0100
+Subject: [PATCH 146/323] softirq: Add RT specific softirq accounting
+Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/5.10/older/patches-5.10.204-rt100.tar.xz
+
+RT requires the softirq processing and local bottomhalf disabled regions to
+be preemptible. Using the normal preempt count based serialization is
+therefore not possible because this implicitely disables preemption.
+
+RT kernels use a per CPU local lock to serialize bottomhalfs. As
+local_bh_disable() can nest the lock can only be acquired on the outermost
+invocation of local_bh_disable() and released when the nest count becomes
+zero. Tasks which hold the local lock can be preempted so its required to
+keep track of the nest count per task.
+
+Add a RT only counter to task struct and adjust the relevant macros in
+preempt.h.
+
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Tested-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+Reviewed-by: Frederic Weisbecker <frederic@kernel.org>
+Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+---
+ include/linux/hardirq.h | 1 +
+ include/linux/preempt.h | 6 +++++-
+ include/linux/sched.h | 3 +++
+ 3 files changed, 9 insertions(+), 1 deletion(-)
+
+diff --git a/include/linux/hardirq.h b/include/linux/hardirq.h
+index 0926e9ca4d85..76878b357ffa 100644
+--- a/include/linux/hardirq.h
++++ b/include/linux/hardirq.h
+@@ -6,6 +6,7 @@
+ #include <linux/preempt.h>
+ #include <linux/lockdep.h>
+ #include <linux/ftrace_irq.h>
++#include <linux/sched.h>
+ #include <linux/vtime.h>
+ #include <asm/hardirq.h>
+
+diff --git a/include/linux/preempt.h b/include/linux/preempt.h
+index 69cc8b64aa3a..9881eac0698f 100644
+--- a/include/linux/preempt.h
++++ b/include/linux/preempt.h
+@@ -79,7 +79,11 @@
+
+ #define nmi_count() (preempt_count() & NMI_MASK)
+ #define hardirq_count() (preempt_count() & HARDIRQ_MASK)
+-#define softirq_count() (preempt_count() & SOFTIRQ_MASK)
++#ifdef CONFIG_PREEMPT_RT
++# define softirq_count() (current->softirq_disable_cnt & SOFTIRQ_MASK)
++#else
++# define softirq_count() (preempt_count() & SOFTIRQ_MASK)
++#endif
+ #define irq_count() (nmi_count() | hardirq_count() | softirq_count())
+
+ /*
+diff --git a/include/linux/sched.h b/include/linux/sched.h
+index 82de1ab42497..d31da4867bb2 100644
+--- a/include/linux/sched.h
++++ b/include/linux/sched.h
+@@ -1046,6 +1046,9 @@ struct task_struct {
+ int softirq_context;
+ int irq_config;
+ #endif
++#ifdef CONFIG_PREEMPT_RT
++ int softirq_disable_cnt;
++#endif
+
+ #ifdef CONFIG_LOCKDEP
+ # define MAX_LOCK_DEPTH 48UL
+--
+2.43.0
+