]> git.ipfire.org Git - thirdparty/kernel/linux.git/commit
rseq: Switch to fast path processing on exit to user
authorThomas Gleixner <tglx@linutronix.de>
Mon, 27 Oct 2025 08:45:19 +0000 (09:45 +0100)
committerIngo Molnar <mingo@kernel.org>
Tue, 4 Nov 2025 07:34:39 +0000 (08:34 +0100)
commit3db6b38dfe640207da706b286d4181237391f5bd
treef9fdb76a233c82205500f214a573d1af7a31fa96
parent05b44aef709cae5e4274590f050cf35049dcc24e
rseq: Switch to fast path processing on exit to user

Now that all bits and pieces are in place, hook the RSEQ handling fast path
function into exit_to_user_mode_prepare() after the TIF work bits have been
handled. If case of fast path failure, TIF_NOTIFY_RESUME has been raised
and the caller needs to take another turn through the TIF handling slow
path.

This only works for architectures which use the generic entry code.
Architectures who still have their own incomplete hacks are not supported
and won't be.

This results in the following improvements:

  Kernel build        Before   After       Reduction

  exit to user         80692981   80514451
  signal checks:          32581        121        99%
  slowpath runs:        1201408   1.49%        198 0.00%      100%
  fastpath runs:     675941 0.84%       N/A
  id updates:           1233989   1.53%      50541 0.06%       96%
  cs checks:            1125366   1.39%          0 0.00%      100%
    cs cleared:         1125366      100%  0            100%
    cs fixup:                 0        0%  0

  RSEQ selftests      Before   After       Reduction

  exit to user:       386281778   387373750
  signal checks:       35661203           0           100%
  slowpath runs:      140542396 36.38%         100  0.00%    100%
  fastpath runs:     9509789  2.51%     N/A
  id updates:         176203599 45.62%     9087994  2.35%     95%
  cs checks:          175587856 45.46%     4728394  1.22%     98%
    cs cleared:       172359544   98.16%    1319307   27.90%   99%
    cs fixup:           3228312    1.84%    3409087   72.10%

The 'cs cleared' and 'cs fixup' percentages are not relative to the exit to
user invocations, they are relative to the actual 'cs check' invocations.

While some of this could have been avoided in the original code, like the
obvious clearing of CS when it's already clear, the main problem of going
through TIF_NOTIFY_RESUME cannot be solved. In some workloads the RSEQ
notify handler is invoked more than once before going out to user
space. Doing this once when everything has stabilized is the only solution
to avoid this.

The initial attempt to completely decouple it from the TIF work turned out
to be suboptimal for workloads, which do a lot of quick and short system
calls. Even if the fast path decision is only 4 instructions (including a
conditional branch), this adds up quickly and becomes measurable when the
rate for actually having to handle rseq is in the low single digit
percentage range of user/kernel transitions.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Reviewed-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Link: https://patch.msgid.link/20251027084307.701201365@linutronix.de
include/linux/irq-entry-common.h
include/linux/resume_user_mode.h
include/linux/rseq.h
init/Kconfig
kernel/entry/common.c
kernel/rseq.c