Re: [PATCH 2/2] ipc: fix sparc64 ipc() wrapper
On Thu, Sep 5, 2019 at 5:24 PM Arnd Bergmann wrote: > diff --git a/arch/sparc/kernel/sys_sparc_64.c > b/arch/sparc/kernel/sys_sparc_64.c > index ccc88926bc00..5ad0494df367 100644 > --- a/arch/sparc/kernel/sys_sparc_64.c > +++ b/arch/sparc/kernel/sys_sparc_64.c > @@ -340,21 +340,21 @@ SYSCALL_DEFINE6(sparc_ipc, unsigned int, call, int, > first, unsigned long, second > if (call <= SEMTIMEDOP) { > switch (call) { > case SEMOP: > - err = sys_semtimedop(first, ptr, > -(unsigned int)second, NULL); > + err = ksys_semtimedop(first, ptr, > + (unsigned int)second, NULL); > goto out; The zero-day bot found a link error in sparc64 allnoconfig: arch/sparc/kernel/sys_sparc_64.o: In function `__se_sys_sparc_ipc': >> sys_sparc_64.c:(.text+0x724): undefined reference to `ksys_semtimedop' >> sys_sparc_64.c:(.text+0x76c): undefined reference to `ksys_old_msgctl' >> sys_sparc_64.c:(.text+0x7a8): undefined reference to `ksys_semget' >> sys_sparc_64.c:(.text+0x7c8): undefined reference to `ksys_old_semctl' >> sys_sparc_64.c:(.text+0x7e4): undefined reference to `ksys_msgsnd' >> sys_sparc_64.c:(.text+0x7fc): undefined reference to `ksys_shmget' >> sys_sparc_64.c:(.text+0x808): undefined reference to `ksys_shmdt' sys_sparc_64.c:(.text+0x828): undefined reference to `ksys_semtimedop' >> sys_sparc_64.c:(.text+0x844): undefined reference to `ksys_old_shmctl' >> sys_sparc_64.c:(.text+0x858): undefined reference to `ksys_msgget' >> sys_sparc_64.c:(.text+0x86c): undefined reference to `ksys_msgrcv' I've added this hunk to my patch and plan to send both fixes to Linus in the next few days, after I get a positive report from the bot as well: --- a/arch/sparc/kernel/sys_sparc_64.c +++ b/arch/sparc/kernel/sys_sparc_64.c @@ -336,6 +336,9 @@ SYSCALL_DEFINE6(sparc_ipc, unsigned int, call, int, first, unsigned long, second { long err; + if (!IS_ENABLED(CONFIG_SYSVIPC)) + return -ENOSYS; + /* No need for backward compatibility. We can start fresh... */ if (call <= SEMTIMEDOP) { switch (call) {
Re: [PATCH 2/2] ipc: fix sparc64 ipc() wrapper
On Thu, Sep 5, 2019 at 9:39 PM Arnd Bergmann wrote: > > Matt bisected a sparc64 specific issue with semctl, shmctl and msgctl > to a commit from my y2038 series in linux-5.1, as I missed the custom > sys_ipc() wrapper that sparc64 uses in place of the generic version that > I patched. > > The problem is that the sys_{sem,shm,msg}ctl() functions in the kernel > now do not allow being called with the IPC_64 flag any more, resulting > in a -EINVAL error when they don't recognize the command. > > Instead, the correct way to do this now is to call the internal > ksys_old_{sem,shm,msg}ctl() functions to select the API version. > > As we generally move towards these functions anyway, change all of > sparc_ipc() to consistently use those in place of the sys_*() versions, > and move the required ksys_*() declarations into linux/syscalls.h > > Reported-by: Matt Turner > Fixes: 275f22148e87 ("ipc: rename old-style shmctl/semctl/msgctl syscalls") > Cc: sta...@vger.kernel.org > Signed-off-by: Arnd Bergmann Not Matt, but this patch fixes util-linux.git ipcs test-suite (make check) regression for me on current sparc64 git kernel (5.3.0-rc7), which was broken somewhere in between 4.19 (debian unstable kernel) and 5.3-rcX. Thanks! PS: wanted to bisect kernel, but Matt did it first.
Re: [PATCH 2/2] ipc: fix sparc64 ipc() wrapper
On Thu, Sep 5, 2019 at 8:23 AM Arnd Bergmann wrote: > > Matt bisected a sparc64 specific issue with semctl, shmctl and msgctl > to a commit from my y2038 series in linux-5.1, as I missed the custom > sys_ipc() wrapper that sparc64 uses in place of the generic version that > I patched. > > The problem is that the sys_{sem,shm,msg}ctl() functions in the kernel > now do not allow being called with the IPC_64 flag any more, resulting > in a -EINVAL error when they don't recognize the command. > > Instead, the correct way to do this now is to call the internal > ksys_old_{sem,shm,msg}ctl() functions to select the API version. > > As we generally move towards these functions anyway, change all of > sparc_ipc() to consistently use those in place of the sys_*() versions, > and move the required ksys_*() declarations into linux/syscalls.h > > Reported-by: Matt Turner > Fixes: 275f22148e87 ("ipc: rename old-style shmctl/semctl/msgctl syscalls") > Cc: sta...@vger.kernel.org > Signed-off-by: Arnd Bergmann > --- > Hi Matt, > > Can you check that this solves your problem? Works great. Thank you Arnd! Tested-by: Matt Turner
[PATCH 2/2] ipc: fix sparc64 ipc() wrapper
Matt bisected a sparc64 specific issue with semctl, shmctl and msgctl to a commit from my y2038 series in linux-5.1, as I missed the custom sys_ipc() wrapper that sparc64 uses in place of the generic version that I patched. The problem is that the sys_{sem,shm,msg}ctl() functions in the kernel now do not allow being called with the IPC_64 flag any more, resulting in a -EINVAL error when they don't recognize the command. Instead, the correct way to do this now is to call the internal ksys_old_{sem,shm,msg}ctl() functions to select the API version. As we generally move towards these functions anyway, change all of sparc_ipc() to consistently use those in place of the sys_*() versions, and move the required ksys_*() declarations into linux/syscalls.h Reported-by: Matt Turner Fixes: 275f22148e87 ("ipc: rename old-style shmctl/semctl/msgctl syscalls") Cc: sta...@vger.kernel.org Signed-off-by: Arnd Bergmann --- Hi Matt, Can you check that this solves your problem? --- arch/sparc/kernel/sys_sparc_64.c | 30 +++--- include/linux/syscalls.h | 19 +++ ipc/util.h | 25 ++--- 3 files changed, 36 insertions(+), 38 deletions(-) diff --git a/arch/sparc/kernel/sys_sparc_64.c b/arch/sparc/kernel/sys_sparc_64.c index ccc88926bc00..5ad0494df367 100644 --- a/arch/sparc/kernel/sys_sparc_64.c +++ b/arch/sparc/kernel/sys_sparc_64.c @@ -340,21 +340,21 @@ SYSCALL_DEFINE6(sparc_ipc, unsigned int, call, int, first, unsigned long, second if (call <= SEMTIMEDOP) { switch (call) { case SEMOP: - err = sys_semtimedop(first, ptr, -(unsigned int)second, NULL); + err = ksys_semtimedop(first, ptr, + (unsigned int)second, NULL); goto out; case SEMTIMEDOP: - err = sys_semtimedop(first, ptr, (unsigned int)second, + err = ksys_semtimedop(first, ptr, (unsigned int)second, (const struct __kernel_timespec __user *) -(unsigned long) fifth); + (unsigned long) fifth); goto out; case SEMGET: - err = sys_semget(first, (int)second, (int)third); + err = ksys_semget(first, (int)second, (int)third); goto out; case SEMCTL: { - err = sys_semctl(first, second, -(int)third | IPC_64, -(unsigned long) ptr); + err = ksys_old_semctl(first, second, + (int)third | IPC_64, + (unsigned long) ptr); goto out; } default: @@ -365,18 +365,18 @@ SYSCALL_DEFINE6(sparc_ipc, unsigned int, call, int, first, unsigned long, second if (call <= MSGCTL) { switch (call) { case MSGSND: - err = sys_msgsnd(first, ptr, (size_t)second, + err = ksys_msgsnd(first, ptr, (size_t)second, (int)third); goto out; case MSGRCV: - err = sys_msgrcv(first, ptr, (size_t)second, fifth, + err = ksys_msgrcv(first, ptr, (size_t)second, fifth, (int)third); goto out; case MSGGET: - err = sys_msgget((key_t)first, (int)second); + err = ksys_msgget((key_t)first, (int)second); goto out; case MSGCTL: - err = sys_msgctl(first, (int)second | IPC_64, ptr); + err = ksys_old_msgctl(first, (int)second | IPC_64, ptr); goto out; default: err = -ENOSYS; @@ -396,13 +396,13 @@ SYSCALL_DEFINE6(sparc_ipc, unsigned int, call, int, first, unsigned long, second goto out; } case SHMDT: - err = sys_shmdt(ptr); + err = ksys_shmdt(ptr); goto out; case SHMGET: - err = sys_shmget(first, (size_t)second, (int)third); + err = ksys_shmget(first, (size_t)second, (int)third); goto out; case SHMCTL: - err = sys_shmctl(first, (int)second | IPC_64, ptr); + err = ksys_old_shmctl(first, (int)second | IPC_64, ptr); goto out;