[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <hvvwslwriil2y3ggavgzg7dh4asbg6uybrp2woamowp7ocqzsg@3hpmznaayhqw>
Date: Tue, 16 Dec 2025 20:36:15 +0530
From: Mukesh Kumar Chaurasiya <mkchauras@...ux.ibm.com>
To: "Christophe Leroy (CS GROUP)" <chleroy@...nel.org>
Cc: maddy@...ux.ibm.com, mpe@...erman.id.au, npiggin@...il.com,
oleg@...hat.com, kees@...nel.org, luto@...capital.net,
wad@...omium.org, mchauras@...ux.ibm.com, thuth@...hat.com,
sshegde@...ux.ibm.com, charlie@...osinc.com, macro@...am.me.uk,
akpm@...ux-foundation.org, ldv@...ace.io, deller@....de,
ankur.a.arora@...cle.com, segher@...nel.crashing.org,
tglx@...utronix.de, thomas.weissschuh@...utronix.de,
peterz@...radead.org, menglong8.dong@...il.com, bigeasy@...utronix.de,
namcao@...utronix.de, kan.liang@...ux.intel.com, mingo@...nel.org,
atrajeev@...ux.vnet.ibm.com, mark.barnett@....com,
linuxppc-dev@...ts.ozlabs.org, linux-kernel@...r.kernel.org
Subject: Re: [PATCH v2 7/8] powerpc: Enable IRQ generic entry/exit path.
On Tue, Dec 16, 2025 at 11:43:02AM +0100, Christophe Leroy (CS GROUP) wrote:
>
>
> Le 14/12/2025 à 14:02, Mukesh Kumar Chaurasiya a écrit :
> > From: Mukesh Kumar Chaurasiya <mchauras@...ux.ibm.com>
> >
> > Enable the generic IRQ entry/exit infrastructure on PowerPC by selecting
> > GENERIC_IRQ_ENTRY and integrating the architecture-specific interrupt
> > handlers with the generic entry/exit APIs.
> >
> > This change replaces PowerPC’s local interrupt entry/exit handling with
> > calls to the generic irqentry_* helpers, aligning the architecture with
> > the common kernel entry model. The macros that define interrupt, async,
> > and NMI handlers are updated to use irqentry_enter()/irqentry_exit()
> > and irqentry_nmi_enter()/irqentry_nmi_exit() where applicable.
> >
> > Key updates include:
> > - Select GENERIC_IRQ_ENTRY in Kconfig.
> > - Replace interrupt_enter/exit_prepare() with arch_interrupt_* helpers.
> > - Integrate irqentry_enter()/exit() in standard and async interrupt paths.
> > - Integrate irqentry_nmi_enter()/exit() in NMI handlers.
> > - Remove redundant irq_enter()/irq_exit() calls now handled generically.
> > - Use irqentry_exit_cond_resched() for preemption checks.
> >
> > This change establishes the necessary wiring for PowerPC to use the
> > generic IRQ entry/exit framework while maintaining existing semantics.
>
> Did you look into resulting code ?
>
> do_IRQ() is bigger and calls irqentry_enter() which is bigger than
> irq_enter().
>
> And irq_enter_rcu() was tail-called from irq_enter(), now is it called after
> irqentry_enter().
>
I am not sure if I understand your question correctly here. Can you
elaborate a little more?
> >
> > Signed-off-by: Mukesh Kumar Chaurasiya <mchauras@...ux.ibm.com>
> > ---
> > arch/powerpc/Kconfig | 1 +
> > arch/powerpc/include/asm/entry-common.h | 66 +---
> > arch/powerpc/include/asm/interrupt.h | 499 +++---------------------
> > arch/powerpc/kernel/interrupt.c | 13 +-
> > 4 files changed, 74 insertions(+), 505 deletions(-)
> >
> > diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
> > index e24f4d88885a..b0c602c3bbe1 100644
> > --- a/arch/powerpc/Kconfig
> > +++ b/arch/powerpc/Kconfig
> > @@ -206,6 +206,7 @@ config PPC
> > select GENERIC_GETTIMEOFDAY
> > select GENERIC_IDLE_POLL_SETUP
> > select GENERIC_IOREMAP
> > + select GENERIC_IRQ_ENTRY
> > select GENERIC_IRQ_SHOW
> > select GENERIC_IRQ_SHOW_LEVEL
> > select GENERIC_PCI_IOMAP if PCI
> > diff --git a/arch/powerpc/include/asm/entry-common.h b/arch/powerpc/include/asm/entry-common.h
> > index e8bde4c67eaf..e2ae7416dee1 100644
> > --- a/arch/powerpc/include/asm/entry-common.h
> > +++ b/arch/powerpc/include/asm/entry-common.h
> > @@ -257,6 +257,17 @@ static inline void arch_interrupt_enter_prepare(struct pt_regs *regs)
> > */
> > static inline void arch_interrupt_exit_prepare(struct pt_regs *regs)
> > {
> > + if (user_mode(regs)) {
> > + BUG_ON(regs_is_unrecoverable(regs));
> > + BUG_ON(regs_irqs_disabled(regs));
> > + /*
> > + * We don't need to restore AMR on the way back to userspace for KUAP.
> > + * AMR can only have been unlocked if we interrupted the kernel.
> > + */
> > + kuap_assert_locked();
> > +
> > + local_irq_disable();
> > + }
> > }
> > static inline void arch_interrupt_async_enter_prepare(struct pt_regs *regs)
> > @@ -275,7 +286,6 @@ static inline void arch_interrupt_async_enter_prepare(struct pt_regs *regs)
> > !test_thread_local_flags(_TLF_RUNLATCH))
> > __ppc64_runlatch_on();
> > #endif
> > - irq_enter();
> > }
> > static inline void arch_interrupt_async_exit_prepare(struct pt_regs *regs)
> > @@ -288,7 +298,6 @@ static inline void arch_interrupt_async_exit_prepare(struct pt_regs *regs)
> > */
> > nap_adjust_return(regs);
> > - irq_exit();
> > arch_interrupt_exit_prepare(regs);
> > }
> > @@ -354,59 +363,11 @@ static inline void arch_interrupt_nmi_enter_prepare(struct pt_regs *regs,
> > this_cpu_set_ftrace_enabled(0);
> > }
> > #endif
> > -
> > - /* If data relocations are enabled, it's safe to use nmi_enter() */
> > - if (mfmsr() & MSR_DR) {
> > - nmi_enter();
> > - return;
> > - }
> > -
> > - /*
> > - * But do not use nmi_enter() for pseries hash guest taking a real-mode
> > - * NMI because not everything it touches is within the RMA limit.
> > - */
> > - if (IS_ENABLED(CONFIG_PPC_BOOK3S_64) &&
> > - firmware_has_feature(FW_FEATURE_LPAR) &&
> > - !radix_enabled())
> > - return;
> > -
> > - /*
> > - * Likewise, don't use it if we have some form of instrumentation (like
> > - * KASAN shadow) that is not safe to access in real mode (even on radix)
> > - */
> > - if (IS_ENABLED(CONFIG_KASAN))
> > - return;
> > -
> > - /*
> > - * Likewise, do not use it in real mode if percpu first chunk is not
> > - * embedded. With CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK enabled there
> > - * are chances where percpu allocation can come from vmalloc area.
> > - */
> > - if (percpu_first_chunk_is_paged)
> > - return;
> > -
> > - /* Otherwise, it should be safe to call it */
> > - nmi_enter();
> > }
> > static inline void arch_interrupt_nmi_exit_prepare(struct pt_regs *regs,
> > struct interrupt_nmi_state *state)
> > {
> > - if (mfmsr() & MSR_DR) {
> > - // nmi_exit if relocations are on
> > - nmi_exit();
> > - } else if (IS_ENABLED(CONFIG_PPC_BOOK3S_64) &&
> > - firmware_has_feature(FW_FEATURE_LPAR) &&
> > - !radix_enabled()) {
> > - // no nmi_exit for a pseries hash guest taking a real mode exception
> > - } else if (IS_ENABLED(CONFIG_KASAN)) {
> > - // no nmi_exit for KASAN in real mode
> > - } else if (percpu_first_chunk_is_paged) {
> > - // no nmi_exit if percpu first chunk is not embedded
> > - } else {
> > - nmi_exit();
> > - }
> > -
> > /*
> > * nmi does not call nap_adjust_return because nmi should not create
> > * new work to do (must use irq_work for that).
> > @@ -435,6 +396,8 @@ static inline void arch_interrupt_nmi_exit_prepare(struct pt_regs *regs,
> > static __always_inline void arch_enter_from_user_mode(struct pt_regs *regs)
> > {
> > + kuap_lock();
> > +
>
> A reason why this change comes now and not in the patch that added
> arch_enter_from_user_mode() ?
>
Yes it should have been. Will fix this in next revision.
> > if (IS_ENABLED(CONFIG_PPC_IRQ_SOFT_MASK_DEBUG))
> > BUG_ON(irq_soft_mask_return() != IRQS_ALL_DISABLED);
> > @@ -467,11 +430,8 @@ static __always_inline void arch_enter_from_user_mode(struct pt_regs *regs)
> > } else
> > #endif
> > kuap_assert_locked();
> > -
> > booke_restore_dbcr0();
> > -
>
> This is cosmetic, should have been done when adding
> arch_enter_from_user_mode()
>
Sure, Will fix this.
Regards,
Mukesh
> > account_cpu_user_entry();
> > -
> > account_stolen_time();
> > /*
>
>
> Christophe
Powered by blists - more mailing lists