Message ID | 20180328152714.6103-1-shea@shealevy.com |
---|---|
State | New |
Headers | show |
Series | Extract initrd free logic from arch-specific code. | expand |
On 03/28/2018 10:26 AM, Shea Levy wrote: > Now only those architectures that have custom initrd free requirements > need to define free_initrd_mem. ... > --- a/arch/arc/mm/init.c > +++ b/arch/arc/mm/init.c > @@ -229,10 +229,3 @@ void __ref free_initmem(void) > { > free_initmem_default(-1); > } > - > -#ifdef CONFIG_BLK_DEV_INITRD > -void __init free_initrd_mem(unsigned long start, unsigned long end) > -{ > - free_reserved_area((void *)start, (void *)end, -1, "initrd"); > -} > -#endif > diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig > index 3f972e83909b..19d1c5594e2d 100644 > --- a/arch/arm/Kconfig > +++ b/arch/arm/Kconfig > @@ -47,6 +47,7 @@ config ARM > select HARDIRQS_SW_RESEND > select HAVE_ARCH_AUDITSYSCALL if (AEABI && !OABI_COMPAT) > select HAVE_ARCH_BITREVERSE if (CPU_32v7M || CPU_32v7) && !CPU_32v6 > + select HAVE_ARCH_FREE_INITRD_MEM > select HAVE_ARCH_JUMP_LABEL if !XIP_KERNEL && !CPU_ENDIAN_BE32 && MMU > select HAVE_ARCH_KGDB if !CPU_ENDIAN_BE32 && MMU > select HAVE_ARCH_MMAP_RND_BITS if MMU Isn't this why weak symbols were invented? Confused, Rob
Hi Rob, Rob Landley <rob@landley.net> writes: > On 03/28/2018 10:26 AM, Shea Levy wrote: >> Now only those architectures that have custom initrd free requirements >> need to define free_initrd_mem. > ... >> --- a/arch/arc/mm/init.c >> +++ b/arch/arc/mm/init.c >> @@ -229,10 +229,3 @@ void __ref free_initmem(void) >> { >> free_initmem_default(-1); >> } >> - >> -#ifdef CONFIG_BLK_DEV_INITRD >> -void __init free_initrd_mem(unsigned long start, unsigned long end) >> -{ >> - free_reserved_area((void *)start, (void *)end, -1, "initrd"); >> -} >> -#endif >> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig >> index 3f972e83909b..19d1c5594e2d 100644 >> --- a/arch/arm/Kconfig >> +++ b/arch/arm/Kconfig >> @@ -47,6 +47,7 @@ config ARM >> select HARDIRQS_SW_RESEND >> select HAVE_ARCH_AUDITSYSCALL if (AEABI && !OABI_COMPAT) >> select HAVE_ARCH_BITREVERSE if (CPU_32v7M || CPU_32v7) && !CPU_32v6 >> + select HAVE_ARCH_FREE_INITRD_MEM >> select HAVE_ARCH_JUMP_LABEL if !XIP_KERNEL && !CPU_ENDIAN_BE32 && MMU >> select HAVE_ARCH_KGDB if !CPU_ENDIAN_BE32 && MMU >> select HAVE_ARCH_MMAP_RND_BITS if MMU > > Isn't this why weak symbols were invented? > This approach was suggested by Christoph Hellwig upthread, and seems to have some precedent elsewhere (e.g. strncasecmp), but I agree weak symbols seem appropriate here. I'm happy to implement either approach! > > Confused, > > Rob Thanks, Shea
On Wed, Mar 28, 2018 at 10:58:51AM -0500, Rob Landley wrote: > On 03/28/2018 10:26 AM, Shea Levy wrote: > > Now only those architectures that have custom initrd free requirements > > need to define free_initrd_mem. > ... > > --- a/arch/arc/mm/init.c > > +++ b/arch/arc/mm/init.c > > @@ -229,10 +229,3 @@ void __ref free_initmem(void) > > { > > free_initmem_default(-1); > > } > > - > > -#ifdef CONFIG_BLK_DEV_INITRD > > -void __init free_initrd_mem(unsigned long start, unsigned long end) > > -{ > > - free_reserved_area((void *)start, (void *)end, -1, "initrd"); > > -} > > -#endif > > diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig > > index 3f972e83909b..19d1c5594e2d 100644 > > --- a/arch/arm/Kconfig > > +++ b/arch/arm/Kconfig > > @@ -47,6 +47,7 @@ config ARM > > select HARDIRQS_SW_RESEND > > select HAVE_ARCH_AUDITSYSCALL if (AEABI && !OABI_COMPAT) > > select HAVE_ARCH_BITREVERSE if (CPU_32v7M || CPU_32v7) && !CPU_32v6 > > + select HAVE_ARCH_FREE_INITRD_MEM > > select HAVE_ARCH_JUMP_LABEL if !XIP_KERNEL && !CPU_ENDIAN_BE32 && MMU > > select HAVE_ARCH_KGDB if !CPU_ENDIAN_BE32 && MMU > > select HAVE_ARCH_MMAP_RND_BITS if MMU > > Isn't this why weak symbols were invented? Weak symbols means that we end up with both the weakly-referenced code and the arch code in the kernel image. That's fine if the weak code is small.
On Wed, Mar 28, 2018 at 8:26 AM, Shea Levy <shea@shealevy.com> wrote: > Now only those architectures that have custom initrd free requirements > need to define free_initrd_mem. > > Signed-off-by: Shea Levy <shea@shealevy.com> Yay consolidation! :) > --- a/usr/Kconfig > +++ b/usr/Kconfig > @@ -233,3 +233,7 @@ config INITRAMFS_COMPRESSION > default ".lzma" if RD_LZMA > default ".bz2" if RD_BZIP2 > default "" > + > +config HAVE_ARCH_FREE_INITRD_MEM > + bool > + default n If you keep the Kconfig, you can leave off "default n", and I'd suggest adding a help section just to describe what the per-arch responsibilities are when select-ing the config. (See HAVE_ARCH_SECCOMP_FILTER for an example.) -Kees
On 03/28/2018 11:48 AM, Russell King - ARM Linux wrote: > On Wed, Mar 28, 2018 at 10:58:51AM -0500, Rob Landley wrote: >> On 03/28/2018 10:26 AM, Shea Levy wrote: >>> Now only those architectures that have custom initrd free requirements >>> need to define free_initrd_mem. >> ... >>> --- a/arch/arc/mm/init.c >>> +++ b/arch/arc/mm/init.c >>> @@ -229,10 +229,3 @@ void __ref free_initmem(void) >>> { >>> free_initmem_default(-1); >>> } >>> - >>> -#ifdef CONFIG_BLK_DEV_INITRD >>> -void __init free_initrd_mem(unsigned long start, unsigned long end) >>> -{ >>> - free_reserved_area((void *)start, (void *)end, -1, "initrd"); >>> -} >>> -#endif >>> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig >>> index 3f972e83909b..19d1c5594e2d 100644 >>> --- a/arch/arm/Kconfig >>> +++ b/arch/arm/Kconfig >>> @@ -47,6 +47,7 @@ config ARM >>> select HARDIRQS_SW_RESEND >>> select HAVE_ARCH_AUDITSYSCALL if (AEABI && !OABI_COMPAT) >>> select HAVE_ARCH_BITREVERSE if (CPU_32v7M || CPU_32v7) && !CPU_32v6 >>> + select HAVE_ARCH_FREE_INITRD_MEM >>> select HAVE_ARCH_JUMP_LABEL if !XIP_KERNEL && !CPU_ENDIAN_BE32 && MMU >>> select HAVE_ARCH_KGDB if !CPU_ENDIAN_BE32 && MMU >>> select HAVE_ARCH_MMAP_RND_BITS if MMU >> >> Isn't this why weak symbols were invented? > > Weak symbols means that we end up with both the weakly-referenced code > and the arch code in the kernel image. That's fine if the weak code > is small. The kernel's been able to build with link time garbage collection since 2016: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=b67067f1176d Wouldn't that remove the unused one? Rob
On Wed, Mar 28, 2018 at 02:04:22PM -0500, Rob Landley wrote: > > > On 03/28/2018 11:48 AM, Russell King - ARM Linux wrote: > > On Wed, Mar 28, 2018 at 10:58:51AM -0500, Rob Landley wrote: > >> On 03/28/2018 10:26 AM, Shea Levy wrote: > >>> Now only those architectures that have custom initrd free requirements > >>> need to define free_initrd_mem. > >> ... > >>> --- a/arch/arc/mm/init.c > >>> +++ b/arch/arc/mm/init.c > >>> @@ -229,10 +229,3 @@ void __ref free_initmem(void) > >>> { > >>> free_initmem_default(-1); > >>> } > >>> - > >>> -#ifdef CONFIG_BLK_DEV_INITRD > >>> -void __init free_initrd_mem(unsigned long start, unsigned long end) > >>> -{ > >>> - free_reserved_area((void *)start, (void *)end, -1, "initrd"); > >>> -} > >>> -#endif > >>> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig > >>> index 3f972e83909b..19d1c5594e2d 100644 > >>> --- a/arch/arm/Kconfig > >>> +++ b/arch/arm/Kconfig > >>> @@ -47,6 +47,7 @@ config ARM > >>> select HARDIRQS_SW_RESEND > >>> select HAVE_ARCH_AUDITSYSCALL if (AEABI && !OABI_COMPAT) > >>> select HAVE_ARCH_BITREVERSE if (CPU_32v7M || CPU_32v7) && !CPU_32v6 > >>> + select HAVE_ARCH_FREE_INITRD_MEM > >>> select HAVE_ARCH_JUMP_LABEL if !XIP_KERNEL && !CPU_ENDIAN_BE32 && MMU > >>> select HAVE_ARCH_KGDB if !CPU_ENDIAN_BE32 && MMU > >>> select HAVE_ARCH_MMAP_RND_BITS if MMU > >> > >> Isn't this why weak symbols were invented? > > > > Weak symbols means that we end up with both the weakly-referenced code > > and the arch code in the kernel image. That's fine if the weak code > > is small. > > The kernel's been able to build with link time garbage collection since 2016: > > https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=b67067f1176d > > Wouldn't that remove the unused one? Probably, if anyone bothered to use that, which they don't. LD_DEAD_CODE_DATA_ELIMINATION is a symbol without a prompt, and from what I can see, nothing selects it. Therefore, the symbol is always disabled, and so the feature never gets used in mainline kernels. Brings up the obvious question - why is it there if it's completely unused? (Maybe to cause confusion, and allowing a justification for __weak ?)
On Thu, Mar 29, 2018 at 9:14 AM, Russell King - ARM Linux <linux@armlinux.org.uk> wrote: > On Wed, Mar 28, 2018 at 02:04:22PM -0500, Rob Landley wrote: >> >> >> On 03/28/2018 11:48 AM, Russell King - ARM Linux wrote: >> > On Wed, Mar 28, 2018 at 10:58:51AM -0500, Rob Landley wrote: >> >> On 03/28/2018 10:26 AM, Shea Levy wrote: >> >>> Now only those architectures that have custom initrd free requirements >> >>> need to define free_initrd_mem. >> >> ... >> >>> --- a/arch/arc/mm/init.c >> >>> +++ b/arch/arc/mm/init.c >> >>> @@ -229,10 +229,3 @@ void __ref free_initmem(void) >> >>> { >> >>> free_initmem_default(-1); >> >>> } >> >>> - >> >>> -#ifdef CONFIG_BLK_DEV_INITRD >> >>> -void __init free_initrd_mem(unsigned long start, unsigned long end) >> >>> -{ >> >>> - free_reserved_area((void *)start, (void *)end, -1, "initrd"); >> >>> -} >> >>> -#endif >> >>> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig >> >>> index 3f972e83909b..19d1c5594e2d 100644 >> >>> --- a/arch/arm/Kconfig >> >>> +++ b/arch/arm/Kconfig >> >>> @@ -47,6 +47,7 @@ config ARM >> >>> select HARDIRQS_SW_RESEND >> >>> select HAVE_ARCH_AUDITSYSCALL if (AEABI && !OABI_COMPAT) >> >>> select HAVE_ARCH_BITREVERSE if (CPU_32v7M || CPU_32v7) && !CPU_32v6 >> >>> + select HAVE_ARCH_FREE_INITRD_MEM >> >>> select HAVE_ARCH_JUMP_LABEL if !XIP_KERNEL && !CPU_ENDIAN_BE32 && MMU >> >>> select HAVE_ARCH_KGDB if !CPU_ENDIAN_BE32 && MMU >> >>> select HAVE_ARCH_MMAP_RND_BITS if MMU >> >> >> >> Isn't this why weak symbols were invented? >> > >> > Weak symbols means that we end up with both the weakly-referenced code >> > and the arch code in the kernel image. That's fine if the weak code >> > is small. >> >> The kernel's been able to build with link time garbage collection since 2016: >> >> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=b67067f1176d >> >> Wouldn't that remove the unused one? > > Probably, if anyone bothered to use that, which they don't. > > LD_DEAD_CODE_DATA_ELIMINATION is a symbol without a prompt, and from > what I can see, nothing selects it. Therefore, the symbol is always > disabled, and so the feature never gets used in mainline kernels. > > Brings up the obvious question - why is it there if it's completely > unused? (Maybe to cause confusion, and allowing a justification > for __weak ?) IIRC Nick had some patches to do the arch enablement for powerpc, but I'm not sure what happened to them though. I suspect it just fell down Nick's ever growing TODO list.
On Thu, 29 Mar 2018 09:37:52 +1100 Oliver <oohall@gmail.com> wrote: > On Thu, Mar 29, 2018 at 9:14 AM, Russell King - ARM Linux > <linux@armlinux.org.uk> wrote: > > On Wed, Mar 28, 2018 at 02:04:22PM -0500, Rob Landley wrote: > >> > >> > >> On 03/28/2018 11:48 AM, Russell King - ARM Linux wrote: > >> > On Wed, Mar 28, 2018 at 10:58:51AM -0500, Rob Landley wrote: > >> >> On 03/28/2018 10:26 AM, Shea Levy wrote: > >> >>> Now only those architectures that have custom initrd free requirements > >> >>> need to define free_initrd_mem. > >> >> ... > >> >>> --- a/arch/arc/mm/init.c > >> >>> +++ b/arch/arc/mm/init.c > >> >>> @@ -229,10 +229,3 @@ void __ref free_initmem(void) > >> >>> { > >> >>> free_initmem_default(-1); > >> >>> } > >> >>> - > >> >>> -#ifdef CONFIG_BLK_DEV_INITRD > >> >>> -void __init free_initrd_mem(unsigned long start, unsigned long end) > >> >>> -{ > >> >>> - free_reserved_area((void *)start, (void *)end, -1, "initrd"); > >> >>> -} > >> >>> -#endif > >> >>> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig > >> >>> index 3f972e83909b..19d1c5594e2d 100644 > >> >>> --- a/arch/arm/Kconfig > >> >>> +++ b/arch/arm/Kconfig > >> >>> @@ -47,6 +47,7 @@ config ARM > >> >>> select HARDIRQS_SW_RESEND > >> >>> select HAVE_ARCH_AUDITSYSCALL if (AEABI && !OABI_COMPAT) > >> >>> select HAVE_ARCH_BITREVERSE if (CPU_32v7M || CPU_32v7) && !CPU_32v6 > >> >>> + select HAVE_ARCH_FREE_INITRD_MEM > >> >>> select HAVE_ARCH_JUMP_LABEL if !XIP_KERNEL && !CPU_ENDIAN_BE32 && MMU > >> >>> select HAVE_ARCH_KGDB if !CPU_ENDIAN_BE32 && MMU > >> >>> select HAVE_ARCH_MMAP_RND_BITS if MMU > >> >> > >> >> Isn't this why weak symbols were invented? > >> > > >> > Weak symbols means that we end up with both the weakly-referenced code > >> > and the arch code in the kernel image. That's fine if the weak code > >> > is small. > >> > >> The kernel's been able to build with link time garbage collection since 2016: > >> > >> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=b67067f1176d > >> > >> Wouldn't that remove the unused one? > > > > Probably, if anyone bothered to use that, which they don't. > > > > LD_DEAD_CODE_DATA_ELIMINATION is a symbol without a prompt, and from > > what I can see, nothing selects it. Therefore, the symbol is always > > disabled, and so the feature never gets used in mainline kernels. > > > > Brings up the obvious question - why is it there if it's completely > > unused? (Maybe to cause confusion, and allowing a justification > > for __weak ?) Well weak symbols have been used long before it was added. > IIRC Nick had some patches to do the arch enablement for powerpc, but > I'm not sure what happened to them though. I suspect it just fell down > Nick's ever growing TODO list. Yeah I had started some patches for powerpc and x86 that have ended up on the back burner. There's been some MIPS people playing with it too. For the kernel, LD_DEAD_CODE_DATA_ELIMINATION is not great. It can save a little, but you get issues like any exception table entry or bug table entry in a function will create a reference back to the function, so the linker can't trim it away even if nothing else references it. I'll try to take another look at it within the next few months and remove it if I can't make progress. Nicolas Pitre has been doing some much better work on dead code using real LTO. Thanks, Nick
On Wed, Mar 28, 2018 at 09:55:07AM -0700, Kees Cook wrote: >On Wed, Mar 28, 2018 at 8:26 AM, Shea Levy <shea@shealevy.com> wrote: >> Now only those architectures that have custom initrd free requirements >> need to define free_initrd_mem. >> >> Signed-off-by: Shea Levy <shea@shealevy.com> > >Yay consolidation! :) > >> --- a/usr/Kconfig >> +++ b/usr/Kconfig >> @@ -233,3 +233,7 @@ config INITRAMFS_COMPRESSION >> default ".lzma" if RD_LZMA >> default ".bz2" if RD_BZIP2 >> default "" >> + >> +config HAVE_ARCH_FREE_INITRD_MEM >> + bool >> + default n > >If you keep the Kconfig, you can leave off "default n", and I'd >suggest adding a help section just to describe what the per-arch >responsibilities are when select-ing the config. (See >HAVE_ARCH_SECCOMP_FILTER for an example.) > One question about this change. The original code would "select" HAVE_ARCH_FREE_INITRD_MEM on those arch. After this change, we need to manually "select" this? >-Kees > >-- >Kees Cook >Pixel Security
On Thu, Mar 29, 2018 at 09:37:52AM +1100, Oliver wrote: > On Thu, Mar 29, 2018 at 9:14 AM, Russell King - ARM Linux > <linux@armlinux.org.uk> wrote: > > On Wed, Mar 28, 2018 at 02:04:22PM -0500, Rob Landley wrote: > >> > >> > >> On 03/28/2018 11:48 AM, Russell King - ARM Linux wrote: > >> > On Wed, Mar 28, 2018 at 10:58:51AM -0500, Rob Landley wrote: > >> >> On 03/28/2018 10:26 AM, Shea Levy wrote: > >> >>> Now only those architectures that have custom initrd free requirements > >> >>> need to define free_initrd_mem. > >> >> ... > >> >>> --- a/arch/arc/mm/init.c > >> >>> +++ b/arch/arc/mm/init.c > >> >>> @@ -229,10 +229,3 @@ void __ref free_initmem(void) > >> >>> { > >> >>> free_initmem_default(-1); > >> >>> } > >> >>> - > >> >>> -#ifdef CONFIG_BLK_DEV_INITRD > >> >>> -void __init free_initrd_mem(unsigned long start, unsigned long end) > >> >>> -{ > >> >>> - free_reserved_area((void *)start, (void *)end, -1, "initrd"); > >> >>> -} > >> >>> -#endif > >> >>> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig > >> >>> index 3f972e83909b..19d1c5594e2d 100644 > >> >>> --- a/arch/arm/Kconfig > >> >>> +++ b/arch/arm/Kconfig > >> >>> @@ -47,6 +47,7 @@ config ARM > >> >>> select HARDIRQS_SW_RESEND > >> >>> select HAVE_ARCH_AUDITSYSCALL if (AEABI && !OABI_COMPAT) > >> >>> select HAVE_ARCH_BITREVERSE if (CPU_32v7M || CPU_32v7) && !CPU_32v6 > >> >>> + select HAVE_ARCH_FREE_INITRD_MEM > >> >>> select HAVE_ARCH_JUMP_LABEL if !XIP_KERNEL && !CPU_ENDIAN_BE32 && MMU > >> >>> select HAVE_ARCH_KGDB if !CPU_ENDIAN_BE32 && MMU > >> >>> select HAVE_ARCH_MMAP_RND_BITS if MMU > >> >> > >> >> Isn't this why weak symbols were invented? > >> > > >> > Weak symbols means that we end up with both the weakly-referenced code > >> > and the arch code in the kernel image. That's fine if the weak code > >> > is small. > >> > >> The kernel's been able to build with link time garbage collection since 2016: > >> > >> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=b67067f1176d > >> > >> Wouldn't that remove the unused one? > > > > Probably, if anyone bothered to use that, which they don't. > > > > LD_DEAD_CODE_DATA_ELIMINATION is a symbol without a prompt, and from > > what I can see, nothing selects it. Therefore, the symbol is always > > disabled, and so the feature never gets used in mainline kernels. > > > > Brings up the obvious question - why is it there if it's completely > > unused? (Maybe to cause confusion, and allowing a justification > > for __weak ?) > > IIRC Nick had some patches to do the arch enablement for powerpc, but > I'm not sure what happened to them though. I suspect it just fell down > Nick's ever growing TODO list. I've given it a go on ARM, marking every linker-built table with KEEP() and comparing the System.map files. The resulting kernel is around 150k smaller, which seems good. However, it doesn't boot - and I don't know why. Booting the kernel under kvmtool in a VM using virtio-console, I can find no way to get any kernel messages out of it. Using lkvm debug, I can see that the PC is stuck inside die(), and that's the only information I have. It dies before bringing up the other CPUs, so it's a very early death. I don't think other console types are available under ARM64.
On Thu, Mar 29, 2018 at 5:27 PM, Russell King - ARM Linux <linux@armlinux.org.uk> wrote: > On Thu, Mar 29, 2018 at 09:37:52AM +1100, Oliver wrote: >> On Thu, Mar 29, 2018 at 9:14 AM, Russell King - ARM Linux >> <linux@armlinux.org.uk> wrote: >> > On Wed, Mar 28, 2018 at 02:04:22PM -0500, Rob Landley wrote: >> >> On 03/28/2018 11:48 AM, Russell King - ARM Linux wrote: >> >> > On Wed, Mar 28, 2018 at 10:58:51AM -0500, Rob Landley wrote: >> >> >> On 03/28/2018 10:26 AM, Shea Levy wrote: >> >> >>> Now only those architectures that have custom initrd free requirements >> >> >>> need to define free_initrd_mem. >> >> >> ... >> >> >>> --- a/arch/arc/mm/init.c >> >> >>> +++ b/arch/arc/mm/init.c >> >> >>> @@ -229,10 +229,3 @@ void __ref free_initmem(void) >> >> >>> { >> >> >>> free_initmem_default(-1); >> >> >>> } >> >> >>> - >> >> >>> -#ifdef CONFIG_BLK_DEV_INITRD >> >> >>> -void __init free_initrd_mem(unsigned long start, unsigned long end) >> >> >>> -{ >> >> >>> - free_reserved_area((void *)start, (void *)end, -1, "initrd"); >> >> >>> -} >> >> >>> -#endif >> >> >>> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig >> >> >>> index 3f972e83909b..19d1c5594e2d 100644 >> >> >>> --- a/arch/arm/Kconfig >> >> >>> +++ b/arch/arm/Kconfig >> >> >>> @@ -47,6 +47,7 @@ config ARM >> >> >>> select HARDIRQS_SW_RESEND >> >> >>> select HAVE_ARCH_AUDITSYSCALL if (AEABI && !OABI_COMPAT) >> >> >>> select HAVE_ARCH_BITREVERSE if (CPU_32v7M || CPU_32v7) && !CPU_32v6 >> >> >>> + select HAVE_ARCH_FREE_INITRD_MEM >> >> >>> select HAVE_ARCH_JUMP_LABEL if !XIP_KERNEL && !CPU_ENDIAN_BE32 && MMU >> >> >>> select HAVE_ARCH_KGDB if !CPU_ENDIAN_BE32 && MMU >> >> >>> select HAVE_ARCH_MMAP_RND_BITS if MMU >> >> >> >> >> >> Isn't this why weak symbols were invented? >> >> > >> >> > Weak symbols means that we end up with both the weakly-referenced code >> >> > and the arch code in the kernel image. That's fine if the weak code >> >> > is small. >> >> >> >> The kernel's been able to build with link time garbage collection since 2016: >> >> >> >> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=b67067f1176d >> >> >> >> Wouldn't that remove the unused one? >> > >> > Probably, if anyone bothered to use that, which they don't. >> > >> > LD_DEAD_CODE_DATA_ELIMINATION is a symbol without a prompt, and from >> > what I can see, nothing selects it. Therefore, the symbol is always >> > disabled, and so the feature never gets used in mainline kernels. >> > >> > Brings up the obvious question - why is it there if it's completely >> > unused? (Maybe to cause confusion, and allowing a justification >> > for __weak ?) >> >> IIRC Nick had some patches to do the arch enablement for powerpc, but >> I'm not sure what happened to them though. I suspect it just fell down >> Nick's ever growing TODO list. > > I've given it a go on ARM, marking every linker-built table with KEEP() > and comparing the System.map files. The resulting kernel is around > 150k smaller, which seems good. > > However, it doesn't boot - and I don't know why. Booting the kernel > under kvmtool in a VM using virtio-console, I can find no way to get > any kernel messages out of it. Using lkvm debug, I can see that the > PC is stuck inside die(), and that's the only information I have. > It dies before bringing up the other CPUs, so it's a very early death. > > I don't think other console types are available under ARM64. earlycon? Gr{oetje,eeting}s, Geert
On Thu, Mar 29, 2018 at 05:43:47PM +0200, Geert Uytterhoeven wrote: > On Thu, Mar 29, 2018 at 5:27 PM, Russell King - ARM Linux > <linux@armlinux.org.uk> wrote: > > On Thu, Mar 29, 2018 at 09:37:52AM +1100, Oliver wrote: > >> On Thu, Mar 29, 2018 at 9:14 AM, Russell King - ARM Linux > >> <linux@armlinux.org.uk> wrote: > >> > On Wed, Mar 28, 2018 at 02:04:22PM -0500, Rob Landley wrote: > >> >> On 03/28/2018 11:48 AM, Russell King - ARM Linux wrote: > >> >> > On Wed, Mar 28, 2018 at 10:58:51AM -0500, Rob Landley wrote: > >> >> >> On 03/28/2018 10:26 AM, Shea Levy wrote: > >> >> >>> Now only those architectures that have custom initrd free requirements > >> >> >>> need to define free_initrd_mem. > >> >> >> ... > >> >> >>> --- a/arch/arc/mm/init.c > >> >> >>> +++ b/arch/arc/mm/init.c > >> >> >>> @@ -229,10 +229,3 @@ void __ref free_initmem(void) > >> >> >>> { > >> >> >>> free_initmem_default(-1); > >> >> >>> } > >> >> >>> - > >> >> >>> -#ifdef CONFIG_BLK_DEV_INITRD > >> >> >>> -void __init free_initrd_mem(unsigned long start, unsigned long end) > >> >> >>> -{ > >> >> >>> - free_reserved_area((void *)start, (void *)end, -1, "initrd"); > >> >> >>> -} > >> >> >>> -#endif > >> >> >>> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig > >> >> >>> index 3f972e83909b..19d1c5594e2d 100644 > >> >> >>> --- a/arch/arm/Kconfig > >> >> >>> +++ b/arch/arm/Kconfig > >> >> >>> @@ -47,6 +47,7 @@ config ARM > >> >> >>> select HARDIRQS_SW_RESEND > >> >> >>> select HAVE_ARCH_AUDITSYSCALL if (AEABI && !OABI_COMPAT) > >> >> >>> select HAVE_ARCH_BITREVERSE if (CPU_32v7M || CPU_32v7) && !CPU_32v6 > >> >> >>> + select HAVE_ARCH_FREE_INITRD_MEM > >> >> >>> select HAVE_ARCH_JUMP_LABEL if !XIP_KERNEL && !CPU_ENDIAN_BE32 && MMU > >> >> >>> select HAVE_ARCH_KGDB if !CPU_ENDIAN_BE32 && MMU > >> >> >>> select HAVE_ARCH_MMAP_RND_BITS if MMU > >> >> >> > >> >> >> Isn't this why weak symbols were invented? > >> >> > > >> >> > Weak symbols means that we end up with both the weakly-referenced code > >> >> > and the arch code in the kernel image. That's fine if the weak code > >> >> > is small. > >> >> > >> >> The kernel's been able to build with link time garbage collection since 2016: > >> >> > >> >> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=b67067f1176d > >> >> > >> >> Wouldn't that remove the unused one? > >> > > >> > Probably, if anyone bothered to use that, which they don't. > >> > > >> > LD_DEAD_CODE_DATA_ELIMINATION is a symbol without a prompt, and from > >> > what I can see, nothing selects it. Therefore, the symbol is always > >> > disabled, and so the feature never gets used in mainline kernels. > >> > > >> > Brings up the obvious question - why is it there if it's completely > >> > unused? (Maybe to cause confusion, and allowing a justification > >> > for __weak ?) > >> > >> IIRC Nick had some patches to do the arch enablement for powerpc, but > >> I'm not sure what happened to them though. I suspect it just fell down > >> Nick's ever growing TODO list. > > > > I've given it a go on ARM, marking every linker-built table with KEEP() > > and comparing the System.map files. The resulting kernel is around > > 150k smaller, which seems good. > > > > However, it doesn't boot - and I don't know why. Booting the kernel > > under kvmtool in a VM using virtio-console, I can find no way to get > > any kernel messages out of it. Using lkvm debug, I can see that the > > PC is stuck inside die(), and that's the only information I have. > > It dies before bringing up the other CPUs, so it's a very early death. > > > > I don't think other console types are available under ARM64. > > earlycon? Through what - as I say above, I think the only thing that's present is virtio-console, and the virtio stack only get initialised much later in boot. Eg, there's the memory-based virtio driver which interfaces any virtio driver to a memory-based ring structures for communication with the host (drivers/virtio/virtio_mmio.c) which is initialised at module_init() time, and so isn't available for earlycon. I don't think merely changing the module_init() calls in the appropriate virtio bits will suffice - it's why I pointed out that it dies before SMP initialisation, which also means that it dies before we start running the initcalls for subsystems and drivers. I'm not aware of there being an emulated UART in the guest's address space, so serial based stuff doesn't work.
On 03/28/2018 05:14 PM, Russell King - ARM Linux wrote: > On Wed, Mar 28, 2018 at 02:04:22PM -0500, Rob Landley wrote: >> >> >> On 03/28/2018 11:48 AM, Russell King - ARM Linux wrote: >>> On Wed, Mar 28, 2018 at 10:58:51AM -0500, Rob Landley wrote: >>>> On 03/28/2018 10:26 AM, Shea Levy wrote: >>>>> Now only those architectures that have custom initrd free requirements >>>>> need to define free_initrd_mem. >>>> ... >>>>> --- a/arch/arc/mm/init.c >>>>> +++ b/arch/arc/mm/init.c >>>>> @@ -229,10 +229,3 @@ void __ref free_initmem(void) >>>>> { >>>>> free_initmem_default(-1); >>>>> } >>>>> - >>>>> -#ifdef CONFIG_BLK_DEV_INITRD >>>>> -void __init free_initrd_mem(unsigned long start, unsigned long end) >>>>> -{ >>>>> - free_reserved_area((void *)start, (void *)end, -1, "initrd"); >>>>> -} >>>>> -#endif >>>>> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig >>>>> index 3f972e83909b..19d1c5594e2d 100644 >>>>> --- a/arch/arm/Kconfig >>>>> +++ b/arch/arm/Kconfig >>>>> @@ -47,6 +47,7 @@ config ARM >>>>> select HARDIRQS_SW_RESEND >>>>> select HAVE_ARCH_AUDITSYSCALL if (AEABI && !OABI_COMPAT) >>>>> select HAVE_ARCH_BITREVERSE if (CPU_32v7M || CPU_32v7) && !CPU_32v6 >>>>> + select HAVE_ARCH_FREE_INITRD_MEM >>>>> select HAVE_ARCH_JUMP_LABEL if !XIP_KERNEL && !CPU_ENDIAN_BE32 && MMU >>>>> select HAVE_ARCH_KGDB if !CPU_ENDIAN_BE32 && MMU >>>>> select HAVE_ARCH_MMAP_RND_BITS if MMU >>>> >>>> Isn't this why weak symbols were invented? >>> >>> Weak symbols means that we end up with both the weakly-referenced code >>> and the arch code in the kernel image. That's fine if the weak code >>> is small. >> >> The kernel's been able to build with link time garbage collection since 2016: >> >> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=b67067f1176d >> >> Wouldn't that remove the unused one? > > Probably, if anyone bothered to use that, which they don't. > > LD_DEAD_CODE_DATA_ELIMINATION is a symbol without a prompt, and from > what I can see, nothing selects it. Therefore, the symbol is always > disabled, and so the feature never gets used in mainline kernels. It looks like there are per-architecture linker scripts that need to be updated? So if an architecture supports it, it's always done (well, it probes for the toolchain supporting the flag). And if the architecture doesn't support it, the linker script needs to be updated to mark sections with "I know nothing seems to reference this at the ELF level but keep it anyway, we're pulling an assembly trick". > Brings up the obvious question - why is it there if it's completely > unused? (Maybe to cause confusion, and allowing a justification > for __weak ?) Presumably it will become the default on architectures as their linker scripts are converted. Once they're all converted the config symbol can go away. (Given the move to requiring gcc 4.7 or whatever it is, there can't be an architecture depending on a toolchain that _doesn't_ support it after that point. I doubt you can pair gcc 4.7 with a >12 year old binutils and expect good things...) Rob
On Thu, 29 Mar 2018 16:58:27 +0100, Russell King - ARM Linux wrote: > > On Thu, Mar 29, 2018 at 05:43:47PM +0200, Geert Uytterhoeven wrote: > > On Thu, Mar 29, 2018 at 5:27 PM, Russell King - ARM Linux > > <linux@armlinux.org.uk> wrote: > > > On Thu, Mar 29, 2018 at 09:37:52AM +1100, Oliver wrote: > > >> On Thu, Mar 29, 2018 at 9:14 AM, Russell King - ARM Linux > > >> <linux@armlinux.org.uk> wrote: > > >> > On Wed, Mar 28, 2018 at 02:04:22PM -0500, Rob Landley wrote: > > >> >> On 03/28/2018 11:48 AM, Russell King - ARM Linux wrote: > > >> >> > On Wed, Mar 28, 2018 at 10:58:51AM -0500, Rob Landley wrote: > > >> >> >> On 03/28/2018 10:26 AM, Shea Levy wrote: > > >> >> >>> Now only those architectures that have custom initrd free requirements > > >> >> >>> need to define free_initrd_mem. > > >> >> >> ... > > >> >> >>> --- a/arch/arc/mm/init.c > > >> >> >>> +++ b/arch/arc/mm/init.c > > >> >> >>> @@ -229,10 +229,3 @@ void __ref free_initmem(void) > > >> >> >>> { > > >> >> >>> free_initmem_default(-1); > > >> >> >>> } > > >> >> >>> - > > >> >> >>> -#ifdef CONFIG_BLK_DEV_INITRD > > >> >> >>> -void __init free_initrd_mem(unsigned long start, unsigned long end) > > >> >> >>> -{ > > >> >> >>> - free_reserved_area((void *)start, (void *)end, -1, "initrd"); > > >> >> >>> -} > > >> >> >>> -#endif > > >> >> >>> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig > > >> >> >>> index 3f972e83909b..19d1c5594e2d 100644 > > >> >> >>> --- a/arch/arm/Kconfig > > >> >> >>> +++ b/arch/arm/Kconfig > > >> >> >>> @@ -47,6 +47,7 @@ config ARM > > >> >> >>> select HARDIRQS_SW_RESEND > > >> >> >>> select HAVE_ARCH_AUDITSYSCALL if (AEABI && !OABI_COMPAT) > > >> >> >>> select HAVE_ARCH_BITREVERSE if (CPU_32v7M || CPU_32v7) && !CPU_32v6 > > >> >> >>> + select HAVE_ARCH_FREE_INITRD_MEM > > >> >> >>> select HAVE_ARCH_JUMP_LABEL if !XIP_KERNEL && !CPU_ENDIAN_BE32 && MMU > > >> >> >>> select HAVE_ARCH_KGDB if !CPU_ENDIAN_BE32 && MMU > > >> >> >>> select HAVE_ARCH_MMAP_RND_BITS if MMU > > >> >> >> > > >> >> >> Isn't this why weak symbols were invented? > > >> >> > > > >> >> > Weak symbols means that we end up with both the weakly-referenced code > > >> >> > and the arch code in the kernel image. That's fine if the weak code > > >> >> > is small. > > >> >> > > >> >> The kernel's been able to build with link time garbage collection since 2016: > > >> >> > > >> >> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=b67067f1176d > > >> >> > > >> >> Wouldn't that remove the unused one? > > >> > > > >> > Probably, if anyone bothered to use that, which they don't. > > >> > > > >> > LD_DEAD_CODE_DATA_ELIMINATION is a symbol without a prompt, and from > > >> > what I can see, nothing selects it. Therefore, the symbol is always > > >> > disabled, and so the feature never gets used in mainline kernels. > > >> > > > >> > Brings up the obvious question - why is it there if it's completely > > >> > unused? (Maybe to cause confusion, and allowing a justification > > >> > for __weak ?) > > >> > > >> IIRC Nick had some patches to do the arch enablement for powerpc, but > > >> I'm not sure what happened to them though. I suspect it just fell down > > >> Nick's ever growing TODO list. > > > > > > I've given it a go on ARM, marking every linker-built table with KEEP() > > > and comparing the System.map files. The resulting kernel is around > > > 150k smaller, which seems good. > > > > > > However, it doesn't boot - and I don't know why. Booting the kernel > > > under kvmtool in a VM using virtio-console, I can find no way to get > > > any kernel messages out of it. Using lkvm debug, I can see that the > > > PC is stuck inside die(), and that's the only information I have. > > > It dies before bringing up the other CPUs, so it's a very early death. > > > > > > I don't think other console types are available under ARM64. > > > > earlycon? > > Through what - as I say above, I think the only thing that's present is > virtio-console, and the virtio stack only get initialised much later in > boot. > > Eg, there's the memory-based virtio driver which interfaces any virtio > driver to a memory-based ring structures for communication with the host > (drivers/virtio/virtio_mmio.c) which is initialised at module_init() > time, and so isn't available for earlycon. > > I don't think merely changing the module_init() calls in the appropriate > virtio bits will suffice - it's why I pointed out that it dies before > SMP initialisation, which also means that it dies before we start > running the initcalls for subsystems and drivers. > > I'm not aware of there being an emulated UART in the guest's address > space, so serial based stuff doesn't work. "earlycon=uart,mmio,0x3f8" is what you're looking for: $ Work/kvmtool/lkvm run -c2 -k zImage -p "earlycon=uart,mmio,0x3f8" --console virtio --aarch32 # lkvm run -k zImage -m 320 -c 2 --name guest-3856 Info: Loaded kernel to 0x80008000 (6767104 bytes) Info: Placing fdt at 0x8fe00000 - 0x8fffffff Info: virtio-mmio.devices=0x200@0x10000:36 Info: virtio-mmio.devices=0x200@0x10200:37 Info: virtio-mmio.devices=0x200@0x10400:38 [ 0.000000] Booting Linux on physical CPU 0x0 [ 0.000000] Linux version 4.16.0-rc6+ (maz@approximate) (gcc version 6.3.0 20170516 (Debian 6.3.0-18)) #8407 SMP PREEMPT Tue Mar 20 15:01:43 GMT 2018 [ 0.000000] CPU: ARMv7 Processor [410fd082] revision 2 (ARMv7), cr=30c5383d [ 0.000000] CPU: div instructions available: patching division code [ 0.000000] CPU: PIPT / VIPT nonaliasing data cache, PIPT instruction cache [ 0.000000] OF: fdt: Machine model: linux,dummy-virt [ 0.000000] earlycon: uart0 at MMIO 0x00000000000003f8 (options '') [ 0.000000] bootconsole [uart0] enabled [ 0.000000] Memory policy: Data cache writealloc [ 0.000000] efi: Getting EFI parameters from FDT: [ 0.000000] efi: UEFI not found. [...] M.
On Thu, Mar 29, 2018 at 11:39:24AM -0500, Rob Landley wrote: > > > On 03/28/2018 05:14 PM, Russell King - ARM Linux wrote: > > On Wed, Mar 28, 2018 at 02:04:22PM -0500, Rob Landley wrote: > >> > >> > >> On 03/28/2018 11:48 AM, Russell King - ARM Linux wrote: > >>> On Wed, Mar 28, 2018 at 10:58:51AM -0500, Rob Landley wrote: > >>>> On 03/28/2018 10:26 AM, Shea Levy wrote: > >>>>> Now only those architectures that have custom initrd free requirements > >>>>> need to define free_initrd_mem. > >>>> ... > >>>>> --- a/arch/arc/mm/init.c > >>>>> +++ b/arch/arc/mm/init.c > >>>>> @@ -229,10 +229,3 @@ void __ref free_initmem(void) > >>>>> { > >>>>> free_initmem_default(-1); > >>>>> } > >>>>> - > >>>>> -#ifdef CONFIG_BLK_DEV_INITRD > >>>>> -void __init free_initrd_mem(unsigned long start, unsigned long end) > >>>>> -{ > >>>>> - free_reserved_area((void *)start, (void *)end, -1, "initrd"); > >>>>> -} > >>>>> -#endif > >>>>> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig > >>>>> index 3f972e83909b..19d1c5594e2d 100644 > >>>>> --- a/arch/arm/Kconfig > >>>>> +++ b/arch/arm/Kconfig > >>>>> @@ -47,6 +47,7 @@ config ARM > >>>>> select HARDIRQS_SW_RESEND > >>>>> select HAVE_ARCH_AUDITSYSCALL if (AEABI && !OABI_COMPAT) > >>>>> select HAVE_ARCH_BITREVERSE if (CPU_32v7M || CPU_32v7) && !CPU_32v6 > >>>>> + select HAVE_ARCH_FREE_INITRD_MEM > >>>>> select HAVE_ARCH_JUMP_LABEL if !XIP_KERNEL && !CPU_ENDIAN_BE32 && MMU > >>>>> select HAVE_ARCH_KGDB if !CPU_ENDIAN_BE32 && MMU > >>>>> select HAVE_ARCH_MMAP_RND_BITS if MMU > >>>> > >>>> Isn't this why weak symbols were invented? > >>> > >>> Weak symbols means that we end up with both the weakly-referenced code > >>> and the arch code in the kernel image. That's fine if the weak code > >>> is small. > >> > >> The kernel's been able to build with link time garbage collection since 2016: > >> > >> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=b67067f1176d > >> > >> Wouldn't that remove the unused one? > > > > Probably, if anyone bothered to use that, which they don't. > > > > LD_DEAD_CODE_DATA_ELIMINATION is a symbol without a prompt, and from > > what I can see, nothing selects it. Therefore, the symbol is always > > disabled, and so the feature never gets used in mainline kernels. > > It looks like there are per-architecture linker scripts that need to be updated? > So if an architecture supports it, it's always done (well, it probes for the > toolchain supporting the flag). And if the architecture doesn't support it, the > linker script needs to be updated to mark sections with "I know nothing seems to > reference this at the ELF level but keep it anyway, we're pulling an assembly > trick". It looks like it needs much more than just architecture changes as the reason it fails on ARM is because the init thread structure is missing due to missing KEEP()s in INIT_TASK_DATA(). Probably means it doesn't work anywhere. 8<=== From: Russell King <rmk+kernel@armlinux.org.uk> Subject: [PATCH] Fix LD_DEAD_CODE_DATA_ELIMINATION LD_DEAD_CODE_DATA_ELIMINATION fails to boot on ARM because the linker eliminates the init thread data from the bottom of the init threads stack. This causes recursive faults that end up overwriting parts of the kernel before they can print any message. Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk> --- include/asm-generic/vmlinux.lds.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h index 1ab0e520d6fc..41af8a74aae4 100644 --- a/include/asm-generic/vmlinux.lds.h +++ b/include/asm-generic/vmlinux.lds.h @@ -279,8 +279,8 @@ VMLINUX_SYMBOL(__start_init_task) = .; \ VMLINUX_SYMBOL(init_thread_union) = .; \ VMLINUX_SYMBOL(init_stack) = .; \ - *(.data..init_task) \ - *(.data..init_thread_info) \ + KEEP(*(.data..init_task)) \ + KEEP(*(.data..init_thread_info)) \ . = VMLINUX_SYMBOL(__start_init_task) + THREAD_SIZE; \ VMLINUX_SYMBOL(__end_init_task) = .;
On Thu, Mar 29, 2018 at 05:53:14PM +0100, Marc Zyngier wrote: > On Thu, 29 Mar 2018 16:58:27 +0100, > Russell King - ARM Linux wrote: > > > > On Thu, Mar 29, 2018 at 05:43:47PM +0200, Geert Uytterhoeven wrote: > > > On Thu, Mar 29, 2018 at 5:27 PM, Russell King - ARM Linux > > > <linux@armlinux.org.uk> wrote: > > > > On Thu, Mar 29, 2018 at 09:37:52AM +1100, Oliver wrote: > > > >> On Thu, Mar 29, 2018 at 9:14 AM, Russell King - ARM Linux > > > >> <linux@armlinux.org.uk> wrote: > > > >> > On Wed, Mar 28, 2018 at 02:04:22PM -0500, Rob Landley wrote: > > > >> >> On 03/28/2018 11:48 AM, Russell King - ARM Linux wrote: > > > >> >> > On Wed, Mar 28, 2018 at 10:58:51AM -0500, Rob Landley wrote: > > > >> >> >> On 03/28/2018 10:26 AM, Shea Levy wrote: > > > >> >> >>> Now only those architectures that have custom initrd free requirements > > > >> >> >>> need to define free_initrd_mem. > > > >> >> >> ... > > > >> >> >>> --- a/arch/arc/mm/init.c > > > >> >> >>> +++ b/arch/arc/mm/init.c > > > >> >> >>> @@ -229,10 +229,3 @@ void __ref free_initmem(void) > > > >> >> >>> { > > > >> >> >>> free_initmem_default(-1); > > > >> >> >>> } > > > >> >> >>> - > > > >> >> >>> -#ifdef CONFIG_BLK_DEV_INITRD > > > >> >> >>> -void __init free_initrd_mem(unsigned long start, unsigned long end) > > > >> >> >>> -{ > > > >> >> >>> - free_reserved_area((void *)start, (void *)end, -1, "initrd"); > > > >> >> >>> -} > > > >> >> >>> -#endif > > > >> >> >>> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig > > > >> >> >>> index 3f972e83909b..19d1c5594e2d 100644 > > > >> >> >>> --- a/arch/arm/Kconfig > > > >> >> >>> +++ b/arch/arm/Kconfig > > > >> >> >>> @@ -47,6 +47,7 @@ config ARM > > > >> >> >>> select HARDIRQS_SW_RESEND > > > >> >> >>> select HAVE_ARCH_AUDITSYSCALL if (AEABI && !OABI_COMPAT) > > > >> >> >>> select HAVE_ARCH_BITREVERSE if (CPU_32v7M || CPU_32v7) && !CPU_32v6 > > > >> >> >>> + select HAVE_ARCH_FREE_INITRD_MEM > > > >> >> >>> select HAVE_ARCH_JUMP_LABEL if !XIP_KERNEL && !CPU_ENDIAN_BE32 && MMU > > > >> >> >>> select HAVE_ARCH_KGDB if !CPU_ENDIAN_BE32 && MMU > > > >> >> >>> select HAVE_ARCH_MMAP_RND_BITS if MMU > > > >> >> >> > > > >> >> >> Isn't this why weak symbols were invented? > > > >> >> > > > > >> >> > Weak symbols means that we end up with both the weakly-referenced code > > > >> >> > and the arch code in the kernel image. That's fine if the weak code > > > >> >> > is small. > > > >> >> > > > >> >> The kernel's been able to build with link time garbage collection since 2016: > > > >> >> > > > >> >> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=b67067f1176d > > > >> >> > > > >> >> Wouldn't that remove the unused one? > > > >> > > > > >> > Probably, if anyone bothered to use that, which they don't. > > > >> > > > > >> > LD_DEAD_CODE_DATA_ELIMINATION is a symbol without a prompt, and from > > > >> > what I can see, nothing selects it. Therefore, the symbol is always > > > >> > disabled, and so the feature never gets used in mainline kernels. > > > >> > > > > >> > Brings up the obvious question - why is it there if it's completely > > > >> > unused? (Maybe to cause confusion, and allowing a justification > > > >> > for __weak ?) > > > >> > > > >> IIRC Nick had some patches to do the arch enablement for powerpc, but > > > >> I'm not sure what happened to them though. I suspect it just fell down > > > >> Nick's ever growing TODO list. > > > > > > > > I've given it a go on ARM, marking every linker-built table with KEEP() > > > > and comparing the System.map files. The resulting kernel is around > > > > 150k smaller, which seems good. > > > > > > > > However, it doesn't boot - and I don't know why. Booting the kernel > > > > under kvmtool in a VM using virtio-console, I can find no way to get > > > > any kernel messages out of it. Using lkvm debug, I can see that the > > > > PC is stuck inside die(), and that's the only information I have. > > > > It dies before bringing up the other CPUs, so it's a very early death. > > > > > > > > I don't think other console types are available under ARM64. > > > > > > earlycon? > > > > Through what - as I say above, I think the only thing that's present is > > virtio-console, and the virtio stack only get initialised much later in > > boot. > > > > Eg, there's the memory-based virtio driver which interfaces any virtio > > driver to a memory-based ring structures for communication with the host > > (drivers/virtio/virtio_mmio.c) which is initialised at module_init() > > time, and so isn't available for earlycon. > > > > I don't think merely changing the module_init() calls in the appropriate > > virtio bits will suffice - it's why I pointed out that it dies before > > SMP initialisation, which also means that it dies before we start > > running the initcalls for subsystems and drivers. > > > > I'm not aware of there being an emulated UART in the guest's address > > space, so serial based stuff doesn't work. > > "earlycon=uart,mmio,0x3f8" is what you're looking for: Does that also mean that we have a RTC at the standard PC IO addresses as well, but in mmio space?
On 03/29/2018 10:27 AM, Russell King - ARM Linux wrote: > On Thu, Mar 29, 2018 at 09:37:52AM +1100, Oliver wrote: >> On Thu, Mar 29, 2018 at 9:14 AM, Russell King - ARM Linux >>> LD_DEAD_CODE_DATA_ELIMINATION is a symbol without a prompt, and from >>> what I can see, nothing selects it. Therefore, the symbol is always >>> disabled, and so the feature never gets used in mainline kernels. >>> >>> Brings up the obvious question - why is it there if it's completely >>> unused? (Maybe to cause confusion, and allowing a justification >>> for __weak ?) >> >> IIRC Nick had some patches to do the arch enablement for powerpc, but >> I'm not sure what happened to them though. I suspect it just fell down >> Nick's ever growing TODO list. > > I've given it a go on ARM, marking every linker-built table with KEEP() > and comparing the System.map files. The resulting kernel is around > 150k smaller, which seems good. > > However, it doesn't boot - and I don't know why. Booting the kernel > under kvmtool in a VM using virtio-console, I can find no way to get > any kernel messages out of it. Using lkvm debug, I can see that the > PC is stuck inside die(), and that's the only information I have. qemu-system-arm's "-s" option lets you hook to the hardware with gdb, as if using one of those jtags that speaks gdbserver protocol. It stops waiting for you to attach with 'target remote' it, then 'file vmlinux' to load the symbols... The miniconfig and qemu invocation I use for arm64 are attached, tested with 2.11.0 on a 4.14 kernel. You should be able to just "qemu-aarch64.sh -s" and then probably "target remote 127.0.0.1:1234"? (Been a while since I've used it, don't have a cross-gdb for arm64 lying around...) Sigh, I just tried -s and qemu 2.11.0 is _not_ waiting for gdb to attach on arm64, despite what the docs say: $ qemu-system-aarch64 --help | grep gdb -gdb dev wait for gdb connection on 'dev' -s shorthand for -gdb tcp::1234 Another random regression in qemu, gee what a surprise. > It dies before bringing up the other CPUs, so it's a very early death. > > I don't think other console types are available under ARM64. I've often found useful the two line version of: https://balau82.wordpress.com/2010/02/28/hello-world-for-bare-metal-arm-using-qemu/ Which is generally some variant of: {char *XX = "blah"; while (*XX) {while (*SERIAL_STATUS_REGISTER & OUT_READY); *SERIAL_OUT = *XX++;}} (I.E. balu cheated not spinning checking the ready-for-next-byte bit, because qemu's always angry.) That trick lets you cut and paste a print statement into all sorts of early hardware nonsense, on most architectures. You just have to look up SERIAL_STATUS_REGISTER, OUT_OK_BIT, and SERIAL_OUT values for the serial port du jour. That said I've mostly used it in things like u-boot. I dunno at what point the kernel's done enough setup that direct banging on registers would stop working. (Works in the decompresion code, anyway.) And it assumes the port's set to the right speed (usually left there by the bootloader)... Rob # make ARCH=arm64 allnoconfig KCONFIG_ALLCONFIG=aarch64.miniconf # make ARCH=arm64 -j $(nproc) # boot arch/arm64/boot/Image CONFIG_MMU=y CONFIG_ARCH_MULTI_V7=y CONFIG_ARCH_VIRT=y CONFIG_SOC_DRA7XX=y CONFIG_ARCH_OMAP2PLUS_TYPICAL=y CONFIG_ARCH_ALPINE=y CONFIG_ARM_THUMB=y CONFIG_VDSO=y CONFIG_CPU_IDLE=y CONFIG_ARM_CPUIDLE=y CONFIG_KERNEL_MODE_NEON=y CONFIG_SERIAL_AMBA_PL011=y CONFIG_SERIAL_AMBA_PL011_CONSOLE=y CONFIG_RTC_CLASS=y CONFIG_RTC_HCTOSYS=y CONFIG_RTC_DRV_PL031=y CONFIG_NET_CORE=y CONFIG_VIRTIO_NET=y CONFIG_PCI=y CONFIG_PCI_HOST_GENERIC=y CONFIG_VIRTIO_BLK=y CONFIG_VIRTIO_PCI=y CONFIG_VIRTIO_MMIO=y CONFIG_ATA=y CONFIG_ATA_SFF=y CONFIG_ATA_BMDMA=y CONFIG_ATA_PIIX=y CONFIG_PATA_PLATFORM=y CONFIG_PATA_OF_PLATFORM=y CONFIG_ATA_GENERIC=y # CONFIG_EMBEDDED is not set CONFIG_EARLY_PRINTK=y CONFIG_BINFMT_ELF=y CONFIG_BINFMT_SCRIPT=y CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y CONFIG_BLK_DEV=y CONFIG_BLK_DEV_INITRD=y CONFIG_RD_GZIP=y CONFIG_BLK_DEV_LOOP=y CONFIG_EXT4_FS=y CONFIG_EXT4_USE_FOR_EXT2=y CONFIG_VFAT_FS=y CONFIG_FAT_DEFAULT_UTF8=y CONFIG_MISC_FILESYSTEMS=y CONFIG_SQUASHFS=y CONFIG_SQUASHFS_XATTR=y CONFIG_SQUASHFS_ZLIB=y CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y CONFIG_TMPFS=y CONFIG_TMPFS_POSIX_ACL=y CONFIG_NET=y CONFIG_PACKET=y CONFIG_UNIX=y CONFIG_INET=y CONFIG_IPV6=y CONFIG_NETDEVICES=y #CONFIG_NET_CORE=y #CONFIG_NETCONSOLE=y CONFIG_ETHERNET=y
On Thu, 29 Mar 2018 18:32:47 +0100, Russell King - ARM Linux wrote: > > On Thu, Mar 29, 2018 at 05:53:14PM +0100, Marc Zyngier wrote: > > On Thu, 29 Mar 2018 16:58:27 +0100, > > Russell King - ARM Linux wrote: [...] > > > I'm not aware of there being an emulated UART in the guest's address > > > space, so serial based stuff doesn't work. > > > > "earlycon=uart,mmio,0x3f8" is what you're looking for: > > Does that also mean that we have a RTC at the standard PC IO addresses > as well, but in mmio space? There is one, together with an i8042. Not exposed in the DT though. M.
Hi Shea, Thank you for the patch! Perhaps something to improve: [auto build test WARNING on linus/master] [also build test WARNING on v4.16-rc7] [cannot apply to next-20180329] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system] url: https://github.com/0day-ci/linux/commits/Shea-Levy/Extract-initrd-free-logic-from-arch-specific-code/20180330-085507 config: ia64-allnoconfig (attached as .config) compiler: ia64-linux-gcc (GCC) 7.2.0 reproduce: wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # save the attached .config to linux build tree make.cross ARCH=ia64 All warnings (new ones prefixed by >>): warning: (IA64) selects HAVE_ARCH_FREE_INITRD_MEM which has unmet direct dependencies (BLK_DEV_INITRD) --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation
Hi Shea, Thank you for the patch! Perhaps something to improve: [auto build test WARNING on linus/master] [also build test WARNING on v4.16-rc7] [cannot apply to next-20180329] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system] url: https://github.com/0day-ci/linux/commits/Shea-Levy/Extract-initrd-free-logic-from-arch-specific-code/20180330-085507 config: m32r-m32104ut_defconfig (attached as .config) compiler: m32r-linux-gcc (GCC) 7.2.0 reproduce: wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # save the attached .config to linux build tree make.cross ARCH=m32r All warnings (new ones prefixed by >>): warning: (M32R) selects HAVE_ARCH_FREE_INITRD_MEM which has unmet direct dependencies (BLK_DEV_INITRD) --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation
* Shea Levy <shea@shealevy.com> wrote: > Now only those architectures that have custom initrd free requirements > need to define free_initrd_mem. > > Signed-off-by: Shea Levy <shea@shealevy.com> Please put the Kconfig symbol name this patch introduces both into the title, so that people know what to grep for. > --- > arch/alpha/mm/init.c | 8 -------- > arch/arc/mm/init.c | 7 ------- > arch/arm/Kconfig | 1 + > arch/arm64/Kconfig | 1 + > arch/blackfin/Kconfig | 1 + > arch/c6x/mm/init.c | 7 ------- > arch/cris/Kconfig | 1 + > arch/frv/mm/init.c | 11 ----------- > arch/h8300/mm/init.c | 7 ------- > arch/hexagon/Kconfig | 1 + > arch/ia64/Kconfig | 1 + > arch/m32r/Kconfig | 1 + > arch/m32r/mm/init.c | 11 ----------- > arch/m68k/mm/init.c | 7 ------- > arch/metag/Kconfig | 1 + > arch/microblaze/mm/init.c | 7 ------- > arch/mips/Kconfig | 1 + > arch/mn10300/Kconfig | 1 + > arch/nios2/mm/init.c | 7 ------- > arch/openrisc/mm/init.c | 7 ------- > arch/parisc/mm/init.c | 7 ------- > arch/powerpc/mm/mem.c | 7 ------- > arch/riscv/mm/init.c | 6 ------ > arch/s390/Kconfig | 1 + > arch/score/Kconfig | 1 + > arch/sh/mm/init.c | 7 ------- > arch/sparc/Kconfig | 1 + > arch/tile/Kconfig | 1 + > arch/um/kernel/mem.c | 7 ------- > arch/unicore32/Kconfig | 1 + > arch/x86/Kconfig | 1 + > arch/xtensa/Kconfig | 1 + > init/initramfs.c | 7 +++++++ > usr/Kconfig | 4 ++++ > 34 files changed, 28 insertions(+), 113 deletions(-) Please also put it into Documentation/features/. > diff --git a/usr/Kconfig b/usr/Kconfig > index 43658b8a975e..7a94f6df39bf 100644 > --- a/usr/Kconfig > +++ b/usr/Kconfig > @@ -233,3 +233,7 @@ config INITRAMFS_COMPRESSION > default ".lzma" if RD_LZMA > default ".bz2" if RD_BZIP2 > default "" > + > +config HAVE_ARCH_FREE_INITRD_MEM > + bool > + default n Help text would be nice, to tell arch maintainers what the purpose of this switch is. Also, a nit, I think this should be named "ARCH_HAS_FREE_INITRD_MEM", which is the dominant pattern: triton:~/tip> git grep 'select.*ARCH' arch/x86/Kconfig* | cut -f2 | cut -d_ -f1-2 | sort | uniq -c | sort -n ... 2 select ARCH_USES 2 select ARCH_WANTS 3 select ARCH_MIGHT 3 select ARCH_WANT 4 select ARCH_SUPPORTS 4 select ARCH_USE 16 select HAVE_ARCH 23 select ARCH_HAS It also reads nicely in English: "arch has free_initrd_mem()" While the other makes little sense: "have arch free_initrd_mem()" ? Thanks, Ingo
Hi Ingo, Ingo Molnar <mingo@kernel.org> writes: > * Shea Levy <shea@shealevy.com> wrote: > >> Now only those architectures that have custom initrd free requirements >> need to define free_initrd_mem. >> >> Signed-off-by: Shea Levy <shea@shealevy.com> > > Please put the Kconfig symbol name this patch introduces both into the title, so > that people know what to grep for. > >> --- >> arch/alpha/mm/init.c | 8 -------- >> arch/arc/mm/init.c | 7 ------- >> arch/arm/Kconfig | 1 + >> arch/arm64/Kconfig | 1 + >> arch/blackfin/Kconfig | 1 + >> arch/c6x/mm/init.c | 7 ------- >> arch/cris/Kconfig | 1 + >> arch/frv/mm/init.c | 11 ----------- >> arch/h8300/mm/init.c | 7 ------- >> arch/hexagon/Kconfig | 1 + >> arch/ia64/Kconfig | 1 + >> arch/m32r/Kconfig | 1 + >> arch/m32r/mm/init.c | 11 ----------- >> arch/m68k/mm/init.c | 7 ------- >> arch/metag/Kconfig | 1 + >> arch/microblaze/mm/init.c | 7 ------- >> arch/mips/Kconfig | 1 + >> arch/mn10300/Kconfig | 1 + >> arch/nios2/mm/init.c | 7 ------- >> arch/openrisc/mm/init.c | 7 ------- >> arch/parisc/mm/init.c | 7 ------- >> arch/powerpc/mm/mem.c | 7 ------- >> arch/riscv/mm/init.c | 6 ------ >> arch/s390/Kconfig | 1 + >> arch/score/Kconfig | 1 + >> arch/sh/mm/init.c | 7 ------- >> arch/sparc/Kconfig | 1 + >> arch/tile/Kconfig | 1 + >> arch/um/kernel/mem.c | 7 ------- >> arch/unicore32/Kconfig | 1 + >> arch/x86/Kconfig | 1 + >> arch/xtensa/Kconfig | 1 + >> init/initramfs.c | 7 +++++++ >> usr/Kconfig | 4 ++++ >> 34 files changed, 28 insertions(+), 113 deletions(-) > > Please also put it into Documentation/features/. > I switched this patch series (the latest revision v6 was just posted) to using weak symbols instead of Kconfig. Does it still warrant documentation? > >> diff --git a/usr/Kconfig b/usr/Kconfig >> index 43658b8a975e..7a94f6df39bf 100644 >> --- a/usr/Kconfig >> +++ b/usr/Kconfig >> @@ -233,3 +233,7 @@ config INITRAMFS_COMPRESSION >> default ".lzma" if RD_LZMA >> default ".bz2" if RD_BZIP2 >> default "" >> + >> +config HAVE_ARCH_FREE_INITRD_MEM >> + bool >> + default n > > Help text would be nice, to tell arch maintainers what the purpose of this switch > is. > > Also, a nit, I think this should be named "ARCH_HAS_FREE_INITRD_MEM", which is the > dominant pattern: > > triton:~/tip> git grep 'select.*ARCH' arch/x86/Kconfig* | cut -f2 | cut -d_ -f1-2 | sort | uniq -c | sort -n > ... > 2 select ARCH_USES > 2 select ARCH_WANTS > 3 select ARCH_MIGHT > 3 select ARCH_WANT > 4 select ARCH_SUPPORTS > 4 select ARCH_USE > 16 select HAVE_ARCH > 23 select ARCH_HAS > > It also reads nicely in English: > > "arch has free_initrd_mem()" > > While the other makes little sense: > > "have arch free_initrd_mem()" > > ? > > Thanks, > > Ingo Thanks, Shea
* Shea Levy <shea@shealevy.com> wrote: > > Please also put it into Documentation/features/. > > I switched this patch series (the latest revision v6 was just posted) to > using weak symbols instead of Kconfig. Does it still warrant documentation? Probably not. Thanks, Ingo
diff --git a/arch/alpha/mm/init.c b/arch/alpha/mm/init.c index 9d74520298ab..55f7c8efa962 100644 --- a/arch/alpha/mm/init.c +++ b/arch/alpha/mm/init.c @@ -291,11 +291,3 @@ free_initmem(void) { free_initmem_default(-1); } - -#ifdef CONFIG_BLK_DEV_INITRD -void -free_initrd_mem(unsigned long start, unsigned long end) -{ - free_reserved_area((void *)start, (void *)end, -1, "initrd"); -} -#endif diff --git a/arch/arc/mm/init.c b/arch/arc/mm/init.c index ba145065c579..7bcf23ab1756 100644 --- a/arch/arc/mm/init.c +++ b/arch/arc/mm/init.c @@ -229,10 +229,3 @@ void __ref free_initmem(void) { free_initmem_default(-1); } - -#ifdef CONFIG_BLK_DEV_INITRD -void __init free_initrd_mem(unsigned long start, unsigned long end) -{ - free_reserved_area((void *)start, (void *)end, -1, "initrd"); -} -#endif diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 3f972e83909b..19d1c5594e2d 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -47,6 +47,7 @@ config ARM select HARDIRQS_SW_RESEND select HAVE_ARCH_AUDITSYSCALL if (AEABI && !OABI_COMPAT) select HAVE_ARCH_BITREVERSE if (CPU_32v7M || CPU_32v7) && !CPU_32v6 + select HAVE_ARCH_FREE_INITRD_MEM select HAVE_ARCH_JUMP_LABEL if !XIP_KERNEL && !CPU_ENDIAN_BE32 && MMU select HAVE_ARCH_KGDB if !CPU_ENDIAN_BE32 && MMU select HAVE_ARCH_MMAP_RND_BITS if MMU diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index cb03e93f03cf..de93620870af 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -85,6 +85,7 @@ config ARM64 select HAVE_ALIGNED_STRUCT_PAGE if SLUB select HAVE_ARCH_AUDITSYSCALL select HAVE_ARCH_BITREVERSE + select HAVE_ARCH_FREE_INITRD_MEM select HAVE_ARCH_HUGE_VMAP select HAVE_ARCH_JUMP_LABEL select HAVE_ARCH_KASAN if !(ARM64_16K_PAGES && ARM64_VA_BITS_48) diff --git a/arch/blackfin/Kconfig b/arch/blackfin/Kconfig index d9c2866ba618..6c6dae9fe894 100644 --- a/arch/blackfin/Kconfig +++ b/arch/blackfin/Kconfig @@ -15,6 +15,7 @@ config BLACKFIN def_bool y select HAVE_ARCH_KGDB select HAVE_ARCH_TRACEHOOK + select HAVE_ARCH_FREE_INITRD_MEM select HAVE_DYNAMIC_FTRACE select HAVE_FTRACE_MCOUNT_RECORD select HAVE_FUNCTION_GRAPH_TRACER diff --git a/arch/c6x/mm/init.c b/arch/c6x/mm/init.c index 4cc72b0d1c1d..a11cb657182a 100644 --- a/arch/c6x/mm/init.c +++ b/arch/c6x/mm/init.c @@ -66,13 +66,6 @@ void __init mem_init(void) mem_init_print_info(NULL); } -#ifdef CONFIG_BLK_DEV_INITRD -void __init free_initrd_mem(unsigned long start, unsigned long end) -{ - free_reserved_area((void *)start, (void *)end, -1, "initrd"); -} -#endif - void __init free_initmem(void) { free_initmem_default(-1); diff --git a/arch/cris/Kconfig b/arch/cris/Kconfig index cd5a0865c97f..5425f77e5664 100644 --- a/arch/cris/Kconfig +++ b/arch/cris/Kconfig @@ -76,6 +76,7 @@ config CRIS select HAVE_DEBUG_BUGVERBOSE if ETRAX_ARCH_V32 select HAVE_NMI select DMA_DIRECT_OPS if PCI + select HAVE_ARCH_FREE_INITRD_MEM config HZ int diff --git a/arch/frv/mm/init.c b/arch/frv/mm/init.c index cf464100e838..345edc4dc462 100644 --- a/arch/frv/mm/init.c +++ b/arch/frv/mm/init.c @@ -131,14 +131,3 @@ void free_initmem(void) free_initmem_default(-1); #endif } /* end free_initmem() */ - -/*****************************************************************************/ -/* - * free the initial ramdisk memory - */ -#ifdef CONFIG_BLK_DEV_INITRD -void __init free_initrd_mem(unsigned long start, unsigned long end) -{ - free_reserved_area((void *)start, (void *)end, -1, "initrd"); -} /* end free_initrd_mem() */ -#endif diff --git a/arch/h8300/mm/init.c b/arch/h8300/mm/init.c index 015287ac8ce8..37574332b202 100644 --- a/arch/h8300/mm/init.c +++ b/arch/h8300/mm/init.c @@ -102,13 +102,6 @@ void __init mem_init(void) } -#ifdef CONFIG_BLK_DEV_INITRD -void free_initrd_mem(unsigned long start, unsigned long end) -{ - free_reserved_area((void *)start, (void *)end, -1, "initrd"); -} -#endif - void free_initmem(void) { diff --git a/arch/hexagon/Kconfig b/arch/hexagon/Kconfig index 76d2f20d525e..69a16cd2e253 100644 --- a/arch/hexagon/Kconfig +++ b/arch/hexagon/Kconfig @@ -17,6 +17,7 @@ config HEXAGON # GENERIC_ALLOCATOR is used by dma_alloc_coherent() select GENERIC_ALLOCATOR select GENERIC_IRQ_SHOW + select HAVE_ARCH_FREE_INITRD_MEM select HAVE_ARCH_KGDB select HAVE_ARCH_TRACEHOOK select NO_IOPORT_MAP diff --git a/arch/ia64/Kconfig b/arch/ia64/Kconfig index bbe12a038d21..366ef1dd3cd4 100644 --- a/arch/ia64/Kconfig +++ b/arch/ia64/Kconfig @@ -28,6 +28,7 @@ config IA64 select HAVE_DYNAMIC_FTRACE if (!ITANIUM) select HAVE_FUNCTION_TRACER select TTY + select HAVE_ARCH_FREE_INITRD_MEM select HAVE_ARCH_TRACEHOOK select HAVE_DMA_API_DEBUG select HAVE_MEMBLOCK diff --git a/arch/m32r/Kconfig b/arch/m32r/Kconfig index dd84ee194579..9e41bdff45c3 100644 --- a/arch/m32r/Kconfig +++ b/arch/m32r/Kconfig @@ -21,6 +21,7 @@ config M32R select CPU_NO_EFFICIENT_FFS select DMA_DIRECT_OPS select ARCH_NO_COHERENT_DMA_MMAP if !MMU + select HAVE_ARCH_FREE_INITRD_MEM config SBUS bool diff --git a/arch/m32r/mm/init.c b/arch/m32r/mm/init.c index 93abc8c3a46e..e2b5f09209ee 100644 --- a/arch/m32r/mm/init.c +++ b/arch/m32r/mm/init.c @@ -139,14 +139,3 @@ void free_initmem(void) { free_initmem_default(-1); } - -#ifdef CONFIG_BLK_DEV_INITRD -/*======================================================================* - * free_initrd_mem() : - * orig : arch/sh/mm/init.c - *======================================================================*/ -void free_initrd_mem(unsigned long start, unsigned long end) -{ - free_reserved_area((void *)start, (void *)end, -1, "initrd"); -} -#endif diff --git a/arch/m68k/mm/init.c b/arch/m68k/mm/init.c index e85acd131fa8..e20bef09258c 100644 --- a/arch/m68k/mm/init.c +++ b/arch/m68k/mm/init.c @@ -172,10 +172,3 @@ void __init mem_init(void) mem_init_print_info(NULL); print_memmap(); } - -#ifdef CONFIG_BLK_DEV_INITRD -void free_initrd_mem(unsigned long start, unsigned long end) -{ - free_reserved_area((void *)start, (void *)end, -1, "initrd"); -} -#endif diff --git a/arch/metag/Kconfig b/arch/metag/Kconfig index c7b62a339539..5be7f1693b1b 100644 --- a/arch/metag/Kconfig +++ b/arch/metag/Kconfig @@ -7,6 +7,7 @@ config METAG select GENERIC_IRQ_SHOW select GENERIC_SMP_IDLE_THREAD select HAVE_64BIT_ALIGNED_ACCESS + select HAVE_ARCH_FREE_INITRD_MEM select HAVE_ARCH_TRACEHOOK select HAVE_C_RECORDMCOUNT select HAVE_DEBUG_KMEMLEAK diff --git a/arch/microblaze/mm/init.c b/arch/microblaze/mm/init.c index df6de7ccdc2e..ea058dfda222 100644 --- a/arch/microblaze/mm/init.c +++ b/arch/microblaze/mm/init.c @@ -187,13 +187,6 @@ void __init setup_memory(void) paging_init(); } -#ifdef CONFIG_BLK_DEV_INITRD -void free_initrd_mem(unsigned long start, unsigned long end) -{ - free_reserved_area((void *)start, (void *)end, -1, "initrd"); -} -#endif - void free_initmem(void) { free_initmem_default(-1); diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index 8128c3b68d6b..c033cd1e0c52 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig @@ -27,6 +27,7 @@ config MIPS select GENERIC_SMP_IDLE_THREAD select GENERIC_TIME_VSYSCALL select HANDLE_DOMAIN_IRQ + select HAVE_ARCH_FREE_INITRD_MEM select HAVE_ARCH_JUMP_LABEL select HAVE_ARCH_KGDB select HAVE_ARCH_MMAP_RND_BITS if MMU diff --git a/arch/mn10300/Kconfig b/arch/mn10300/Kconfig index e9d8d60bd28b..5aa4f1aa309f 100644 --- a/arch/mn10300/Kconfig +++ b/arch/mn10300/Kconfig @@ -6,6 +6,7 @@ config MN10300 select HAVE_UID16 select GENERIC_IRQ_SHOW select ARCH_WANT_IPC_PARSE_VERSION + select HAVE_ARCH_FREE_INITRD_MEM select HAVE_ARCH_TRACEHOOK select HAVE_ARCH_KGDB select GENERIC_ATOMIC64 diff --git a/arch/nios2/mm/init.c b/arch/nios2/mm/init.c index c92fe4234009..3df75ff8c768 100644 --- a/arch/nios2/mm/init.c +++ b/arch/nios2/mm/init.c @@ -82,13 +82,6 @@ void __init mmu_init(void) flush_tlb_all(); } -#ifdef CONFIG_BLK_DEV_INITRD -void __init free_initrd_mem(unsigned long start, unsigned long end) -{ - free_reserved_area((void *)start, (void *)end, -1, "initrd"); -} -#endif - void __ref free_initmem(void) { free_initmem_default(-1); diff --git a/arch/openrisc/mm/init.c b/arch/openrisc/mm/init.c index 6972d5d6f23f..c1a3dcf9ad40 100644 --- a/arch/openrisc/mm/init.c +++ b/arch/openrisc/mm/init.c @@ -222,13 +222,6 @@ void __init mem_init(void) return; } -#ifdef CONFIG_BLK_DEV_INITRD -void free_initrd_mem(unsigned long start, unsigned long end) -{ - free_reserved_area((void *)start, (void *)end, -1, "initrd"); -} -#endif - void free_initmem(void) { free_initmem_default(-1); diff --git a/arch/parisc/mm/init.c b/arch/parisc/mm/init.c index cab32ee824d2..3643399230f3 100644 --- a/arch/parisc/mm/init.c +++ b/arch/parisc/mm/init.c @@ -932,10 +932,3 @@ void flush_tlb_all(void) spin_unlock(&sid_lock); } #endif - -#ifdef CONFIG_BLK_DEV_INITRD -void free_initrd_mem(unsigned long start, unsigned long end) -{ - free_reserved_area((void *)start, (void *)end, -1, "initrd"); -} -#endif diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c index fe8c61149fb8..e85b2a3cd264 100644 --- a/arch/powerpc/mm/mem.c +++ b/arch/powerpc/mm/mem.c @@ -404,13 +404,6 @@ void free_initmem(void) free_initmem_default(POISON_FREE_INITMEM); } -#ifdef CONFIG_BLK_DEV_INITRD -void __init free_initrd_mem(unsigned long start, unsigned long end) -{ - free_reserved_area((void *)start, (void *)end, -1, "initrd"); -} -#endif - /* * This is called when a page has been modified by the kernel. * It just marks the page as not i-cache clean. We do the i-cache diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c index c77df8142be2..36f83fe8a726 100644 --- a/arch/riscv/mm/init.c +++ b/arch/riscv/mm/init.c @@ -62,9 +62,3 @@ void free_initmem(void) { free_initmem_default(0); } - -#ifdef CONFIG_BLK_DEV_INITRD -void free_initrd_mem(unsigned long start, unsigned long end) -{ -} -#endif /* CONFIG_BLK_DEV_INITRD */ diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig index eaee7087886f..94a9879f1ea8 100644 --- a/arch/s390/Kconfig +++ b/arch/s390/Kconfig @@ -125,6 +125,7 @@ config S390 select GENERIC_TIME_VSYSCALL select HAVE_ALIGNED_STRUCT_PAGE if SLUB select HAVE_ARCH_AUDITSYSCALL + select HAVE_ARCH_FREE_INITRD_MEM select HAVE_ARCH_JUMP_LABEL select CPU_NO_EFFICIENT_FFS if !HAVE_MARCH_Z9_109_FEATURES select HAVE_ARCH_SECCOMP_FILTER diff --git a/arch/score/Kconfig b/arch/score/Kconfig index d881f99c9ddd..2beff03b2429 100644 --- a/arch/score/Kconfig +++ b/arch/score/Kconfig @@ -16,6 +16,7 @@ config SCORE select MODULES_USE_ELF_REL select CLONE_BACKWARDS select CPU_NO_EFFICIENT_FFS + select HAVE_ARCH_FREE_INITRD_MEM choice prompt "System type" diff --git a/arch/sh/mm/init.c b/arch/sh/mm/init.c index ce0bbaa7e404..7451459d0725 100644 --- a/arch/sh/mm/init.c +++ b/arch/sh/mm/init.c @@ -477,13 +477,6 @@ void free_initmem(void) free_initmem_default(-1); } -#ifdef CONFIG_BLK_DEV_INITRD -void free_initrd_mem(unsigned long start, unsigned long end) -{ - free_reserved_area((void *)start, (void *)end, -1, "initrd"); -} -#endif - #ifdef CONFIG_MEMORY_HOTPLUG int arch_add_memory(int nid, u64 start, u64 size, struct vmem_altmap *altmap, bool want_memblock) diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig index 8767e45f1b2b..06d543e35caf 100644 --- a/arch/sparc/Kconfig +++ b/arch/sparc/Kconfig @@ -18,6 +18,7 @@ config SPARC select OF_PROMTREE select HAVE_IDE select HAVE_OPROFILE + select HAVE_ARCH_FREE_INITRD_MEM select HAVE_ARCH_KGDB if !SMP || SPARC64 select HAVE_ARCH_TRACEHOOK select HAVE_EXIT_THREAD diff --git a/arch/tile/Kconfig b/arch/tile/Kconfig index ef9d403cbbe4..7fb36c15762c 100644 --- a/arch/tile/Kconfig +++ b/arch/tile/Kconfig @@ -16,6 +16,7 @@ config TILE select GENERIC_PENDING_IRQ if SMP select GENERIC_STRNCPY_FROM_USER select GENERIC_STRNLEN_USER + select HAVE_ARCH_FREE_INITRD_MEM select HAVE_ARCH_SECCOMP_FILTER select HAVE_ARCH_TRACEHOOK select HAVE_CONTEXT_TRACKING diff --git a/arch/um/kernel/mem.c b/arch/um/kernel/mem.c index 3c0e470ea646..2d26eec92126 100644 --- a/arch/um/kernel/mem.c +++ b/arch/um/kernel/mem.c @@ -170,13 +170,6 @@ void free_initmem(void) { } -#ifdef CONFIG_BLK_DEV_INITRD -void free_initrd_mem(unsigned long start, unsigned long end) -{ - free_reserved_area((void *)start, (void *)end, -1, "initrd"); -} -#endif - /* Allocate and free page tables. */ pgd_t *pgd_alloc(struct mm_struct *mm) diff --git a/arch/unicore32/Kconfig b/arch/unicore32/Kconfig index 462e59a7ae78..4da24cf467de 100644 --- a/arch/unicore32/Kconfig +++ b/arch/unicore32/Kconfig @@ -4,6 +4,7 @@ config UNICORE32 select ARCH_HAS_DEVMEM_IS_ALLOWED select ARCH_MIGHT_HAVE_PC_PARPORT select ARCH_MIGHT_HAVE_PC_SERIO + select HAVE_ARCH_FREE_INITRD_MEM select HAVE_MEMBLOCK select HAVE_GENERIC_DMA_COHERENT select HAVE_KERNEL_GZIP diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 0fa71a78ec99..51ce64e6d848 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -111,6 +111,7 @@ config X86 select HAVE_ALIGNED_STRUCT_PAGE if SLUB select HAVE_ARCH_AUDITSYSCALL select HAVE_ARCH_HUGE_VMAP if X86_64 || X86_PAE + select HAVE_ARCH_FREE_INITRD_MEM select HAVE_ARCH_JUMP_LABEL select HAVE_ARCH_KASAN if X86_64 select HAVE_ARCH_KGDB diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig index c921e8bccdc8..01a4a0e42118 100644 --- a/arch/xtensa/Kconfig +++ b/arch/xtensa/Kconfig @@ -16,6 +16,7 @@ config XTENSA select GENERIC_PCI_IOMAP select GENERIC_SCHED_CLOCK select GENERIC_STRNCPY_FROM_USER if KASAN + select HAVE_ARCH_FREE_INITRD_MEM select HAVE_ARCH_KASAN if MMU select HAVE_CC_STACKPROTECTOR select HAVE_DEBUG_KMEMLEAK diff --git a/init/initramfs.c b/init/initramfs.c index 7e99a0038942..d319058eb464 100644 --- a/init/initramfs.c +++ b/init/initramfs.c @@ -526,6 +526,13 @@ extern unsigned long __initramfs_size; #include <linux/initrd.h> #include <linux/kexec.h> +#ifndef CONFIG_HAVE_ARCH_FREE_INITRD_MEM +void __init free_initrd_mem(unsigned long start, unsigned long end) +{ + free_reserved_area((void *)start, (void *)end, -1, "initrd"); +} +#endif + static void __init free_initrd(void) { #ifdef CONFIG_KEXEC_CORE diff --git a/usr/Kconfig b/usr/Kconfig index 43658b8a975e..7a94f6df39bf 100644 --- a/usr/Kconfig +++ b/usr/Kconfig @@ -233,3 +233,7 @@ config INITRAMFS_COMPRESSION default ".lzma" if RD_LZMA default ".bz2" if RD_BZIP2 default "" + +config HAVE_ARCH_FREE_INITRD_MEM + bool + default n
Now only those architectures that have custom initrd free requirements need to define free_initrd_mem. Signed-off-by: Shea Levy <shea@shealevy.com> --- arch/alpha/mm/init.c | 8 -------- arch/arc/mm/init.c | 7 ------- arch/arm/Kconfig | 1 + arch/arm64/Kconfig | 1 + arch/blackfin/Kconfig | 1 + arch/c6x/mm/init.c | 7 ------- arch/cris/Kconfig | 1 + arch/frv/mm/init.c | 11 ----------- arch/h8300/mm/init.c | 7 ------- arch/hexagon/Kconfig | 1 + arch/ia64/Kconfig | 1 + arch/m32r/Kconfig | 1 + arch/m32r/mm/init.c | 11 ----------- arch/m68k/mm/init.c | 7 ------- arch/metag/Kconfig | 1 + arch/microblaze/mm/init.c | 7 ------- arch/mips/Kconfig | 1 + arch/mn10300/Kconfig | 1 + arch/nios2/mm/init.c | 7 ------- arch/openrisc/mm/init.c | 7 ------- arch/parisc/mm/init.c | 7 ------- arch/powerpc/mm/mem.c | 7 ------- arch/riscv/mm/init.c | 6 ------ arch/s390/Kconfig | 1 + arch/score/Kconfig | 1 + arch/sh/mm/init.c | 7 ------- arch/sparc/Kconfig | 1 + arch/tile/Kconfig | 1 + arch/um/kernel/mem.c | 7 ------- arch/unicore32/Kconfig | 1 + arch/x86/Kconfig | 1 + arch/xtensa/Kconfig | 1 + init/initramfs.c | 7 +++++++ usr/Kconfig | 4 ++++ 34 files changed, 28 insertions(+), 113 deletions(-)