From: Shrikanth Hegde <sshegde@linux.ibm.com>
To: Mukesh Kumar Chaurasiya <mkchauras@linux.ibm.com>,
maddy@linux.ibm.com, mpe@ellerman.id.au, npiggin@gmail.com
Cc: christophe.leroy@csgroup.eu, oleg@redhat.com, kees@kernel.org,
luto@amacapital.net, wad@chromium.org, mchauras@linux.ibm.com,
thuth@redhat.com, akpm@linux-foundation.org, macro@orcam.me.uk,
ldv@strace.io, deller@gmx.de, charlie@rivosinc.com,
bigeasy@linutronix.de, segher@kernel.crashing.org,
thomas.weissschuh@linutronix.de, menglong8.dong@gmail.com,
ankur.a.arora@oracle.com, peterz@infradead.org,
namcao@linutronix.de, tglx@linutronix.de,
kan.liang@linux.intel.com, mingo@kernel.org,
atrajeev@linux.vnet.ibm.com, mark.barnett@arm.com,
coltonlewis@google.com, rppt@kernel.org,
linuxppc-dev@lists.ozlabs.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 0/8] Generic IRQ entry/exit support for powerpc
Date: Fri, 7 Nov 2025 21:53:13 +0530 [thread overview]
Message-ID: <5a2678a6-66e5-4c15-b95a-ce9f977f79e5@linux.ibm.com> (raw)
In-Reply-To: <20251102115358.1744304-1-mkchauras@linux.ibm.com>
On 11/2/25 5:23 PM, Mukesh Kumar Chaurasiya wrote:
> Adding support for the generic irq entry/exit handling for PowerPC. The
> goal is to bring PowerPC in line with other architectures that already
> use the common irq entry infrastructure, reducing duplicated code and
> making it easier to share future changes in entry/exit paths.
>
> This is slightly tested of ppc64le and ppc32.
>
> The performance benchmarks from perf bench basic syscall are below:
>
> | Metric | W/O Generic Framework | With Generic Framework | Change |
> | ---------- | --------------------- | ---------------------- | ------ |
> | Total time | 0.939 [sec] | 0.938 [sec] | ~0% |
> | usecs/op | 0.093900 | 0.093882 | ~0% |
> | ops/sec | 1,06,49,615 | 1,06,51,725 | ~0% |
>
> Thats very close to performance earlier with arch specific handling.
>
> Tests done:
> - Build and boot on ppc64le pseries.
> - Build and boot on ppc64le powernv8 powernv9 powernv10.
> - Build and boot on ppc32.
> - Performance benchmark done with perf syscall basic on pseries.
>
Hi Mukesh.
The context tracking is not correct.
too many warning when booted with nohz_full=<>
Did some fiddling, but no luck still in avoiding the warnings.
Below helps to boot into atleast (less warning in comparison)
diff --git a/arch/powerpc/include/asm/entry-common.h b/arch/powerpc/include/asm/entry-common.h
index 466cfafc10ad..a66cafc94b5e 100644
--- a/arch/powerpc/include/asm/entry-common.h
+++ b/arch/powerpc/include/asm/entry-common.h
@@ -217,20 +217,11 @@ static inline void arch_interrupt_enter_prepare(struct pt_regs *regs)
if (user_mode(regs)) {
kuap_lock();
- CT_WARN_ON(ct_state() != CT_STATE_USER);
- user_exit_irqoff();
account_cpu_user_entry();
account_stolen_time();
} else {
kuap_save_and_lock(regs);
- /*
- * CT_WARN_ON comes here via program_check_exception,
- * so avoid recursion.
- */
- if (TRAP(regs) != INTERRUPT_PROGRAM)
- CT_WARN_ON(ct_state() != CT_STATE_KERNEL &&
- ct_state() != CT_STATE_IDLE);
INT_SOFT_MASK_BUG_ON(regs, is_implicit_soft_masked(regs));
INT_SOFT_MASK_BUG_ON(regs, regs_irqs_disabled(regs) &&
search_kernel_restart_table(regs->nip));
diff --git a/arch/powerpc/kernel/interrupt.c b/arch/powerpc/kernel/interrupt.c
index ce59431f977c..c7cf9a3f1202 100644
--- a/arch/powerpc/kernel/interrupt.c
+++ b/arch/powerpc/kernel/interrupt.c
@@ -118,16 +118,18 @@ notrace unsigned long syscall_exit_prepare(unsigned long r3,
regs->exit_flags |= _TIF_RESTOREALL;
}
-again:
+ local_irq_disable();
+
+ user_exit_irqoff();
syscall_exit_to_user_mode(regs);
- user_enter_irqoff();
- if (!prep_irq_for_enabled_exit(true)) {
- user_exit_irqoff();
- local_irq_enable();
- local_irq_disable();
- goto again;
- }
+again:
+ if (!prep_irq_for_enabled_exit(true)) {
+ local_irq_enable();
+ local_irq_disable();
+ goto again;
+ }
+
/* Restore user access locks last */
kuap_user_restore(regs);
@@ -155,16 +157,15 @@ notrace unsigned long syscall_exit_restart(unsigned long r3, struct pt_regs *reg
#ifdef CONFIG_PPC_BOOK3S_64
set_kuap(AMR_KUAP_BLOCKED);
#endif
-again:
+ user_exit_irqoff();
syscall_exit_to_user_mode(regs);
- user_enter_irqoff();
- if (!prep_irq_for_enabled_exit(true)) {
- user_exit_irqoff();
- local_irq_enable();
- local_irq_disable();
- goto again;
- }
+again:
+ if (!prep_irq_for_enabled_exit(true)) {
+ local_irq_enable();
+ local_irq_disable();
+ goto again;
+ }
regs->exit_result |= regs->exit_flags;
@@ -178,7 +179,6 @@ notrace unsigned long interrupt_exit_user_prepare(struct pt_regs *regs)
BUG_ON(regs_is_unrecoverable(regs));
BUG_ON(regs_irqs_disabled(regs));
- CT_WARN_ON(ct_state() == CT_STATE_USER);
/*
* We don't need to restore AMR on the way back to userspace for KUAP.
@@ -188,17 +188,17 @@ notrace unsigned long interrupt_exit_user_prepare(struct pt_regs *regs)
local_irq_disable();
regs->exit_flags = 0;
-again:
+
+ user_exit_irqoff();
irqentry_exit_to_user_mode(regs);
check_return_regs_valid(regs);
- user_enter_irqoff();
- if (!prep_irq_for_enabled_exit(true)) {
- user_exit_irqoff();
- local_irq_enable();
- local_irq_disable();
- goto again;
- }
+again:
+ if (!prep_irq_for_enabled_exit(true)) {
+ local_irq_enable();
+ local_irq_disable();
+ goto again;
+ }
/* Restore user access locks last */
kuap_user_restore(regs);
@@ -222,20 +222,6 @@ notrace unsigned long interrupt_exit_kernel_prepare(struct pt_regs *regs)
if (regs_is_unrecoverable(regs))
unrecoverable_exception(regs);
- /*
- * CT_WARN_ON comes here via program_check_exception, so avoid
- * recursion.
- *
- * Skip the assertion on PMIs on 64e to work around a problem caused
- * by NMI PMIs incorrectly taking this interrupt return path, it's
- * possible for this to hit after interrupt exit to user switches
- * context to user. See also the comment in the performance monitor
- * handler in exceptions-64e.S
- */
- if (!IS_ENABLED(CONFIG_PPC_BOOK3E_64) &&
- TRAP(regs) != INTERRUPT_PROGRAM &&
- TRAP(regs) != INTERRUPT_PERFMON)
- CT_WARN_ON(ct_state() == CT_STATE_USER);
kuap = kuap_get_and_assert_locked();
@@ -316,7 +302,6 @@ notrace unsigned long interrupt_exit_user_restart(struct pt_regs *regs)
#endif
trace_hardirqs_off();
- user_exit_irqoff();
account_cpu_user_entry();
BUG_ON(!user_mode(regs));
diff --git a/arch/powerpc/kernel/syscall.c b/arch/powerpc/kernel/syscall.c
index df1c9a8d62bc..e041b187b1b7 100644
--- a/arch/powerpc/kernel/syscall.c
+++ b/arch/powerpc/kernel/syscall.c
@@ -20,6 +20,9 @@ notrace long system_call_exception(struct pt_regs *regs, unsigned long r0)
syscall_fn f;
add_random_kstack_offset();
+
+ local_irq_disable();
+ user_enter_irqoff();
r0 = syscall_enter_from_user_mode(regs, r0);
if (unlikely(r0 >= NR_syscalls)) {
next prev parent reply other threads:[~2025-11-07 16:24 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-11-02 11:53 Mukesh Kumar Chaurasiya
2025-11-02 11:53 ` [PATCH 1/8] powerpc: rename arch_irq_disabled_regs Mukesh Kumar Chaurasiya
2025-11-02 11:53 ` [PATCH 2/8] powerpc: Prepare to build with generic entry/exit framework Mukesh Kumar Chaurasiya
2025-11-02 11:53 ` [PATCH 3/8] powerpc: introduce arch_enter_from_user_mode Mukesh Kumar Chaurasiya
2025-11-02 11:53 ` [PATCH 4/8] powerpc: Introduce syscall exit arch functions Mukesh Kumar Chaurasiya
2025-11-02 11:53 ` [PATCH 5/8] powerpc: add exit_flags field in pt_regs Mukesh Kumar Chaurasiya
2025-11-02 11:53 ` [PATCH 6/8] powerpc: Prepare for IRQ entry exit Mukesh Kumar Chaurasiya
2025-11-02 11:53 ` [PATCH 7/8] powerpc: Enable IRQ generic entry/exit path Mukesh Kumar Chaurasiya
2025-11-02 11:53 ` [PATCH 8/8] powerpc: Enable Generic Entry/Exit for syscalls Mukesh Kumar Chaurasiya
2025-11-07 16:23 ` Shrikanth Hegde [this message]
2025-11-19 17:57 ` [PATCH 0/8] Generic IRQ entry/exit support for powerpc Thomas Gleixner
2025-11-21 5:48 ` Mukesh Kumar Chaurasiya
2025-11-11 4:39 ` Samir M
2025-11-11 5:09 ` Samir M
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5a2678a6-66e5-4c15-b95a-ce9f977f79e5@linux.ibm.com \
--to=sshegde@linux.ibm.com \
--cc=akpm@linux-foundation.org \
--cc=ankur.a.arora@oracle.com \
--cc=atrajeev@linux.vnet.ibm.com \
--cc=bigeasy@linutronix.de \
--cc=charlie@rivosinc.com \
--cc=christophe.leroy@csgroup.eu \
--cc=coltonlewis@google.com \
--cc=deller@gmx.de \
--cc=kan.liang@linux.intel.com \
--cc=kees@kernel.org \
--cc=ldv@strace.io \
--cc=linux-kernel@vger.kernel.org \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=luto@amacapital.net \
--cc=macro@orcam.me.uk \
--cc=maddy@linux.ibm.com \
--cc=mark.barnett@arm.com \
--cc=mchauras@linux.ibm.com \
--cc=menglong8.dong@gmail.com \
--cc=mingo@kernel.org \
--cc=mkchauras@linux.ibm.com \
--cc=mpe@ellerman.id.au \
--cc=namcao@linutronix.de \
--cc=npiggin@gmail.com \
--cc=oleg@redhat.com \
--cc=peterz@infradead.org \
--cc=rppt@kernel.org \
--cc=segher@kernel.crashing.org \
--cc=tglx@linutronix.de \
--cc=thomas.weissschuh@linutronix.de \
--cc=thuth@redhat.com \
--cc=wad@chromium.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®