arch/powerpc/Kconfig | 2 + arch/powerpc/include/asm/entry-common.h | 539 ++++++++++++++++++++++++ arch/powerpc/include/asm/hw_irq.h | 4 +- arch/powerpc/include/asm/interrupt.h | 401 +++--------------- arch/powerpc/include/asm/ptrace.h | 3 + arch/powerpc/include/asm/stacktrace.h | 6 + arch/powerpc/include/asm/syscall.h | 5 + arch/powerpc/include/asm/thread_info.h | 1 + arch/powerpc/include/uapi/asm/ptrace.h | 14 +- arch/powerpc/kernel/asm-offsets.c | 1 + arch/powerpc/kernel/interrupt.c | 258 +++--------- arch/powerpc/kernel/ptrace/ptrace.c | 142 +------ arch/powerpc/kernel/signal.c | 8 + arch/powerpc/kernel/syscall.c | 119 +----- arch/powerpc/kernel/traps.c | 2 +- arch/powerpc/kernel/watchdog.c | 2 +- arch/powerpc/perf/core-book3s.c | 2 +- 17 files changed, 693 insertions(+), 816 deletions(-) create mode 100644 arch/powerpc/include/asm/entry-common.h
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. Changelog: RFC -> PATCH - Fix for ppc32 spitting out kuap lock warnings. - ppc64le powernv8 crash fix. - Review comments incorporated from previous RFC. RFC https://lore.kernel.org/all/20250908210235.137300-2-mchauras@linux.ibm.com/ Mukesh Kumar Chaurasiya (8): powerpc: rename arch_irq_disabled_regs powerpc: Prepare to build with generic entry/exit framework powerpc: introduce arch_enter_from_user_mode powerpc: Introduce syscall exit arch functions powerpc: add exit_flags field in pt_regs powerpc: Prepare for IRQ entry exit powerpc: Enable IRQ generic entry/exit path. powerpc: Enable Generic Entry/Exit for syscalls. arch/powerpc/Kconfig | 2 + arch/powerpc/include/asm/entry-common.h | 539 ++++++++++++++++++++++++ arch/powerpc/include/asm/hw_irq.h | 4 +- arch/powerpc/include/asm/interrupt.h | 401 +++--------------- arch/powerpc/include/asm/ptrace.h | 3 + arch/powerpc/include/asm/stacktrace.h | 6 + arch/powerpc/include/asm/syscall.h | 5 + arch/powerpc/include/asm/thread_info.h | 1 + arch/powerpc/include/uapi/asm/ptrace.h | 14 +- arch/powerpc/kernel/asm-offsets.c | 1 + arch/powerpc/kernel/interrupt.c | 258 +++--------- arch/powerpc/kernel/ptrace/ptrace.c | 142 +------ arch/powerpc/kernel/signal.c | 8 + arch/powerpc/kernel/syscall.c | 119 +----- arch/powerpc/kernel/traps.c | 2 +- arch/powerpc/kernel/watchdog.c | 2 +- arch/powerpc/perf/core-book3s.c | 2 +- 17 files changed, 693 insertions(+), 816 deletions(-) create mode 100644 arch/powerpc/include/asm/entry-common.h -- 2.51.0
On 02/11/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. > > Changelog: > > RFC -> PATCH > - Fix for ppc32 spitting out kuap lock warnings. > - ppc64le powernv8 crash fix. > - Review comments incorporated from previous RFC. > RFC https://lore.kernel.org/all/20250908210235.137300-2-mchauras@linux.ibm.com/ > > Mukesh Kumar Chaurasiya (8): > powerpc: rename arch_irq_disabled_regs > powerpc: Prepare to build with generic entry/exit framework > powerpc: introduce arch_enter_from_user_mode > powerpc: Introduce syscall exit arch functions > powerpc: add exit_flags field in pt_regs > powerpc: Prepare for IRQ entry exit > powerpc: Enable IRQ generic entry/exit path. > powerpc: Enable Generic Entry/Exit for syscalls. > > arch/powerpc/Kconfig | 2 + > arch/powerpc/include/asm/entry-common.h | 539 ++++++++++++++++++++++++ > arch/powerpc/include/asm/hw_irq.h | 4 +- > arch/powerpc/include/asm/interrupt.h | 401 +++--------------- > arch/powerpc/include/asm/ptrace.h | 3 + > arch/powerpc/include/asm/stacktrace.h | 6 + > arch/powerpc/include/asm/syscall.h | 5 + > arch/powerpc/include/asm/thread_info.h | 1 + > arch/powerpc/include/uapi/asm/ptrace.h | 14 +- > arch/powerpc/kernel/asm-offsets.c | 1 + > arch/powerpc/kernel/interrupt.c | 258 +++--------- > arch/powerpc/kernel/ptrace/ptrace.c | 142 +------ > arch/powerpc/kernel/signal.c | 8 + > arch/powerpc/kernel/syscall.c | 119 +----- > arch/powerpc/kernel/traps.c | 2 +- > arch/powerpc/kernel/watchdog.c | 2 +- > arch/powerpc/perf/core-book3s.c | 2 +- > 17 files changed, 693 insertions(+), 816 deletions(-) > create mode 100644 arch/powerpc/include/asm/entry-common.h > Hi, I have reviewed and tested the generic IRQ entry/exist patch series. Below are my observations: Test Coverage • Successfully ran LTP (specially syscall) and entire LTP test suite, without observing any regressions or issues related to the implementation. System Configuration • CPUs: 160 • Kernel: v6.18.0-rc1+ • Processor mode: Shared (uncapped) Performance Evaluation • Conducted benchmarking using perf bench syscall basic -l and hackbench. • No functional regressions observed, and results were consistent with expectations. • Results for perf bench syscall**Loops = 100,000** **Loops = 100,000** | Metric | W/O Generic Framework | With Generic Framework | Improvement | |----------|-----------------------:|-----------------------:|------------:| | usecs/op | 0.125328 | 0.128839 | ~-2.80% | | ops/sec | 7,979,645 | 7,762,047 | ~-2.73% | **Loops = 1,000,000** | Metric | W/O Generic Framework | With Generic Framework | Improvement | |----------|-----------------------:|-----------------------:|------------:| | usecs/op | 0.125015 | 0.127885 | ~-2.30% | | ops/sec | 7,999,051 | 7,819,546 | ~-2.24% | **Loops = 10,000,000** | Metric | W/O Generic Framework | With Generic Framework | Improvement | |----------|-----------------------:|-----------------------:|------------:| | usecs/op | 0.124613 | 0.127426 | ~-2.26% | | ops/sec | 8,024,827 | 7,847,735 | ~-2.21% | **Overall (aggregated across all runs)** | Metric | W/O Generic Framework | With Generic Framework | Improvement | | ---------- | ---------------------:|-----------------------:|------------:| | Total time | 1.384 [sec] | 1.415 [sec] | ~-2.27% | | usecs/op | 0.124656 | 0.127480 | ~-2.27% | | ops/sec | 8,022,098 | 7,844,423 | ~-2.21% | A 2% performance degradation was observed with the perf bench syscall. • Results for hackbench | Metric | W/O Generic Framework | With Generic Framework | Improvement | |----------|---------------------- :|-----------------------:|------------:| | Min Time | 142.055 (sec). | 141.699 (sec) | 0.25% | Max Time | 143.791 (sec). | 143.206 (sec) | 0.41% | Avg Time | 142.925 (sec) | 142.472 (sec) | 0.32% So overall 0.3 % improvement is observed across 10 runs. Please add below tag for the patch set. Tested-by: Samir M <samir@linux.ibm.com> Thank You !! Regards, Samir.
On 11/11/25 10:09 am, Samir M wrote: > On 02/11/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. >> >> Changelog: >> >> RFC -> PATCH >> - Fix for ppc32 spitting out kuap lock warnings. >> - ppc64le powernv8 crash fix. >> - Review comments incorporated from previous RFC. >> RFC >> https://lore.kernel.org/all/20250908210235.137300-2-mchauras@linux.ibm.com/ >> >> Mukesh Kumar Chaurasiya (8): >> powerpc: rename arch_irq_disabled_regs >> powerpc: Prepare to build with generic entry/exit framework >> powerpc: introduce arch_enter_from_user_mode >> powerpc: Introduce syscall exit arch functions >> powerpc: add exit_flags field in pt_regs >> powerpc: Prepare for IRQ entry exit >> powerpc: Enable IRQ generic entry/exit path. >> powerpc: Enable Generic Entry/Exit for syscalls. >> >> arch/powerpc/Kconfig | 2 + >> arch/powerpc/include/asm/entry-common.h | 539 ++++++++++++++++++++++++ >> arch/powerpc/include/asm/hw_irq.h | 4 +- >> arch/powerpc/include/asm/interrupt.h | 401 +++--------------- >> arch/powerpc/include/asm/ptrace.h | 3 + >> arch/powerpc/include/asm/stacktrace.h | 6 + >> arch/powerpc/include/asm/syscall.h | 5 + >> arch/powerpc/include/asm/thread_info.h | 1 + >> arch/powerpc/include/uapi/asm/ptrace.h | 14 +- >> arch/powerpc/kernel/asm-offsets.c | 1 + >> arch/powerpc/kernel/interrupt.c | 258 +++--------- >> arch/powerpc/kernel/ptrace/ptrace.c | 142 +------ >> arch/powerpc/kernel/signal.c | 8 + >> arch/powerpc/kernel/syscall.c | 119 +----- >> arch/powerpc/kernel/traps.c | 2 +- >> arch/powerpc/kernel/watchdog.c | 2 +- >> arch/powerpc/perf/core-book3s.c | 2 +- >> 17 files changed, 693 insertions(+), 816 deletions(-) >> create mode 100644 arch/powerpc/include/asm/entry-common.h >> > Hi, > > I have reviewed and tested the generic IRQ entry/exist patch series. > Below are my observations: > > Test Coverage > • Successfully ran LTP (specially syscall) and entire LTP test suite, > without observing any regressions or issues related to the > implementation. > > System Configuration > • CPUs: 160 > • Kernel: v6.18.0-rc1+ > • Processor mode: Shared (uncapped) > > Performance Evaluation > • Conducted benchmarking using perf bench syscall basic -l and > hackbench. > • No functional regressions observed, and results were consistent with > expectations. > > • Results for perf bench syscall**Loops = 100,000** > **Loops = 100,000** > | Metric | W/O Generic Framework | With Generic Framework > | Improvement | > |----------|-----------------------:|-----------------------:|------------:| > > | usecs/op | 0.125328 | 0.128839 > | ~-2.80% | > | ops/sec | 7,979,645 | 7,762,047 > | ~-2.73% | > > **Loops = 1,000,000** > | Metric | W/O Generic Framework | With Generic > Framework | Improvement | > |----------|-----------------------:|-----------------------:|------------:| > > | usecs/op | 0.125015 | 0.127885 > | ~-2.30% | > | ops/sec | 7,999,051 | 7,819,546 > | ~-2.24% | > > **Loops = 10,000,000** > | Metric | W/O Generic Framework | With Generic Framework > | Improvement | > |----------|-----------------------:|-----------------------:|------------:| > > | usecs/op | 0.124613 | 0.127426 > | ~-2.26% | > | ops/sec | 8,024,827 | 7,847,735 > | ~-2.21% | > > **Overall (aggregated across all runs)** > | Metric | W/O Generic Framework | With Generic Framework > | Improvement | > | ---------- | > ---------------------:|-----------------------:|------------:| > | Total time | 1.384 [sec] | 1.415 [sec] > | ~-2.27% | > | usecs/op | 0.124656 | 0.127480 > | ~-2.27% | > | ops/sec | 8,022,098 | 7,844,423 > | ~-2.21% | > > A 2% performance degradation was observed with the perf bench syscall. > > • Results for hackbench > > | Metric | W/O Generic Framework | With Generic Framework > | Improvement | > |----------|---------------------- > :|-----------------------:|------------:| > | Min Time | 142.055 (sec). | 141.699 (sec) > | 0.25% > | Max Time | 143.791 (sec). | 143.206 (sec) > | 0.41% > | Avg Time | 142.925 (sec) | 142.472 (sec) > | 0.32% > > So overall 0.3 % improvement is observed across 10 runs. > > Please add below tag for the patch set. > Tested-by: Samir M <samir@linux.ibm.com> > Thank You !! > > > Regards, > Samir. > Hi, Apologies for the earlier email. The benchmark results table was not properly formatted in that version, so I am re-sending the results below for clarity. I have reviewed and tested the generic IRQ entry/exist patch series. Below are my observations: Test Coverage • Successfully ran LTP (specially syscall) and entire LTP test suite, without observing any regressions or issues related to the implementation. System Configuration • CPUs: 160 • Kernel: v6.18.0-rc1+ • Processor mode: Shared (uncapped) Performance Evaluation • Conducted benchmarking using perf bench syscall basic -l and hackbench. • No functional regressions observed, and results were consistent with expectations. • Results for perf bench syscall Loops = 100,000 +-----------+------------------------+------------------------+------------+ | Metric | W/O Generic Framework | With Generic Framework | Improvement | +-----------+------------------------+------------------------+------------+ | usecs/op | 0.125328 | 0.128839 | ~-2.80% | | ops/sec | 7,979,645 | 7,762,047 | ~-2.73% | +-----------+------------------------+------------------------+------------+ Loops = 1,000,000 +-----------+------------------------+------------------------+------------+ | Metric | W/O Generic Framework | With Generic Framework | Improvement | +-----------+------------------------+------------------------+------------+ | usecs/op | 0.125015 | 0.127885 | ~-2.30% | | ops/sec | 7,999,051 | 7,819,546 | ~-2.24% | +-----------+------------------------+------------------------+------------+ Loops = 10,000,000 +-----------+------------------------+------------------------+------------+ | Metric | W/O Generic Framework | With Generic Framework | Improvement | +-----------+------------------------+------------------------+------------+ | usecs/op | 0.124613 | 0.127426 | ~-2.26% | | ops/sec | 8,024,827 | 7,847,735 | ~-2.21% | +-----------+------------------------+------------------------+------------+ Overall (aggregated across all runs) +-------------+------------------------+------------------------+----------+ | Metric | W/O Generic Framework | With Generic Framework | Improvement | +-------------+------------------------+------------------------+----------+ | Total time | 1.384 [sec] | 1.415 [sec] | ~-2.27% | | usecs/op | 0.124656 | 0.127480 | ~-2.27% | | ops/sec | 8,022,098 | 7,844,423 | ~-2.21% | +-------------+------------------------+------------------------+----------+ A 2% performance degradation was observed with the perf bench syscall. • Results for hackbench +-----------+---------------------------+---------------------------+------+ | Metric | W/O Generic Framework | With Generic Framework | Improvement | +-----------+---------------------------+---------------------------+------+ | Min Time | 142.055 (sec) | 141.699 (sec) | +0.25% | | Max Time | 143.791 (sec) | 143.206 (sec) | +0.41% | | Avg Time | 142.925 (sec) | 142.472 (sec) | +0.32% | +-----------+---------------------------+---------------------------+------+ So overall 0.3 % improvement is observed across 10 runs. Please add below tag for the patch set. Tested-by: Samir M <samir@linux.ibm.com> Thank You !! Regards, Samir.
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)) {
On Fri, Nov 07 2025 at 21:53, Shrikanth Hegde wrote:
> On 11/2/25 5:23 PM, Mukesh Kumar Chaurasiya wrote:
> 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;
> + }
> +
This does not look right at all.
syscall_exit_to_user_mode(regs)
syscall_exit_to_user_mode_work()
exit_to_user_mode()
user_exit_irqoff()
What you really want to do here is:
again:
syscall_exit_to_user_mode_work(regs);
exit_to_user_mode(regs);
if (!prep_irq_for_enabled_exit(true)) {
// Re-establishes the full state required
// to restart
enter_from_user_mode(regs);
local_irq_enable();
local_irq_disable();
goto again;
That should cure it. Same issue in the other places.
Thanks,
tglx
On 11/19/25 11:27 PM, Thomas Gleixner wrote:
> On Fri, Nov 07 2025 at 21:53, Shrikanth Hegde wrote:
>> On 11/2/25 5:23 PM, Mukesh Kumar Chaurasiya wrote:
>> 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;
>> + }
>> +
> This does not look right at all.
>
> syscall_exit_to_user_mode(regs)
> syscall_exit_to_user_mode_work()
> exit_to_user_mode()
> user_exit_irqoff()
yeah we also found an issue with context tracking here. I am working on
fixing it.
>
> What you really want to do here is:
>
> again:
> syscall_exit_to_user_mode_work(regs);
>
> exit_to_user_mode(regs);
> if (!prep_irq_for_enabled_exit(true)) {
> // Re-establishes the full state required
> // to restart
> enter_from_user_mode(regs);
> local_irq_enable();
> local_irq_disable();
> goto again;
>
> That should cure it. Same issue in the other places.
This helps. Let me try this and i'll send a new version out as soon as
we are done with testing.
> Thanks,
>
> tglx
Thanks for the review.
Regards,
Mukesh
© 2016 - 2026 Red Hat, Inc.