[PATCH 0/8] Generic IRQ entry/exit support for powerpc

Mukesh Kumar Chaurasiya posted 8 patches 3 months, 1 week ago
There is a newer version of this series
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
[PATCH 0/8] Generic IRQ entry/exit support for powerpc
Posted by Mukesh Kumar Chaurasiya 3 months, 1 week ago
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
Re: [PATCH 0/8] Generic IRQ entry/exit support for powerpc
Posted by Samir M 2 months, 4 weeks ago
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.
Re: [PATCH 0/8] Generic IRQ entry/exit support for powerpc
Posted by Samir M 2 months, 4 weeks ago
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.

Re: [PATCH 0/8] Generic IRQ entry/exit support for powerpc
Posted by Shrikanth Hegde 3 months ago

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)) {
Re: [PATCH 0/8] Generic IRQ entry/exit support for powerpc
Posted by Thomas Gleixner 2 months, 2 weeks ago
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
Re: [PATCH 0/8] Generic IRQ entry/exit support for powerpc
Posted by Mukesh Kumar Chaurasiya 2 months, 2 weeks ago
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