Skip to content

Commit 7392e4d

Browse files
npiggingregkh
authored andcommitted
powerpc/64: fix irq replay missing preempt
[ Upstream commit 903fd31 ] Prior to commit 3282a3d ("powerpc/64: Implement soft interrupt replay in C"), replayed interrupts returned by the regular interrupt exit code, which performs preemption in case an interrupt had set need_resched. This logic was missed by the conversion. Adding preempt_disable/enable around the interrupt replay and final irq enable will reschedule if needed. Fixes: 3282a3d ("powerpc/64: Implement soft interrupt replay in C") Signed-off-by: Nicholas Piggin <npiggin@gmail.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/20200915114650.3980244-1-npiggin@gmail.com Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent 86e76db commit 7392e4d

1 file changed

Lines changed: 7 additions & 0 deletions

File tree

arch/powerpc/kernel/irq.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -368,6 +368,12 @@ notrace void arch_local_irq_restore(unsigned long mask)
368368
}
369369
}
370370

371+
/*
372+
* Disable preempt here, so that the below preempt_enable will
373+
* perform resched if required (a replayed interrupt may set
374+
* need_resched).
375+
*/
376+
preempt_disable();
371377
irq_soft_mask_set(IRQS_ALL_DISABLED);
372378
trace_hardirqs_off();
373379

@@ -377,6 +383,7 @@ notrace void arch_local_irq_restore(unsigned long mask)
377383
trace_hardirqs_on();
378384
irq_soft_mask_set(IRQS_ENABLED);
379385
__hard_irq_enable();
386+
preempt_enable();
380387
}
381388
EXPORT_SYMBOL(arch_local_irq_restore);
382389

0 commit comments

Comments
 (0)