Re: [PATCH 1/2] powerpc/entry: convert to common and generic entry

From: Luming Yu
Date: Fri Sep 13 2024 - 08:05:15 EST


On Fri, Sep 13, 2024 at 10:30:56AM +0200, Christophe Leroy wrote:
>
>
> Le 13/09/2024 à 09:38, Luming Yu a écrit :
> > On Fri, Sep 13, 2024 at 08:54:12AM +0200, Christophe Leroy wrote:
> > >
> > >
> > > Le 13/09/2024 à 03:40, Luming Yu a écrit :
> > > > On Thu, Sep 12, 2024 at 12:23:29PM +0200, Christophe Leroy wrote:
> > > > >
> > > > >
> > > > > Le 12/09/2024 à 10:24, Luming Yu a écrit :
> > > > > > From: Yu Luming <luming.yu@xxxxxxxxx>
> > > > > >
> > > > > > convert powerpc entry code in syscall and fault to use syscall_work
> > > > > > and irqentry_state as well as common calls from generic entry infrastructure.
> > > > > >
> > > > > > Signed-off-by: Luming Yu <luming.yu@xxxxxxxxxxxx>
> > > > > > ---
> > > > > > arch/powerpc/Kconfig | 1 +
> > > > > > arch/powerpc/include/asm/hw_irq.h | 5 +++++
> > > > > > arch/powerpc/include/asm/processor.h | 6 ++++++
> > > > > > arch/powerpc/include/asm/syscall.h | 5 +++++
> > > > > > arch/powerpc/include/asm/thread_info.h | 1 +
> > > > > > arch/powerpc/kernel/syscall.c | 6 +++++-
> > > > > > arch/powerpc/mm/fault.c | 5 +++++
> > > > > > 7 files changed, 28 insertions(+), 1 deletion(-)
> > > > >
> > > > > There is another build problem:
> > > > >
> > > > > CC kernel/entry/common.o
> > > > > kernel/entry/common.c: In function 'irqentry_exit':
> > > > > kernel/entry/common.c:335:21: error: implicit declaration of function
> > > > > 'regs_irqs_disabled'; did you mean 'raw_irqs_disabled'?
> > > > > [-Werror=implicit-function-declaration]
> > > > > 335 | } else if (!regs_irqs_disabled(regs)) {
> > > > > | ^~~~~~~~~~~~~~~~~~
> > > > > | raw_irqs_disabled
> > > > >
> > > > >
> > > > > You have put regs_irqs_disabled() in a section dedicated to PPC64, so it
> > > > > fails on PPC32.
> > > > >
> > > > >
> > > > > After fixing this problem and providing an empty asm/entry-common.h it is
> > > > > now possible to build the kernel. But that's not enough, the board is stuck
> > > > > after:
> > > > >
> > > > > ...
> > > > > [ 2.871391] Freeing unused kernel image (initmem) memory: 1228K
> > > > > [ 2.877990] Run /init as init process
> > > >
> > > > Thanks for these questions. :-)
> > > > I haven't gotten chance to run it in ppc32 qemu.
> > > > the common syscall trace enter lost this hunk
> > > > - if (!is_32bit_task())
> > > > - audit_syscall_entry(regs->gpr[0], regs->gpr[3], regs->gpr[4],
> > > > - regs->gpr[5], regs->gpr[6]);
> > > > - else
> > > > - audit_syscall_entry(regs->gpr[0],
> > > > - regs->gpr[3] & 0xffffffff,
> > > > - regs->gpr[4] & 0xffffffff,
> > > > - regs->gpr[5] & 0xffffffff,
> > > > - regs->gpr[6] & 0xffffffff);
> > > > which I don't understand whether we need a arch callbacks for it.
> > >
> > > I don't thing so.
> > >
> > > As far as I can see, audit_syscall_entry() is called by
> > > syscall_enter_audit() in kernel/entry/common.c
> > >
> > > And the masking of arguments based on is_32bit_task() is done in
> > > syscall_get_arguments() with is called by
> > > syscall_enter_audit() just before calling audit_syscall_entry() and which is
> > > an arch callback that does the same as the removed hunk.
> > so, syscall_get_arguments is the ppc arch callback. thanks. :-)
> > > >
> > > > Before I sent out the RFC patch set, the very limited compile and boot test goes well with a ppc64 qemu VM. Surely, there will be a lot of test, debug and following up patch set update that is necessary to make it a complete convert.
> > >
> > > Even on ppc64 it doesn't build, at the first place because
> > > arch/powerpc/include/asm/entry-common.h is missing in your patch. Did you
> > > forget to 'git add' it ?
> > oh, I forget that I was testing this patch on top of the early user notifier patch:
> > https://eur01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Flinuxppc%2Fissues%2Fissues%2F477&data=05%7C02%7Cchristophe.leroy%40csgroup.eu%7C35a08ca9a81f4c6ff8ce08dcd3c73555%7C8b87af7d86474dc78df45f69a2011bb5%7C0%7C0%7C638618099770810941%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C0%7C%7C%7C&sdata=yCQWLIAXL%2BNHnzrh0e91WIBvF0c5WfF6pY6ZMHstocA%3D&reserved=0, https://eur01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fpatchwork.ozlabs.org%2Fproject%2Flinuxppc-dev%2Fpatch%2F1FD36D52828D2506%2B20231218031309.2063-1-luming.yu%40shingroup.cn%2F&data=05%7C02%7Cchristophe.leroy%40csgroup.eu%7C35a08ca9a81f4c6ff8ce08dcd3c73555%7C8b87af7d86474dc78df45f69a2011bb5%7C0%7C0%7C638618099770819779%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C0%7C%7C%7C&sdata=0WBSUlpAbL6EMdPEAtJv1HUHkbeUjjUcP98wYf9IxM4%3D&reserved=0
> > and the entry-common.h is as follows:
> > [root@localhost linux]# cat arch/powerpc/include/asm/entry-common.h
> > /* SPDX-License-Identifier: GPL-2.0 */
> > #ifndef ARCH_POWERPC_ENTRY_COMMON_H
> > #define ARCH_POWERPC_ENTRY_COMMON_H
> >
> > #include <linux/user-return-notifier.h>
> >
> > static inline void arch_exit_to_user_mode_prepare(struct pt_regs *regs,
> > unsigned long ti_work)
> > {
> > if (ti_work & _TIF_USER_RETURN_NOTIFY)
> > fire_user_return_notifiers();
> > }
> >
> > #define arch_exit_to_user_mode_prepare arch_exit_to_user_mode_prepare
> >
> > #endif
> >
> > As you could see , it looks irrelevant.
> > >
> > > And same as with PPC32, when I build PPC64 with an empty asm/entry-common.h,
> > > it doesn't work. So, I guess you had some needed code in that file and you
> > > have to send it.
> >
> > please send me your kernel config and let me reproduce and double check
> > if there could be another bit of code make the difference. My test p8 64bit VM boots
> > an unmodified fedora 38 user space just fine with the patch.
> > After boot, the only difference is make install of kernel could hang for a while, that
> > I'm not sure how that could happen yet. and I plan to do some unit test for many common
> > features like : lockdep, ptrace, rcu, audit...
> > >
> >
>
>
> I tested with both ppc64_defconfig and ppc64le_defconfig. With those two
> configs QEMU remains stuck after the following lines. I use QEMU with
> machine pseries:
>
> [ 2.701874][ T1] Running code patching self-tests ...
> [ 2.734007][ T1] registered taskstats version 1
> [ 2.735891][ T1] Loading compiled-in X.509 certificates
> [ 2.756472][ T1] Loaded X.509 cert 'Build time autogenerated kernel
> key: 003f25410c2285abf44b4685b6d63682a2dc9f11'
> [ 2.784474][ T1] Demotion targets for Node 0: null
> [ 2.784748][ T1] page_owner is disabled
> [ 2.786795][ T1] Secure boot mode disabled
> [ 2.787436][ T1] ima: No TPM chip found, activating TPM-bypass!
> [ 2.787568][ T1] Loading compiled-in module X.509 certificates
> [ 2.790854][ T1] Loaded X.509 cert 'Build time autogenerated kernel
> key: 003f25410c2285abf44b4685b6d63682a2dc9f11'
> [ 2.791289][ T1] ima: Allocated hash algorithm: sha256
> [ 2.796260][ T1] Secure boot mode disabled
> [ 2.796448][ T1] Trusted boot mode disabled
> [ 2.796560][ T1] ima: No architecture policies found
> [ 2.799580][ T1] printk: legacy console [netcon0] enabled
> [ 2.799696][ T1] netconsole: network logging started
> [ 2.880282][ T1] Freeing unused kernel image (initmem) memory: 6528K
> [ 2.884618][ T1] Checked W+X mappings: passed, no W+X pages found
> [ 2.885366][ T1] rodata_test: all tests were successful
> [ 2.885749][ T1] Run /init as init process
> [ 3.214730][ T58] mount (58) used greatest stack depth: 28672 bytes
> left
> ...
> nothing happens after that.
reproduced with ppc64_defconfig
[ 0.818972][ T1] Run /init as init process
[ 5.851684][ T240] request_module: modprobe binfmt-4c46 cannot be processed, kmod busy with 50 threads for more than 5 seconds now
[ 5.851742][ T240] kworker/u33:18 (240) used greatest stack depth: 13584 bytes left
[ 5.860081][ T232] kworker/u33:16 (232) used greatest stack depth: 13072 bytes left
[ 5.863145][ T210] kworker/u35:13 (210) used greatest stack depth: 12928 bytes left
[ 5.865000][ T1] Failed to execute /init (error -8)
[ 5.868897][ T1] Run /sbin/init as init process
[ 10.891673][ T315] request_module: modprobe binfmt-4c46 cannot be processed, kmod busy with 50 threads for more than 5 seconds now
[ 10.894036][ T1] Starting init: /sbin/init exists but couldn't execute it (error -8)
[ 10.901455][ T1] Run /etc/init as init process
[ 10.903154][ T1] Run /bin/init as init process
[ 10.904747][ T1] Run /bin/sh as init process
[ 15.931679][ T367] request_module: modprobe binfmt-4c46 cannot be processed, kmod busy with 50 threads for more than 5 seconds now
[ 15.934689][ T1] Starting init: /bin/sh exists but couldn't execute it (error -8)
[ 15.940766][ T1] Kernel panic - not syncing: No working init found. Try passing init= option to kernel. See Linux Documentation/admin-guide/init.rst for guidance.
[ 15.946981][ T1] CPU: 13 PID: 1 Comm: swapper/0 Not tainted 6.7.0-rc1 #24
[ 15.950050][ T1] Hardware name: IBM pSeries (emulated by qemu) POWER8 (raw) 0x4d0200 0xf000004 of:SLOF,git-3a259d hv:linux,kvm pSeries
[ 15.955633][ T1] Call Trace:
[ 15.956714][ T1] [c0000000080fbd20] [c0000000011811e8] dump_stack_lvl+0x6c/0x9c (unreliable)
[ 15.959302][ T1] [c0000000080fbd50] [c00000000016b654] panic+0x178/0x424
[ 15.961929][ T1] [c0000000080fbdf0] [c00000000001048c] kernel_init+0x19c/0x1a0
[ 15.965310][ T1] [c0000000080fbe50] [c00000000000d394] ret_from_kernel_user_thread+0x14/0x1c
[ 15.968494][ T1] --- interrupt: 0 at 0x0
[ 15.989760][ T1] pstore: backend (nvram) writing error (-1)
qemu-system-ppc64: OS terminated: `
[root@localhost home]#
It would take some time to debug out from the issue. Stay tuned.
Thanks very much!
>
>
> For PPC32 I use pmac32_defconfig and QEMU machine mac99
>
> Christophe
>