On Thu, Jul 7, 2022 at 1:05 PM Qi Zheng <zhengqi.arch@xxxxxxxxxxxxx> wrote:
Since softirqs are handled on the per-CPU IRQ stack,
let's support HAVE_IRQ_EXIT_ON_IRQ_STACK which causes
the core code to invoke __do_softirq() directly without
going through do_softirq_own_stack().
Signed-off-by: Qi Zheng <zhengqi.arch@xxxxxxxxxxxxx>
I think the idea is right, but the extra function pointer adds more complexity
than necessary:
static __always_inline void __el1_irq(struct pt_regs *regs,
void (*handler)(struct pt_regs *))
{
enter_from_kernel_mode(regs);
- irq_enter_rcu();
- do_interrupt_handler(regs, handler);
- irq_exit_rcu();
+ do_interrupt_handler(regs, handler, irq_handler);
arm64_preempt_schedule_irq();
@@ -699,9 +711,7 @@ static void noinstr el0_interrupt(struct pt_regs *regs,
if (regs->pc & BIT(55))
arm64_apply_bp_hardening();
- irq_enter_rcu();
- do_interrupt_handler(regs, handler);
- irq_exit_rcu();
+ do_interrupt_handler(regs, handler, irq_handler);
exit_to_user_mode(regs);
}
Would it be possible to instead pull out the call_on_irq_stack() so these
two functions are instead called on the IRQ stack already?
Arnd