diff options
author | Frederic Weisbecker <frederic@kernel.org> | 2020-12-02 12:57:32 +0100 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2020-12-02 20:20:05 +0100 |
commit | d14ce74f1fb376ccbbc0b05ded477ada51253729 (patch) | |
tree | 4458ca24e001e08e17815d169d1266690c02cd2a /kernel/softirq.c | |
parent | d3759e7184f8f6187e62f8c4e7dcb1f6c47c075a (diff) | |
download | linux-stable-d14ce74f1fb376ccbbc0b05ded477ada51253729.tar.gz linux-stable-d14ce74f1fb376ccbbc0b05ded477ada51253729.tar.bz2 linux-stable-d14ce74f1fb376ccbbc0b05ded477ada51253729.zip |
irq: Call tick_irq_enter() inside HARDIRQ_OFFSET
Now that account_hardirq_enter() is called after HARDIRQ_OFFSET has
been incremented, there is nothing left that prevents us from also
moving tick_irq_enter() after HARDIRQ_OFFSET is incremented.
The desired outcome is to remove the nasty hack that prevents softirqs
from being raised through ksoftirqd instead of the hardirq bottom half.
Also tick_irq_enter() then becomes appropriately covered by lockdep.
Signed-off-by: Frederic Weisbecker <frederic@kernel.org>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Link: https://lore.kernel.org/r/20201202115732.27827-6-frederic@kernel.org
Diffstat (limited to 'kernel/softirq.c')
-rw-r--r-- | kernel/softirq.c | 14 |
1 files changed, 5 insertions, 9 deletions
diff --git a/kernel/softirq.c b/kernel/softirq.c index b8f42b3ba8ca..d5bfd5e661fc 100644 --- a/kernel/softirq.c +++ b/kernel/softirq.c @@ -377,16 +377,12 @@ restart: */ void irq_enter_rcu(void) { - if (is_idle_task(current) && !in_interrupt()) { - /* - * Prevent raise_softirq from needlessly waking up ksoftirqd - * here, as softirq will be serviced on return from interrupt. - */ - local_bh_disable(); + __irq_enter_raw(); + + if (is_idle_task(current) && (irq_count() == HARDIRQ_OFFSET)) tick_irq_enter(); - _local_bh_enable(); - } - __irq_enter(); + + account_hardirq_enter(current); } /** |