From: "Michal Suchánek" <msuchanek@suse.de>
To: Thomas Gleixner <tglx@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>,
Jonathan Corbet <corbet@lwn.net>,
Shuah Khan <skhan@linuxfoundation.org>,
Huacai Chen <chenhuacai@kernel.org>,
WANG Xuerui <kernel@xen0n.name>,
Madhavan Srinivasan <maddy@linux.ibm.com>,
Michael Ellerman <mpe@ellerman.id.au>,
Nicholas Piggin <npiggin@gmail.com>,
"Christophe Leroy (CS GROUP)" <chleroy@kernel.org>,
Paul Walmsley <pjw@kernel.org>,
Palmer Dabbelt <palmer@dabbelt.com>,
Albert Ou <aou@eecs.berkeley.edu>,
Alexandre Ghiti <alex@ghiti.fr>,
Heiko Carstens <hca@linux.ibm.com>,
Vasily Gorbik <gor@linux.ibm.com>,
Alexander Gordeev <agordeev@linux.ibm.com>,
Christian Borntraeger <borntraeger@linux.ibm.com>,
Sven Schnelle <svens@linux.ibm.com>,
Andy Lutomirski <luto@kernel.org>, Ingo Molnar <mingo@redhat.com>,
Borislav Petkov <bp@alien8.de>,
Dave Hansen <dave.hansen@linux.intel.com>,
x86@kernel.org, "H. Peter Anvin" <hpa@zytor.com>,
Andrew Donnellan <andrew+kernel@donnellan.id.au>,
Mark Rutland <mark.rutland@arm.com>,
Arnd Bergmann <arnd@arndb.de>,
Jiaxun Yang <jiaxun.yang@flygoat.com>,
Ryan Roberts <ryan.roberts@arm.com>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Mukesh Kumar Chaurasiya <mkchauras@linux.ibm.com>,
Shrikanth Hegde <sshegde@linux.ibm.com>,
Zong Li <zong.li@sifive.com>, Nam Cao <namcao@linutronix.de>,
Deepak Gupta <debug@rivosinc.com>,
Lukas Gerlach <lukas.gerlach@cispa.de>,
Rui Qi <qirui.001@bytedance.com>, Kees Cook <kees@kernel.org>,
linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org,
loongarch@lists.linux.dev, linuxppc-dev@lists.ozlabs.org,
linux-riscv@lists.infradead.org, linux-s390@vger.kernel.org
Subject: Re: [RFC] entry: Untangle the return value of syscall_enter_from_user_mode from syscall NR
Date: Thu, 2 Jul 2026 13:45:46 +0200 [thread overview]
Message-ID: <akZPakNl6JT_jgGd@kunlun.suse.cz> (raw)
In-Reply-To: <878q7tprau.ffs@fw13>
On Thu, Jul 02, 2026 at 01:24:57PM +0200, Thomas Gleixner wrote:
> On Wed, Jul 01 2026 at 19:42, Michal Suchánek wrote:
> > The return value of syscall_enter_from_user_mode is used both for the
> > adjusted syscall number and the indicator that a syscall should be
> > skipped.
> >
> > As seccomp can be invoked on any syscall, including invalid ones this
> > somewhat undermines seccomp.
> >
> > While the seccomp variants that terminate the process do not need to
> > care about this for the filter that sets the syscall return value this
> > disctinction is required.
>
> You completely fail to explain why and what actual problem you are
> trying to solve. At least I can't figure it out from the above word
> salad.
syscall_enter_from_user_mode returns the new syscall number after doing
something arbitrarry with it, including running seccomp.
Wehn the syscall is already handled, eg. by seccomp filtering it returns
-1 as the new syscall number. -1 is an invalid syscall number but it can
still be filtered by seccomp. When the syscall number was -1 to start
with it's not possible to determine if the syscall was fileterd from the
return value. s390 returns the filtered state in a flag it sets on the
regs structure, avoiding this problem.
However, the API should be specified in a way that does not require
everyone implementing such flag.
>
> > Pass the syscall number as a pointer to the inline entry functions, and
> > use the return value exclusively for the indication that the syscall is
> > already handled.
> >
> > This should avoid the need for the s390 PIF_SYSCALL_RET_SET which is the
> > workaround for exactly this deficiency.
> >
> > If this is desirable the patch could be split into some series that
> > adjusts the code flow where needed so that the final change is mostly
> > mechanical.
>
> That's not a matter of desire. That's mandatory.
So long as it's desirable to implement an API change in this direction,
it's not clear to me so far.
> > - instrumentation_begin();
> > - if (!invoke_syscall(regs, nr) && nr != -1)
> > - result_reg(regs) = __sys_ni_syscall(regs);
> > - instrumentation_end();
> > + /* Skip syscall when -1 is returned */
> > + if (!syscall_enter_from_user_mode(regs, &nr)) {
>
> Seriously?
>
> If we go and separate the syscall number from the return value, then the
> return value 0 means success and anything else fail. Which in other
> words is a boolean. So instead of tastelessly adding a completely
> nonsensical comment about -1 here, syscall_enter_from_user_mode() wants
> to have the return value type bool with a proper boolean logic: true =
> success, false = abort.
We have that very same API down to __secure_computing() which returns
boolean represented as -1 and 0 values. That does not mean it's not
tasteless.
>
> > @@ -168,8 +168,7 @@ __visible noinstr void do_int80_emulation(struct pt_regs *regs)
> > nr = syscall_32_enter(regs);
> >
> > local_irq_enable();
> > - nr = syscall_enter_from_user_mode_work(regs, nr);
> > - do_syscall_32_irqs_on(regs, nr);
> > + syscall_enter_from_user_mode_work(regs, &nr);
>
> How exactly is this ever going to invoke a valid syscall?
That's one of the problems with giant all-in-one patch, things like this
easily slip in. However, it is in cluded mostly for illustration, I
don't expect anyone to merge this as-is.
>
> > + if (!syscall_enter_from_user_mode_work(regs, &nr)) {
> > + nr &= GENMASK(31, 0);
> > + do_syscall_32_irqs_on(regs, nr);
>
> do_syscall_32_irqs_on(regs, (int)nr);
>
> would be too simple, right?
Also way less explicit.
Thanks
Michal
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
WARNING: multiple messages have this Message-ID (diff)
From: "Michal Suchánek" <msuchanek@suse.de>
To: Thomas Gleixner <tglx@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>,
Jonathan Corbet <corbet@lwn.net>,
Shuah Khan <skhan@linuxfoundation.org>,
Huacai Chen <chenhuacai@kernel.org>,
WANG Xuerui <kernel@xen0n.name>,
Madhavan Srinivasan <maddy@linux.ibm.com>,
Michael Ellerman <mpe@ellerman.id.au>,
Nicholas Piggin <npiggin@gmail.com>,
"Christophe Leroy (CS GROUP)" <chleroy@kernel.org>,
Paul Walmsley <pjw@kernel.org>,
Palmer Dabbelt <palmer@dabbelt.com>,
Albert Ou <aou@eecs.berkeley.edu>,
Alexandre Ghiti <alex@ghiti.fr>,
Heiko Carstens <hca@linux.ibm.com>,
Vasily Gorbik <gor@linux.ibm.com>,
Alexander Gordeev <agordeev@linux.ibm.com>,
Christian Borntraeger <borntraeger@linux.ibm.com>,
Sven Schnelle <svens@linux.ibm.com>,
Andy Lutomirski <luto@kernel.org>, Ingo Molnar <mingo@redhat.com>,
Borislav Petkov <bp@alien8.de>,
Dave Hansen <dave.hansen@linux.intel.com>,
x86@kernel.org, "H. Peter Anvin" <hpa@zytor.com>,
Andrew Donnellan <andrew+kernel@donnellan.id.au>,
Mark Rutland <mark.rutland@arm.com>,
Arnd Bergmann <arnd@arndb.de>,
Jiaxun Yang <jiaxun.yang@flygoat.com>,
Ryan Roberts <ryan.roberts@arm.com>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Mukesh Kumar Chaurasiya <mkchauras@linux.ibm.com>,
Shrikanth Hegde <sshegde@linux.ibm.com>,
Zong Li <zong.li@sifive.com>, Nam Cao <namcao@linutronix.de>,
Deepak Gupta <debug@rivosinc.com>,
Lukas Gerlach <lukas.gerlach@cispa.de>,
Rui Qi <qirui.001@bytedance.com>, Kees Cook <kees@kernel.org>,
linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org,
loongarch@lists.linux.dev, linuxppc-dev@lists.ozlabs.org,
linux-riscv@lists.infradead.org, linux-s390@vger.kernel.org
Subject: Re: [RFC] entry: Untangle the return value of syscall_enter_from_user_mode from syscall NR
Date: Thu, 2 Jul 2026 13:45:46 +0200 [thread overview]
Message-ID: <akZPakNl6JT_jgGd@kunlun.suse.cz> (raw)
In-Reply-To: <878q7tprau.ffs@fw13>
On Thu, Jul 02, 2026 at 01:24:57PM +0200, Thomas Gleixner wrote:
> On Wed, Jul 01 2026 at 19:42, Michal Suchánek wrote:
> > The return value of syscall_enter_from_user_mode is used both for the
> > adjusted syscall number and the indicator that a syscall should be
> > skipped.
> >
> > As seccomp can be invoked on any syscall, including invalid ones this
> > somewhat undermines seccomp.
> >
> > While the seccomp variants that terminate the process do not need to
> > care about this for the filter that sets the syscall return value this
> > disctinction is required.
>
> You completely fail to explain why and what actual problem you are
> trying to solve. At least I can't figure it out from the above word
> salad.
syscall_enter_from_user_mode returns the new syscall number after doing
something arbitrarry with it, including running seccomp.
Wehn the syscall is already handled, eg. by seccomp filtering it returns
-1 as the new syscall number. -1 is an invalid syscall number but it can
still be filtered by seccomp. When the syscall number was -1 to start
with it's not possible to determine if the syscall was fileterd from the
return value. s390 returns the filtered state in a flag it sets on the
regs structure, avoiding this problem.
However, the API should be specified in a way that does not require
everyone implementing such flag.
>
> > Pass the syscall number as a pointer to the inline entry functions, and
> > use the return value exclusively for the indication that the syscall is
> > already handled.
> >
> > This should avoid the need for the s390 PIF_SYSCALL_RET_SET which is the
> > workaround for exactly this deficiency.
> >
> > If this is desirable the patch could be split into some series that
> > adjusts the code flow where needed so that the final change is mostly
> > mechanical.
>
> That's not a matter of desire. That's mandatory.
So long as it's desirable to implement an API change in this direction,
it's not clear to me so far.
> > - instrumentation_begin();
> > - if (!invoke_syscall(regs, nr) && nr != -1)
> > - result_reg(regs) = __sys_ni_syscall(regs);
> > - instrumentation_end();
> > + /* Skip syscall when -1 is returned */
> > + if (!syscall_enter_from_user_mode(regs, &nr)) {
>
> Seriously?
>
> If we go and separate the syscall number from the return value, then the
> return value 0 means success and anything else fail. Which in other
> words is a boolean. So instead of tastelessly adding a completely
> nonsensical comment about -1 here, syscall_enter_from_user_mode() wants
> to have the return value type bool with a proper boolean logic: true =
> success, false = abort.
We have that very same API down to __secure_computing() which returns
boolean represented as -1 and 0 values. That does not mean it's not
tasteless.
>
> > @@ -168,8 +168,7 @@ __visible noinstr void do_int80_emulation(struct pt_regs *regs)
> > nr = syscall_32_enter(regs);
> >
> > local_irq_enable();
> > - nr = syscall_enter_from_user_mode_work(regs, nr);
> > - do_syscall_32_irqs_on(regs, nr);
> > + syscall_enter_from_user_mode_work(regs, &nr);
>
> How exactly is this ever going to invoke a valid syscall?
That's one of the problems with giant all-in-one patch, things like this
easily slip in. However, it is in cluded mostly for illustration, I
don't expect anyone to merge this as-is.
>
> > + if (!syscall_enter_from_user_mode_work(regs, &nr)) {
> > + nr &= GENMASK(31, 0);
> > + do_syscall_32_irqs_on(regs, nr);
>
> do_syscall_32_irqs_on(regs, (int)nr);
>
> would be too simple, right?
Also way less explicit.
Thanks
Michal
next prev parent reply other threads:[~2026-07-02 11:46 UTC|newest]
Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-01 17:42 [RFC] entry: Untangle the return value of syscall_enter_from_user_mode from syscall NR Michal Suchánek
2026-07-01 17:42 ` Michal Suchánek
2026-07-01 17:58 ` sashiko-bot
2026-07-01 18:29 ` H. Peter Anvin
2026-07-01 18:29 ` H. Peter Anvin
2026-07-02 9:30 ` Michal Suchánek
2026-07-02 9:30 ` Michal Suchánek
2026-07-02 21:49 ` Thomas Gleixner
2026-07-02 21:49 ` Thomas Gleixner
2026-07-03 6:26 ` Sven Schnelle
2026-07-03 6:26 ` Sven Schnelle
2026-07-03 9:25 ` Peter Zijlstra
2026-07-03 9:25 ` Peter Zijlstra
2026-07-03 9:27 ` Thomas Gleixner
2026-07-03 9:27 ` Thomas Gleixner
2026-07-03 9:59 ` Sven Schnelle
2026-07-03 9:59 ` Sven Schnelle
2026-07-03 10:57 ` Peter Zijlstra
2026-07-03 10:57 ` Peter Zijlstra
2026-07-03 11:17 ` Sven Schnelle
2026-07-03 11:17 ` Sven Schnelle
2026-07-03 11:25 ` Michal Suchánek
2026-07-03 11:25 ` Michal Suchánek
2026-07-03 11:39 ` Sven Schnelle
2026-07-03 11:39 ` Sven Schnelle
2026-07-04 17:18 ` H. Peter Anvin
2026-07-04 17:18 ` H. Peter Anvin
2026-07-06 5:27 ` Sven Schnelle
2026-07-06 5:27 ` Sven Schnelle
2026-07-04 17:23 ` H. Peter Anvin
2026-07-04 17:23 ` H. Peter Anvin
2026-07-02 8:12 ` Sven Schnelle
2026-07-02 8:12 ` Sven Schnelle
2026-07-02 9:12 ` Michal Suchánek
2026-07-02 12:01 ` Sven Schnelle
2026-07-02 12:01 ` Sven Schnelle
2026-07-02 12:13 ` Michal Suchánek
2026-07-03 6:16 ` Sven Schnelle
2026-07-03 6:16 ` Sven Schnelle
2026-07-02 11:24 ` Thomas Gleixner
2026-07-02 11:24 ` Thomas Gleixner
2026-07-02 11:45 ` Michal Suchánek [this message]
2026-07-02 11:45 ` Michal Suchánek
2026-07-02 20:45 ` Thomas Gleixner
2026-07-02 20:45 ` Thomas Gleixner
2026-07-03 7:53 ` Michal Suchánek
2026-07-03 9:34 ` Thomas Gleixner
2026-07-03 9:34 ` Thomas Gleixner
2026-07-06 8:16 ` Thomas Gleixner
2026-07-06 8:16 ` Thomas Gleixner
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=akZPakNl6JT_jgGd@kunlun.suse.cz \
--to=msuchanek@suse.de \
--cc=agordeev@linux.ibm.com \
--cc=alex@ghiti.fr \
--cc=andrew+kernel@donnellan.id.au \
--cc=aou@eecs.berkeley.edu \
--cc=arnd@arndb.de \
--cc=borntraeger@linux.ibm.com \
--cc=bp@alien8.de \
--cc=chenhuacai@kernel.org \
--cc=chleroy@kernel.org \
--cc=corbet@lwn.net \
--cc=dave.hansen@linux.intel.com \
--cc=debug@rivosinc.com \
--cc=gor@linux.ibm.com \
--cc=gregkh@linuxfoundation.org \
--cc=hca@linux.ibm.com \
--cc=hpa@zytor.com \
--cc=jiaxun.yang@flygoat.com \
--cc=kees@kernel.org \
--cc=kernel@xen0n.name \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-riscv@lists.infradead.org \
--cc=linux-s390@vger.kernel.org \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=loongarch@lists.linux.dev \
--cc=lukas.gerlach@cispa.de \
--cc=luto@kernel.org \
--cc=maddy@linux.ibm.com \
--cc=mark.rutland@arm.com \
--cc=mingo@redhat.com \
--cc=mkchauras@linux.ibm.com \
--cc=mpe@ellerman.id.au \
--cc=namcao@linutronix.de \
--cc=npiggin@gmail.com \
--cc=palmer@dabbelt.com \
--cc=peterz@infradead.org \
--cc=pjw@kernel.org \
--cc=qirui.001@bytedance.com \
--cc=ryan.roberts@arm.com \
--cc=skhan@linuxfoundation.org \
--cc=sshegde@linux.ibm.com \
--cc=svens@linux.ibm.com \
--cc=tglx@kernel.org \
--cc=x86@kernel.org \
--cc=zong.li@sifive.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.