From 28768780d4c486e546201ac2c30051fe412a3be9 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Fri, 18 Dec 2020 14:37:10 +0100 Subject: [PATCH] Revert "ANDROID: softirq: defer softirq processing to ksoftirqd if CPU is busy with RT" This reverts commit 0578248bedae9a6b7bd4325f06101332c29af962 as the softirq code is rewritten in 5.11-rc1 and massive merge conflicts are happening. If this change is still needed, please work with upstream to get the patches accepted so they can then come into this tree automatically. Bug: 168521633 Cc: Pavankumar Kondeti Cc: Satya Durga Srinivasu Prabhala Cc: J. Avila Signed-off-by: Greg Kroah-Hartman Change-Id: I421cc2ca29b635d7ac39d52aa486e20cbdd8ca45 --- include/linux/sched.h | 10 ---------- kernel/sched/cpupri.c | 13 ------------- kernel/softirq.c | 23 ++++------------------- 3 files changed, 4 insertions(+), 42 deletions(-) diff --git a/include/linux/sched.h b/include/linux/sched.h index b6c3da92107d..8892be6ba5d4 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -1677,16 +1677,6 @@ current_restore_flags(unsigned long orig_flags, unsigned long flags) extern int cpuset_cpumask_can_shrink(const struct cpumask *cur, const struct cpumask *trial); extern int task_can_attach(struct task_struct *p, const struct cpumask *cs_cpus_allowed); - -#ifdef CONFIG_RT_SOFTINT_OPTIMIZATION -extern bool cpupri_check_rt(void); -#else -static inline bool cpupri_check_rt(void) -{ - return false; -} -#endif - #ifdef CONFIG_SMP extern void do_set_cpus_allowed(struct task_struct *p, const struct cpumask *new_mask); extern int set_cpus_allowed_ptr(struct task_struct *p, const struct cpumask *new_mask); diff --git a/kernel/sched/cpupri.c b/kernel/sched/cpupri.c index 4b6f21c88741..73ecc1190da1 100644 --- a/kernel/sched/cpupri.c +++ b/kernel/sched/cpupri.c @@ -355,16 +355,3 @@ void cpupri_cleanup(struct cpupri *cp) for (i = 0; i < CPUPRI_NR_PRIORITIES; i++) free_cpumask_var(cp->pri_to_cpu[i].mask); } - -#ifdef CONFIG_RT_SOFTINT_OPTIMIZATION -/* - * cpupri_check_rt - check if CPU has a RT task - * should be called from rcu-sched read section. - */ -bool cpupri_check_rt(void) -{ - int cpu = raw_smp_processor_id(); - - return cpu_rq(cpu)->rd->cpupri.cpu_to_pri[cpu] > CPUPRI_NORMAL; -} -#endif diff --git a/kernel/softirq.c b/kernel/softirq.c index a7956c5d55e4..d715589078c3 100644 --- a/kernel/softirq.c +++ b/kernel/softirq.c @@ -262,16 +262,6 @@ static inline bool lockdep_softirq_start(void) { return false; } static inline void lockdep_softirq_end(bool in_hardirq) { } #endif -#define softirq_deferred_for_rt(pending) \ -({ \ - __u32 deferred = 0; \ - if (cpupri_check_rt()) { \ - deferred = pending & LONG_SOFTIRQ_MASK; \ - pending &= ~LONG_SOFTIRQ_MASK; \ - } \ - deferred; \ -}) - asmlinkage __visible void __softirq_entry __do_softirq(void) { unsigned long end = jiffies + MAX_SOFTIRQ_TIME; @@ -279,7 +269,6 @@ asmlinkage __visible void __softirq_entry __do_softirq(void) int max_restart = MAX_SOFTIRQ_RESTART; struct softirq_action *h; bool in_hardirq; - __u32 deferred; __u32 pending; int softirq_bit; @@ -291,14 +280,14 @@ asmlinkage __visible void __softirq_entry __do_softirq(void) current->flags &= ~PF_MEMALLOC; pending = local_softirq_pending(); - deferred = softirq_deferred_for_rt(pending); account_irq_enter_time(current); + __local_bh_disable_ip(_RET_IP_, SOFTIRQ_OFFSET); in_hardirq = lockdep_softirq_start(); restart: /* Reset the pending bitmask before enabling irqs */ - set_softirq_pending(deferred); + set_softirq_pending(0); __this_cpu_write(active_softirqs, pending); local_irq_enable(); @@ -335,18 +324,14 @@ restart: local_irq_disable(); pending = local_softirq_pending(); - deferred = softirq_deferred_for_rt(pending); - if (pending) { if (time_before(jiffies, end) && !need_resched() && --max_restart) goto restart; + + wakeup_softirqd(); } -#ifdef CONFIG_RT_SOFTINT_OPTIMIZATION - if (pending | deferred) - wakeup_softirqd(); -#endif lockdep_softirq_end(in_hardirq); account_irq_exit_time(current); __local_bh_enable(SOFTIRQ_OFFSET);