Message ID | 20180311123815.17916-2-ard.biesheuvel@linaro.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Sun, Mar 11, 2018 at 5:38 AM, Ard Biesheuvel <ard.biesheuvel@linaro.org> wrote: > Before updating certain subsystems to use place relative 32-bit > relocations in special sections, to save space and reduce the > number of absolute relocations that need to be processed at runtime > by relocatable kernels, introduce the Kconfig symbol and define it > for some architectures that should be able to support and benefit > from it. Are there actually architectures hat _don't_ support those relative 32-bit relocations? That really feels pretty fundamental. I would have expected all of them to do it - is your selection of arm64/powerpc/x86 perhaps more about "I have tested these" than about anything else? Because I'd almost prefer to just do the switch-over unconditionally if that is at all possible? Linus
On 11 March 2018 at 20:20, Linus Torvalds <torvalds@linux-foundation.org> wrote: > On Sun, Mar 11, 2018 at 5:38 AM, Ard Biesheuvel > <ard.biesheuvel@linaro.org> wrote: >> Before updating certain subsystems to use place relative 32-bit >> relocations in special sections, to save space and reduce the >> number of absolute relocations that need to be processed at runtime >> by relocatable kernels, introduce the Kconfig symbol and define it >> for some architectures that should be able to support and benefit >> from it. > > Are there actually architectures hat _don't_ support those relative > 32-bit relocations? That really feels pretty fundamental. > I started out doing all of them, and I don't remember the exact list, but there are quite a few architectures that don't support these relocations in their module loaders, and in fact, not even ARM does (as one of the 'big' architectures). This is not really surprising, given that the C compiler never emits such relative references. > I would have expected all of them to do it - is your selection of > arm64/powerpc/x86 perhaps more about "I have tested these" than about > anything else? > > Because I'd almost prefer to just do the switch-over unconditionally > if that is at all possible? > arm64, powerpc and x86 implement CONFIG_RELOCATABLE, and so they benefit more than other architectures, because of the fact that the relocation metadata for these data structures can be dropped entirely. Other 64-bit architectures only have the 50% size reduction benefit, and 32-bit architectures have no benefit at all. I'm sure all of these architectures define some kind of 32-bit place relative relocation in their ELF psABI, and I see how it would be cleaner to change everything at once, but I anticipate a long tail of issues with toolchains for niche architectures that I have no way to test.
On Sun, Mar 11, 2018 at 1:35 PM, Ard Biesheuvel <ard.biesheuvel@linaro.org> wrote: > > I'm sure all of these architectures define some kind of 32-bit place > relative relocation in their ELF psABI, and I see how it would be > cleaner to change everything at once, but I anticipate a long tail of > issues with toolchains for niche architectures that I have no way to > test. Ok, fair enough. Linus
diff --git a/arch/Kconfig b/arch/Kconfig index 76c0b54443b1..4e624f75823a 100644 --- a/arch/Kconfig +++ b/arch/Kconfig @@ -975,4 +975,14 @@ config REFCOUNT_FULL against various use-after-free conditions that can be used in security flaw exploits. +config HAVE_ARCH_PREL32_RELOCATIONS + bool + help + May be selected by an architecture if it supports place-relative + 32-bit relocations, both in the toolchain and in the module loader, + in which case relative references can be used in special sections + for PCI fixup, initcalls etc which are only half the size on 64 bit + architectures, and don't require runtime relocation on relocatable + kernels. + source "kernel/gcov/Kconfig" diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index 7381eeb7ef8e..7c543667703e 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -91,6 +91,7 @@ config ARM64 select HAVE_ARCH_KGDB select HAVE_ARCH_MMAP_RND_BITS select HAVE_ARCH_MMAP_RND_COMPAT_BITS if COMPAT + select HAVE_ARCH_PREL32_RELOCATIONS select HAVE_ARCH_SECCOMP_FILTER select HAVE_ARCH_THREAD_STRUCT_WHITELIST select HAVE_ARCH_TRACEHOOK diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index 73ce5dd07642..21d5ad1608d8 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig @@ -181,6 +181,7 @@ config PPC select HAVE_ARCH_KGDB select HAVE_ARCH_MMAP_RND_BITS select HAVE_ARCH_MMAP_RND_COMPAT_BITS if COMPAT + select HAVE_ARCH_PREL32_RELOCATIONS select HAVE_ARCH_SECCOMP_FILTER select HAVE_ARCH_TRACEHOOK select HAVE_CBPF_JIT if !PPC64 diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index c1236b187824..1c6e2ddd2fdc 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -117,6 +117,7 @@ config X86 select HAVE_ARCH_MMAP_RND_BITS if MMU select HAVE_ARCH_MMAP_RND_COMPAT_BITS if MMU && COMPAT select HAVE_ARCH_COMPAT_MMAP_BASES if MMU && COMPAT + select HAVE_ARCH_PREL32_RELOCATIONS select HAVE_ARCH_SECCOMP_FILTER select HAVE_ARCH_THREAD_STRUCT_WHITELIST select HAVE_ARCH_TRACEHOOK
Before updating certain subsystems to use place relative 32-bit relocations in special sections, to save space and reduce the number of absolute relocations that need to be processed at runtime by relocatable kernels, introduce the Kconfig symbol and define it for some architectures that should be able to support and benefit from it. Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: Will Deacon <will.deacon@arm.com> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Michael Ellerman <mpe@ellerman.id.au> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Ingo Molnar <mingo@redhat.com> Cc: x86@kernel.org Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> --- arch/Kconfig | 10 ++++++++++ arch/arm64/Kconfig | 1 + arch/powerpc/Kconfig | 1 + arch/x86/Kconfig | 1 + 4 files changed, 13 insertions(+)