diff options
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.patch | 75 |
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 + |