Merge "Revert "Mark HI and TASKLET softirq synchronous""

This commit is contained in:
qctecmdr 2019-12-14 09:00:45 -08:00 • committed by Gerrit - the friendly Code Review server
commit f536145ef0
3 changed files with 30 additions and 18 deletions

View file

@ -116,6 +116,8 @@ static bool migrate_one_irq(struct irq_desc *desc)
affinity = &available_cpus;
if (cpumask_any_and(affinity, cpu_online_mask) >= nr_cpu_ids) {
const struct cpumask *default_affinity;
/*
* If the interrupt is managed, then shut it down and leave
* the affinity untouched.
@ -125,6 +127,8 @@ static bool migrate_one_irq(struct irq_desc *desc)
irq_shutdown_and_deactivate(desc);
return false;
}
default_affinity = desc->affinity_hint ? : irq_default_affinity;
/*
* The order of preference for selecting a fallback CPU is
*
@ -134,9 +138,9 @@ static bool migrate_one_irq(struct irq_desc *desc)
*/
cpumask_andnot(&available_cpus, cpu_online_mask,
cpu_isolated_mask);
if (cpumask_intersects(&available_cpus, irq_default_affinity))
if (cpumask_intersects(&available_cpus, default_affinity))
cpumask_and(&available_cpus, &available_cpus,
irq_default_affinity);
default_affinity);
else if (cpumask_empty(&available_cpus))
affinity = cpu_online_mask;

View file

@ -122,6 +122,8 @@ retry:
if (lowest_mask) {
cpumask_and(lowest_mask, p->cpus_ptr, vec->mask);
cpumask_andnot(lowest_mask, lowest_mask,
cpu_isolated_mask);
if (drop_nopreempts)
drop_nopreempt_cpus(lowest_mask);
/*

View file

@ -85,16 +85,12 @@ static void wakeup_softirqd(void)
/*
* If ksoftirqd is scheduled, we do not want to process pending softirqs
* right now. Let ksoftirqd handle this at its own rate, to get fairness,
* unless we're doing some of the synchronous softirqs.
* right now. Let ksoftirqd handle this at its own rate, to get fairness.
*/
#define SOFTIRQ_NOW_MASK ((1 << HI_SOFTIRQ) | (1 << TASKLET_SOFTIRQ))
static bool ksoftirqd_running(unsigned long pending)
static bool ksoftirqd_running(void)
{
struct task_struct *tsk = __this_cpu_read(ksoftirqd);
if (pending & SOFTIRQ_NOW_MASK)
return false;
return tsk && (tsk->state == TASK_RUNNING) &&
!__kthread_should_park(tsk);
}
@ -253,8 +249,16 @@ static inline bool lockdep_softirq_start(void) { return false; }
static inline void lockdep_softirq_end(bool in_hardirq) { }
#endif
#define long_softirq_pending() (local_softirq_pending() & LONG_SOFTIRQ_MASK)
#define defer_for_rt() (long_softirq_pending() && cpupri_check_rt())
#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;
@ -262,6 +266,7 @@ 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;
@ -273,14 +278,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(0);
set_softirq_pending(deferred);
__this_cpu_write(active_softirqs, pending);
local_irq_enable();
@ -317,15 +322,16 @@ restart:
local_irq_disable();
pending = local_softirq_pending();
deferred = softirq_deferred_for_rt(pending);
if (pending) {
if (time_before(jiffies, end) && !need_resched() &&
!defer_for_rt() &&
--max_restart)
goto restart;
wakeup_softirqd();
}
if (pending | deferred)
wakeup_softirqd();
lockdep_softirq_end(in_hardirq);
account_irq_exit_time(current);
__local_bh_enable(SOFTIRQ_OFFSET);
@ -345,7 +351,7 @@ asmlinkage __visible void do_softirq(void)
pending = local_softirq_pending();
if (pending && !ksoftirqd_running(pending))
if (pending && !ksoftirqd_running())
do_softirq_own_stack();
local_irq_restore(flags);
@ -372,10 +378,10 @@ void irq_enter(void)
static inline void invoke_softirq(void)
{
if (ksoftirqd_running(local_softirq_pending()))
if (ksoftirqd_running())
return;
if (!force_irqthreads && !defer_for_rt()) {
if (!force_irqthreads) {
#ifdef CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK
/*
* We can safely execute softirq on the current stack if