diff options
Diffstat (limited to 'debian/patches-rt/0124-softirq-Move-related-code-into-one-section.patch')
-rw-r--r-- | debian/patches-rt/0124-softirq-Move-related-code-into-one-section.patch | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/debian/patches-rt/0124-softirq-Move-related-code-into-one-section.patch b/debian/patches-rt/0124-softirq-Move-related-code-into-one-section.patch new file mode 100644 index 000000000..fb937d24b --- /dev/null +++ b/debian/patches-rt/0124-softirq-Move-related-code-into-one-section.patch @@ -0,0 +1,169 @@ +From e40ca378bfbd05514961947d57b163831bdc3bbe Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner <tglx@linutronix.de> +Date: Fri, 13 Nov 2020 15:02:18 +0100 +Subject: [PATCH 124/323] softirq: Move related code into one section +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/5.10/older/patches-5.10.204-rt100.tar.xz + +To prepare for adding a RT aware variant of softirq serialization and +processing move related code into one section so the necessary #ifdeffery +is reduced to one. + +Signed-off-by: Thomas Gleixner <tglx@linutronix.de> +Reviewed-by: Frederic Weisbecker <frederic@kernel.org> +Link: https://lore.kernel.org/r/20201113141733.974214480@linutronix.de +Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> +--- + kernel/softirq.c | 107 ++++++++++++++++++++++++----------------------- + 1 file changed, 54 insertions(+), 53 deletions(-) + +diff --git a/kernel/softirq.c b/kernel/softirq.c +index 09229ad82209..617009ccd82c 100644 +--- a/kernel/softirq.c ++++ b/kernel/softirq.c +@@ -92,6 +92,13 @@ static bool ksoftirqd_running(unsigned long pending) + !__kthread_should_park(tsk); + } + ++#ifdef CONFIG_TRACE_IRQFLAGS ++DEFINE_PER_CPU(int, hardirqs_enabled); ++DEFINE_PER_CPU(int, hardirq_context); ++EXPORT_PER_CPU_SYMBOL_GPL(hardirqs_enabled); ++EXPORT_PER_CPU_SYMBOL_GPL(hardirq_context); ++#endif ++ + /* + * preempt_count and SOFTIRQ_OFFSET usage: + * - preempt_count is changed by SOFTIRQ_OFFSET on entering or leaving +@@ -102,17 +109,11 @@ static bool ksoftirqd_running(unsigned long pending) + * softirq and whether we just have bh disabled. + */ + ++#ifdef CONFIG_TRACE_IRQFLAGS + /* +- * This one is for softirq.c-internal use, +- * where hardirqs are disabled legitimately: ++ * This is for softirq.c-internal use, where hardirqs are disabled ++ * legitimately: + */ +-#ifdef CONFIG_TRACE_IRQFLAGS +- +-DEFINE_PER_CPU(int, hardirqs_enabled); +-DEFINE_PER_CPU(int, hardirq_context); +-EXPORT_PER_CPU_SYMBOL_GPL(hardirqs_enabled); +-EXPORT_PER_CPU_SYMBOL_GPL(hardirq_context); +- + void __local_bh_disable_ip(unsigned long ip, unsigned int cnt) + { + unsigned long flags; +@@ -203,6 +204,50 @@ void __local_bh_enable_ip(unsigned long ip, unsigned int cnt) + } + EXPORT_SYMBOL(__local_bh_enable_ip); + ++static inline void invoke_softirq(void) ++{ ++ if (ksoftirqd_running(local_softirq_pending())) ++ return; ++ ++ if (!force_irqthreads) { ++#ifdef CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK ++ /* ++ * We can safely execute softirq on the current stack if ++ * it is the irq stack, because it should be near empty ++ * at this stage. ++ */ ++ __do_softirq(); ++#else ++ /* ++ * Otherwise, irq_exit() is called on the task stack that can ++ * be potentially deep already. So call softirq in its own stack ++ * to prevent from any overrun. ++ */ ++ do_softirq_own_stack(); ++#endif ++ } else { ++ wakeup_softirqd(); ++ } ++} ++ ++asmlinkage __visible void do_softirq(void) ++{ ++ __u32 pending; ++ unsigned long flags; ++ ++ if (in_interrupt()) ++ return; ++ ++ local_irq_save(flags); ++ ++ pending = local_softirq_pending(); ++ ++ if (pending && !ksoftirqd_running(pending)) ++ do_softirq_own_stack(); ++ ++ local_irq_restore(flags); ++} ++ + /* + * We restart softirq processing for at most MAX_SOFTIRQ_RESTART times, + * but break the loop if need_resched() is set or after 2 ms. +@@ -327,24 +372,6 @@ asmlinkage __visible void __softirq_entry __do_softirq(void) + current_restore_flags(old_flags, PF_MEMALLOC); + } + +-asmlinkage __visible void do_softirq(void) +-{ +- __u32 pending; +- unsigned long flags; +- +- if (in_interrupt()) +- return; +- +- local_irq_save(flags); +- +- pending = local_softirq_pending(); +- +- if (pending && !ksoftirqd_running(pending)) +- do_softirq_own_stack(); +- +- local_irq_restore(flags); +-} +- + /** + * irq_enter_rcu - Enter an interrupt context with RCU watching + */ +@@ -371,32 +398,6 @@ void irq_enter(void) + irq_enter_rcu(); + } + +-static inline void invoke_softirq(void) +-{ +- if (ksoftirqd_running(local_softirq_pending())) +- return; +- +- if (!force_irqthreads) { +-#ifdef CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK +- /* +- * We can safely execute softirq on the current stack if +- * it is the irq stack, because it should be near empty +- * at this stage. +- */ +- __do_softirq(); +-#else +- /* +- * Otherwise, irq_exit() is called on the task stack that can +- * be potentially deep already. So call softirq in its own stack +- * to prevent from any overrun. +- */ +- do_softirq_own_stack(); +-#endif +- } else { +- wakeup_softirqd(); +- } +-} +- + static inline void tick_irq_exit(void) + { + #ifdef CONFIG_NO_HZ_COMMON +-- +2.43.0 + |