* [PATCH v2 0/6] add support for relative references in special sections
@ 2017-08-18 11:26 Ard Biesheuvel
2017-08-18 11:26 ` Ard Biesheuvel
` (6 more replies)
0 siblings, 7 replies; 24+ messages in thread
From: Ard Biesheuvel @ 2017-08-18 11:26 UTC (permalink / raw)
To: linux-kernel, linux-arch
Cc: Ard Biesheuvel, H. Peter Anvin, Arnd Bergmann, Heiko Carstens,
Kees Cook, Will Deacon, Michael Ellerman, Thomas Garnier,
Thomas Gleixner, Serge E. Hallyn, Bjorn Helgaas,
Benjamin Herrenschmidt, Paul Mackerras, Catalin Marinas,
Petr Mladek, Ingo Molnar, James Morris, Andrew Morton,
Joe Perches, Nicolas Pitre, Steve
This adds support for emitting special sections such as initcall arrays,
PCI fixups and tracepoints as relative references rather than absolute
references. This reduces the size by 50% on 64-bit architectures, but
more importantly, it removes the need for carrying relocation metadata
for these sections in relocatables kernels (e.g., for KASLR) that need
to fix up these absolute references at boot time. On arm64, this reduces
the vmlinux footprint of such a reference by 8x (8 byte absolute reference
+ 24 byte RELA entry vs 4 byte relative reference)
Patch #2 was sent out before as a single patch. This series supersedes
the previous submission. This version makes relative ksymtab entries
dependent on the new Kconfig symbol HAVE_ARCH_PREL32_RELOCATIONS rather
than trying to infer from kbuild test robot replies for which architectures
it should be blacklisted.
Patch #1 introduces the new Kconfig symbol HAVE_ARCH_PREL32_RELOCATIONS,
and sets it for the main architectures that are expected to benefit the
most from this feature, i.e., 64-bit architectures, and ones that use
runtime relocation.
Patch #3 fixes several instances where the trailing semicolon is missing
from an initcall() definition. (Needed for patch #4)
Patches #4 - #6 implement relative references for initcallls, PCI fixups
and tracepoints, respectively, all of which produce sections with order
~1000 entries on an arm64 defconfig kernel with tracing enabled. This
means we save about 28 KB of vmlinux space for each of these patches.
For the arm64 kernel, all patches combined reduce the size of vmlinux
by about 300 KB (with KASLR enabled).
Changes since v1:
- Remove checkpatch errors to the extent feasible: in some cases, this
involves moving extern declarations into C files, and switching to
struct definitions rather than typedefs. Some errors are impossible
to fix: please find the remaining ones after the diffstat.
- Used 'int' instead if 'signed int' for the various offset fields: there
is no ambiguity between architectures regarding its signedness (unlike
'char')
- Refactor the different patches to be more uniform in the way they define
the section entry type and accessors in the .h file, and avoid the need to
add #ifdefs to the C code.
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
Cc: Kees Cook <keescook@chromium.org>
Cc: Will Deacon <will.deacon@arm.com>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: Thomas Garnier <thgarnie@google.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: "Serge E. Hallyn" <serge@hallyn.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Petr Mladek <pmladek@suse.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: James Morris <james.l.morris@oracle.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Joe Perches <joe@perches.com>
Cc: Nicolas Pitre <nico@linaro.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Andy Whitcroft <apw@canonical.com>
Cc: Jessica Yu <jeyu@kernel.org>
Ard Biesheuvel (6):
arch: enable relative relocations for arm64, power, x86, s390 and x86
module: use relative references for __ksymtab entries
treewide: add missing trailing semicolons to initcall() invocations
init: allow initcall tables to be emitted using relative references
drivers: pci: add support for relative addressing in quirk tables
kernel: tracepoints: add support for relative references
arch/Kconfig | 10 +++
arch/arm64/Kconfig | 1 +
arch/arm64/kernel/perf_event.c | 2 +-
arch/arm64/kernel/vmlinux.lds.S | 2 +-
arch/powerpc/Kconfig | 1 +
arch/s390/Kconfig | 1 +
arch/s390/hypfs/inode.c | 2 +-
arch/x86/Kconfig | 1 +
arch/x86/events/intel/core.c | 2 +-
arch/x86/include/asm/Kbuild | 1 +
arch/x86/include/asm/export.h | 4 --
drivers/net/cris/eth_v10.c | 2 +-
drivers/net/dsa/dsa_loop_bdinfo.c | 2 +-
drivers/parport/procfs.c | 4 +-
drivers/pci/quirks.c | 6 +-
drivers/perf/arm_pmu_acpi.c | 2 +-
drivers/platform/x86/intel_turbo_max_3.c | 2 +-
fs/hugetlbfs/inode.c | 2 +-
include/asm-generic/export.h | 12 +++-
include/linux/compiler.h | 11 ++++
include/linux/export.h | 68 ++++++++++++++++----
include/linux/init.h | 64 ++++++++++++++----
include/linux/pci.h | 32 +++++++++
include/linux/tracepoint.h | 42 ++++++++++--
init/main.c | 22 ++-----
kernel/module.c | 14 ++--
kernel/printk/printk.c | 4 +-
kernel/tracepoint.c | 7 +-
mm/compaction.c | 2 +-
mm/oom_kill.c | 2 +-
mm/page_alloc.c | 2 +-
mm/page_owner.c | 2 +-
net/core/lwt_bpf.c | 2 +-
net/sched/sch_blackhole.c | 2 +-
security/security.c | 6 +-
sound/core/seq_device.c | 4 +-
36 files changed, 256 insertions(+), 89 deletions(-)
delete mode 100644 arch/x86/include/asm/export.h
The following checkpatch errors cannot be fixed without breaking the
code, because inline asm at file scope cannot use parens or do-while
loops:
ERROR: Macros with complex values should be enclosed in parentheses
#201: FILE: include/linux/export.h:64:
+#define __KSYMTAB_ENTRY(sym, sec) \
+ __ADDRESSABLE(sym) \
+ asm(" .section \"___ksymtab" sec "+" #sym "\", \"a\"\n" \
+ " .balign 8\n" \
+ VMLINUX_SYMBOL_STR(__ksymtab_##sym) ":\n" \
+ " .long " VMLINUX_SYMBOL_STR(sym) "- .\n" \
+ " .long " VMLINUX_SYMBOL_STR(__kstrtab_##sym) "- .\n" \
+ " .previous\n")
ERROR: Macros with multiple statements should be enclosed in a do - while loop
#284: FILE: include/linux/init.h:162:
+#define ___define_initcall(fn, id, __sec) \
+ __ADDRESSABLE(fn) \
+ asm(".section \"" #__sec ".init\", \"a\"\n" \
+ "__initcall_" #fn #id ":\n" \
+ ".long " VMLINUX_SYMBOL_STR(fn) " - .\n" \
+ ".previous\n");
ERROR: Macros with complex values should be enclosed in parentheses
#375: FILE: include/linux/pci.h:1757:
+#define __DECLARE_PCI_FIXUP_SECTION(sec, name, vendor, device, class, \
+ class_shift, hook) \
+ __ADDRESSABLE(hook) \
+ asm(".section " #sec ", \"a\"\n" \
+ ".balign 16\n" \
+ ".short " #vendor ", " #device "\n" \
+ ".long " #class ", " #class_shift "\n" \
+ ".long " VMLINUX_SYMBOL_STR(hook) " - .\n" \
+ ".previous\n")
The following errors:
ERROR: space required after that ',' (ctx:VxO)
#446: FILE: include/linux/init.h:250:
+#define console_initcall(fn) ___define_initcall(fn,, .con_initcall)
^
ERROR: space required after that ',' (ctx:VxO)
#447: FILE: include/linux/init.h:251:
+#define security_initcall(fn) ___define_initcall(fn,, .security_initcall)
^
cannot be fixed because attempting so results in:
ERROR: space prohibited before that ',' (ctx:WxW)
#349: FILE: include/linux/init.h:250:
+#define console_initcall(fn) ___define_initcall(fn, , .con_initcall)
^
ERROR: space prohibited before that ',' (ctx:WxW)
#350: FILE: include/linux/init.h:251:
+#define security_initcall(fn) ___define_initcall(fn, , .security_initcall)
^
^ permalink raw reply [flat|nested] 24+ messages in thread
* [PATCH v2 0/6] add support for relative references in special sections
2017-08-18 11:26 [PATCH v2 0/6] add support for relative references in special sections Ard Biesheuvel
@ 2017-08-18 11:26 ` Ard Biesheuvel
2017-08-18 11:26 ` [PATCH v2 1/6] arch: enable relative relocations for arm64, power, x86, s390 and x86 Ard Biesheuvel
` (5 subsequent siblings)
6 siblings, 0 replies; 24+ messages in thread
From: Ard Biesheuvel @ 2017-08-18 11:26 UTC (permalink / raw)
To: linux-kernel, linux-arch
Cc: Ard Biesheuvel, H. Peter Anvin, Arnd Bergmann, Heiko Carstens,
Kees Cook, Will Deacon, Michael Ellerman, Thomas Garnier,
Thomas Gleixner, Serge E. Hallyn, Bjorn Helgaas,
Benjamin Herrenschmidt, Paul Mackerras, Catalin Marinas,
Petr Mladek, Ingo Molnar, James Morris, Andrew Morton,
Joe Perches, Nicolas Pitre, Steven Rostedt, Martin Schwidefsky,
Sergey Senozhatsky, Linus Torvalds, Andy Whitcroft, Jessica Yu
This adds support for emitting special sections such as initcall arrays,
PCI fixups and tracepoints as relative references rather than absolute
references. This reduces the size by 50% on 64-bit architectures, but
more importantly, it removes the need for carrying relocation metadata
for these sections in relocatables kernels (e.g., for KASLR) that need
to fix up these absolute references at boot time. On arm64, this reduces
the vmlinux footprint of such a reference by 8x (8 byte absolute reference
+ 24 byte RELA entry vs 4 byte relative reference)
Patch #2 was sent out before as a single patch. This series supersedes
the previous submission. This version makes relative ksymtab entries
dependent on the new Kconfig symbol HAVE_ARCH_PREL32_RELOCATIONS rather
than trying to infer from kbuild test robot replies for which architectures
it should be blacklisted.
Patch #1 introduces the new Kconfig symbol HAVE_ARCH_PREL32_RELOCATIONS,
and sets it for the main architectures that are expected to benefit the
most from this feature, i.e., 64-bit architectures, and ones that use
runtime relocation.
Patch #3 fixes several instances where the trailing semicolon is missing
from an initcall() definition. (Needed for patch #4)
Patches #4 - #6 implement relative references for initcallls, PCI fixups
and tracepoints, respectively, all of which produce sections with order
~1000 entries on an arm64 defconfig kernel with tracing enabled. This
means we save about 28 KB of vmlinux space for each of these patches.
For the arm64 kernel, all patches combined reduce the size of vmlinux
by about 300 KB (with KASLR enabled).
Changes since v1:
- Remove checkpatch errors to the extent feasible: in some cases, this
involves moving extern declarations into C files, and switching to
struct definitions rather than typedefs. Some errors are impossible
to fix: please find the remaining ones after the diffstat.
- Used 'int' instead if 'signed int' for the various offset fields: there
is no ambiguity between architectures regarding its signedness (unlike
'char')
- Refactor the different patches to be more uniform in the way they define
the section entry type and accessors in the .h file, and avoid the need to
add #ifdefs to the C code.
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
Cc: Kees Cook <keescook@chromium.org>
Cc: Will Deacon <will.deacon@arm.com>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: Thomas Garnier <thgarnie@google.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: "Serge E. Hallyn" <serge@hallyn.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Petr Mladek <pmladek@suse.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: James Morris <james.l.morris@oracle.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Joe Perches <joe@perches.com>
Cc: Nicolas Pitre <nico@linaro.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Andy Whitcroft <apw@canonical.com>
Cc: Jessica Yu <jeyu@kernel.org>
Ard Biesheuvel (6):
arch: enable relative relocations for arm64, power, x86, s390 and x86
module: use relative references for __ksymtab entries
treewide: add missing trailing semicolons to initcall() invocations
init: allow initcall tables to be emitted using relative references
drivers: pci: add support for relative addressing in quirk tables
kernel: tracepoints: add support for relative references
arch/Kconfig | 10 +++
arch/arm64/Kconfig | 1 +
arch/arm64/kernel/perf_event.c | 2 +-
arch/arm64/kernel/vmlinux.lds.S | 2 +-
arch/powerpc/Kconfig | 1 +
arch/s390/Kconfig | 1 +
arch/s390/hypfs/inode.c | 2 +-
arch/x86/Kconfig | 1 +
arch/x86/events/intel/core.c | 2 +-
arch/x86/include/asm/Kbuild | 1 +
arch/x86/include/asm/export.h | 4 --
drivers/net/cris/eth_v10.c | 2 +-
drivers/net/dsa/dsa_loop_bdinfo.c | 2 +-
drivers/parport/procfs.c | 4 +-
drivers/pci/quirks.c | 6 +-
drivers/perf/arm_pmu_acpi.c | 2 +-
drivers/platform/x86/intel_turbo_max_3.c | 2 +-
fs/hugetlbfs/inode.c | 2 +-
include/asm-generic/export.h | 12 +++-
include/linux/compiler.h | 11 ++++
include/linux/export.h | 68 ++++++++++++++++----
include/linux/init.h | 64 ++++++++++++++----
include/linux/pci.h | 32 +++++++++
include/linux/tracepoint.h | 42 ++++++++++--
init/main.c | 22 ++-----
kernel/module.c | 14 ++--
kernel/printk/printk.c | 4 +-
kernel/tracepoint.c | 7 +-
mm/compaction.c | 2 +-
mm/oom_kill.c | 2 +-
mm/page_alloc.c | 2 +-
mm/page_owner.c | 2 +-
net/core/lwt_bpf.c | 2 +-
net/sched/sch_blackhole.c | 2 +-
security/security.c | 6 +-
sound/core/seq_device.c | 4 +-
36 files changed, 256 insertions(+), 89 deletions(-)
delete mode 100644 arch/x86/include/asm/export.h
The following checkpatch errors cannot be fixed without breaking the
code, because inline asm at file scope cannot use parens or do-while
loops:
ERROR: Macros with complex values should be enclosed in parentheses
#201: FILE: include/linux/export.h:64:
+#define __KSYMTAB_ENTRY(sym, sec) \
+ __ADDRESSABLE(sym) \
+ asm(" .section \"___ksymtab" sec "+" #sym "\", \"a\"\n" \
+ " .balign 8\n" \
+ VMLINUX_SYMBOL_STR(__ksymtab_##sym) ":\n" \
+ " .long " VMLINUX_SYMBOL_STR(sym) "- .\n" \
+ " .long " VMLINUX_SYMBOL_STR(__kstrtab_##sym) "- .\n" \
+ " .previous\n")
ERROR: Macros with multiple statements should be enclosed in a do - while loop
#284: FILE: include/linux/init.h:162:
+#define ___define_initcall(fn, id, __sec) \
+ __ADDRESSABLE(fn) \
+ asm(".section \"" #__sec ".init\", \"a\"\n" \
+ "__initcall_" #fn #id ":\n" \
+ ".long " VMLINUX_SYMBOL_STR(fn) " - .\n" \
+ ".previous\n");
ERROR: Macros with complex values should be enclosed in parentheses
#375: FILE: include/linux/pci.h:1757:
+#define __DECLARE_PCI_FIXUP_SECTION(sec, name, vendor, device, class, \
+ class_shift, hook) \
+ __ADDRESSABLE(hook) \
+ asm(".section " #sec ", \"a\"\n" \
+ ".balign 16\n" \
+ ".short " #vendor ", " #device "\n" \
+ ".long " #class ", " #class_shift "\n" \
+ ".long " VMLINUX_SYMBOL_STR(hook) " - .\n" \
+ ".previous\n")
The following errors:
ERROR: space required after that ',' (ctx:VxO)
#446: FILE: include/linux/init.h:250:
+#define console_initcall(fn) ___define_initcall(fn,, .con_initcall)
^
ERROR: space required after that ',' (ctx:VxO)
#447: FILE: include/linux/init.h:251:
+#define security_initcall(fn) ___define_initcall(fn,, .security_initcall)
^
cannot be fixed because attempting so results in:
ERROR: space prohibited before that ',' (ctx:WxW)
#349: FILE: include/linux/init.h:250:
+#define console_initcall(fn) ___define_initcall(fn, , .con_initcall)
^
ERROR: space prohibited before that ',' (ctx:WxW)
#350: FILE: include/linux/init.h:251:
+#define security_initcall(fn) ___define_initcall(fn, , .security_initcall)
^
^ permalink raw reply [flat|nested] 24+ messages in thread
* [PATCH v2 1/6] arch: enable relative relocations for arm64, power, x86, s390 and x86
2017-08-18 11:26 [PATCH v2 0/6] add support for relative references in special sections Ard Biesheuvel
2017-08-18 11:26 ` Ard Biesheuvel
@ 2017-08-18 11:26 ` Ard Biesheuvel
2017-08-18 11:26 ` Ard Biesheuvel
2017-08-18 11:26 ` [PATCH v2 2/6] module: use relative references for __ksymtab entries Ard Biesheuvel
` (4 subsequent siblings)
6 siblings, 1 reply; 24+ messages in thread
From: Ard Biesheuvel @ 2017-08-18 11:26 UTC (permalink / raw)
To: linux-kernel, linux-arch
Cc: Ard Biesheuvel, H. Peter Anvin, Arnd Bergmann, Heiko Carstens,
Kees Cook, Will Deacon, Michael Ellerman, Thomas Garnier,
Thomas Gleixner, Serge E. Hallyn, Bjorn Helgaas,
Benjamin Herrenschmidt, Paul Mackerras, Catalin Marinas,
Petr Mladek, Ingo Molnar, James Morris, Andrew Morton,
Joe Perches, Nicolas Pitre, Steve
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: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: x86@kernel.org
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
---
arch/Kconfig | 10 ++++++++++
arch/arm64/Kconfig | 1 +
arch/arm64/kernel/vmlinux.lds.S | 2 +-
arch/powerpc/Kconfig | 1 +
arch/s390/Kconfig | 1 +
arch/x86/Kconfig | 1 +
6 files changed, 15 insertions(+), 1 deletion(-)
diff --git a/arch/Kconfig b/arch/Kconfig
index 21d0089117fe..4e77d8e8697e 100644
--- a/arch/Kconfig
+++ b/arch/Kconfig
@@ -940,4 +940,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 dfd908630631..ce05d2d8143e 100644
--- a/arch/arm64/Kconfig
+++ b/arch/arm64/Kconfig
@@ -72,6 +72,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_TRACEHOOK
select HAVE_ARCH_TRANSPARENT_HUGEPAGE
diff --git a/arch/arm64/kernel/vmlinux.lds.S b/arch/arm64/kernel/vmlinux.lds.S
index 987a00ee446c..b6d8e6504896 100644
--- a/arch/arm64/kernel/vmlinux.lds.S
+++ b/arch/arm64/kernel/vmlinux.lds.S
@@ -171,7 +171,7 @@ SECTIONS
CON_INITCALL
SECURITY_INITCALL
INIT_RAM_FS
- *(.init.rodata.* .init.bss) /* from the EFI stub */
+ *(.init.rodata.* .init.bss .init.discard.*) /* EFI stub */
}
.exit.data : {
ARM_EXIT_KEEP(EXIT_DATA)
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
index 36f858c37ca7..f7e60ed5bdd0 100644
--- a/arch/powerpc/Kconfig
+++ b/arch/powerpc/Kconfig
@@ -163,6 +163,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 ARCH_HAS_STRICT_KERNEL_RWX if (PPC_BOOK3S_64 && !RELOCATABLE && !HIBERNATION)
diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig
index 7eeb75d758c1..1206cc7daa0d 100644
--- a/arch/s390/Kconfig
+++ b/arch/s390/Kconfig
@@ -127,6 +127,7 @@ config S390
select HAVE_ARCH_AUDITSYSCALL
select HAVE_ARCH_JUMP_LABEL
select CPU_NO_EFFICIENT_FFS if !HAVE_MARCH_Z9_109_FEATURES
+ select HAVE_ARCH_PREL32_RELOCATIONS
select HAVE_ARCH_SECCOMP_FILTER
select HAVE_ARCH_SOFT_DIRTY
select HAVE_ARCH_TRACEHOOK
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index 781521b7cf9e..77246125883e 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -112,6 +112,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_TRACEHOOK
select HAVE_ARCH_TRANSPARENT_HUGEPAGE
--
2.11.0
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH v2 1/6] arch: enable relative relocations for arm64, power, x86, s390 and x86
2017-08-18 11:26 ` [PATCH v2 1/6] arch: enable relative relocations for arm64, power, x86, s390 and x86 Ard Biesheuvel
@ 2017-08-18 11:26 ` Ard Biesheuvel
0 siblings, 0 replies; 24+ messages in thread
From: Ard Biesheuvel @ 2017-08-18 11:26 UTC (permalink / raw)
To: linux-kernel, linux-arch
Cc: Ard Biesheuvel, H. Peter Anvin, Arnd Bergmann, Heiko Carstens,
Kees Cook, Will Deacon, Michael Ellerman, Thomas Garnier,
Thomas Gleixner, Serge E. Hallyn, Bjorn Helgaas,
Benjamin Herrenschmidt, Paul Mackerras, Catalin Marinas,
Petr Mladek, Ingo Molnar, James Morris, Andrew Morton,
Joe Perches, Nicolas Pitre, Steven Rostedt, Martin Schwidefsky,
Sergey Senozhatsky, Linus Torvalds, Andy Whitcroft, Jessica Yu,
x86
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: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: x86@kernel.org
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
---
arch/Kconfig | 10 ++++++++++
arch/arm64/Kconfig | 1 +
arch/arm64/kernel/vmlinux.lds.S | 2 +-
arch/powerpc/Kconfig | 1 +
arch/s390/Kconfig | 1 +
arch/x86/Kconfig | 1 +
6 files changed, 15 insertions(+), 1 deletion(-)
diff --git a/arch/Kconfig b/arch/Kconfig
index 21d0089117fe..4e77d8e8697e 100644
--- a/arch/Kconfig
+++ b/arch/Kconfig
@@ -940,4 +940,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 dfd908630631..ce05d2d8143e 100644
--- a/arch/arm64/Kconfig
+++ b/arch/arm64/Kconfig
@@ -72,6 +72,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_TRACEHOOK
select HAVE_ARCH_TRANSPARENT_HUGEPAGE
diff --git a/arch/arm64/kernel/vmlinux.lds.S b/arch/arm64/kernel/vmlinux.lds.S
index 987a00ee446c..b6d8e6504896 100644
--- a/arch/arm64/kernel/vmlinux.lds.S
+++ b/arch/arm64/kernel/vmlinux.lds.S
@@ -171,7 +171,7 @@ SECTIONS
CON_INITCALL
SECURITY_INITCALL
INIT_RAM_FS
- *(.init.rodata.* .init.bss) /* from the EFI stub */
+ *(.init.rodata.* .init.bss .init.discard.*) /* EFI stub */
}
.exit.data : {
ARM_EXIT_KEEP(EXIT_DATA)
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
index 36f858c37ca7..f7e60ed5bdd0 100644
--- a/arch/powerpc/Kconfig
+++ b/arch/powerpc/Kconfig
@@ -163,6 +163,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 ARCH_HAS_STRICT_KERNEL_RWX if (PPC_BOOK3S_64 && !RELOCATABLE && !HIBERNATION)
diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig
index 7eeb75d758c1..1206cc7daa0d 100644
--- a/arch/s390/Kconfig
+++ b/arch/s390/Kconfig
@@ -127,6 +127,7 @@ config S390
select HAVE_ARCH_AUDITSYSCALL
select HAVE_ARCH_JUMP_LABEL
select CPU_NO_EFFICIENT_FFS if !HAVE_MARCH_Z9_109_FEATURES
+ select HAVE_ARCH_PREL32_RELOCATIONS
select HAVE_ARCH_SECCOMP_FILTER
select HAVE_ARCH_SOFT_DIRTY
select HAVE_ARCH_TRACEHOOK
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index 781521b7cf9e..77246125883e 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -112,6 +112,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_TRACEHOOK
select HAVE_ARCH_TRANSPARENT_HUGEPAGE
--
2.11.0
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH v2 2/6] module: use relative references for __ksymtab entries
2017-08-18 11:26 [PATCH v2 0/6] add support for relative references in special sections Ard Biesheuvel
2017-08-18 11:26 ` Ard Biesheuvel
2017-08-18 11:26 ` [PATCH v2 1/6] arch: enable relative relocations for arm64, power, x86, s390 and x86 Ard Biesheuvel
@ 2017-08-18 11:26 ` Ard Biesheuvel
2017-08-18 11:26 ` Ard Biesheuvel
2017-08-18 11:26 ` [PATCH v2 3/6] treewide: add missing trailing semicolons to initcall() invocations Ard Biesheuvel
` (3 subsequent siblings)
6 siblings, 1 reply; 24+ messages in thread
From: Ard Biesheuvel @ 2017-08-18 11:26 UTC (permalink / raw)
To: linux-kernel, linux-arch
Cc: Ard Biesheuvel, H. Peter Anvin, Arnd Bergmann, Heiko Carstens,
Kees Cook, Will Deacon, Michael Ellerman, Thomas Garnier,
Thomas Gleixner, Serge E. Hallyn, Bjorn Helgaas,
Benjamin Herrenschmidt, Paul Mackerras, Catalin Marinas,
Petr Mladek, Ingo Molnar, James Morris, Andrew Morton,
Joe Perches, Nicolas Pitre, Steve
An ordinary arm64 defconfig build has ~64 KB worth of __ksymtab
entries, each consisting of two 64-bit fields containing absolute
references, to the symbol itself and to a char array containing
its name, respectively.
When we build the same configuration with KASLR enabled, we end
up with an additional ~192 KB of relocations in the .init section,
i.e., one 24 byte entry for each absolute reference, which all need
to be processed at boot time.
Given how the struct kernel_symbol that describes each entry is
completely local to module.c (except for the references emitted
by EXPORT_SYMBOL() itself), we can easily modify it to contain
two 32-bit relative references instead. This reduces the size of
the __ksymtab section by 50% for all 64-bit architectures, and
gets rid of the runtime relocations entirely for architectures
implementing KASLR, either via standard PIE linking (arm64) or
using custom host tools (x86).
Note that the binary search involving __ksymtab contents relies
on each section being sorted by symbol name. This is implemented
based on the input section names, not the names in the ksymtab
entries, so this patch does not interfere with that.
Given that the use of place-relative relocations requires support
both in the toolchain and in the module loader, we cannot enable
this feature for all architectures. So make it dependend on whether
CONFIG_HAVE_ARCH_PREL32_RELOCATIONS is defined.
Cc: Jessica Yu <jeyu@kernel.org>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Kees Cook <keescook@chromium.org>
Cc: Thomas Garnier <thgarnie@google.com>
Cc: Nicolas Pitre <nico@linaro.org>
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
---
arch/x86/include/asm/Kbuild | 1 +
arch/x86/include/asm/export.h | 4 --
include/asm-generic/export.h | 12 +++-
include/linux/compiler.h | 11 ++++
include/linux/export.h | 68 ++++++++++++++++----
kernel/module.c | 14 ++--
6 files changed, 86 insertions(+), 24 deletions(-)
diff --git a/arch/x86/include/asm/Kbuild b/arch/x86/include/asm/Kbuild
index 5d6a53fd7521..3e8a88dcaa1d 100644
--- a/arch/x86/include/asm/Kbuild
+++ b/arch/x86/include/asm/Kbuild
@@ -9,5 +9,6 @@ generated-y += xen-hypercalls.h
generic-y += clkdev.h
generic-y += dma-contiguous.h
generic-y += early_ioremap.h
+generic-y += export.h
generic-y += mcs_spinlock.h
generic-y += mm-arch-hooks.h
diff --git a/arch/x86/include/asm/export.h b/arch/x86/include/asm/export.h
deleted file mode 100644
index 138de56b13eb..000000000000
--- a/arch/x86/include/asm/export.h
+++ /dev/null
@@ -1,4 +0,0 @@
-#ifdef CONFIG_64BIT
-#define KSYM_ALIGN 16
-#endif
-#include <asm-generic/export.h>
diff --git a/include/asm-generic/export.h b/include/asm-generic/export.h
index 719db1968d81..97ce606459ae 100644
--- a/include/asm-generic/export.h
+++ b/include/asm-generic/export.h
@@ -5,12 +5,10 @@
#define KSYM_FUNC(x) x
#endif
#ifdef CONFIG_64BIT
-#define __put .quad
#ifndef KSYM_ALIGN
#define KSYM_ALIGN 8
#endif
#else
-#define __put .long
#ifndef KSYM_ALIGN
#define KSYM_ALIGN 4
#endif
@@ -25,6 +23,16 @@
#define KSYM(name) name
#endif
+.macro __put, val, name
+#ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
+ .long \val - ., \name - .
+#elif defined(CONFIG_64BIT)
+ .quad \val, \name
+#else
+ .long \val, \name
+#endif
+.endm
+
/*
* note on .section use: @progbits vs %progbits nastiness doesn't matter,
* since we immediately emit into those sections anyway.
diff --git a/include/linux/compiler.h b/include/linux/compiler.h
index eca8ad75e28b..3e0b707664b1 100644
--- a/include/linux/compiler.h
+++ b/include/linux/compiler.h
@@ -590,4 +590,15 @@ static __always_inline void __write_once_size(volatile void *p, void *res, int s
(_________p1); \
})
+/*
+ * Force the compiler to emit 'sym' as a symbol, so that we can reference
+ * it from inline assembler. Necessary in case 'sym' could be inlined
+ * otherwise, or eliminated entirely due to lack of references that are
+ * visibile to the compiler.
+ */
+#define __ADDRESSABLE(sym) \
+ static void *__attribute__((section(".discard.text"))) __used \
+ __PASTE(__discard_##sym, __LINE__)(void) \
+ { return (void *)&sym; } \
+
#endif /* __LINUX_COMPILER_H */
diff --git a/include/linux/export.h b/include/linux/export.h
index 1a1dfdb2a5c6..896883a44be3 100644
--- a/include/linux/export.h
+++ b/include/linux/export.h
@@ -24,12 +24,6 @@
#define VMLINUX_SYMBOL_STR(x) __VMLINUX_SYMBOL_STR(x)
#ifndef __ASSEMBLY__
-struct kernel_symbol
-{
- unsigned long value;
- const char *name;
-};
-
#ifdef MODULE
extern struct module __this_module;
#define THIS_MODULE (&__this_module)
@@ -60,17 +54,67 @@ extern struct module __this_module;
#define __CRC_SYMBOL(sym, sec)
#endif
+#ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
+/*
+ * Emit the ksymtab entry as a pair of relative references: this reduces
+ * the size by half on 64-bit architectures, and eliminates the need for
+ * absolute relocations that require runtime processing on relocatable
+ * kernels.
+ */
+#define __KSYMTAB_ENTRY(sym, sec) \
+ __ADDRESSABLE(sym) \
+ asm(" .section \"___ksymtab" sec "+" #sym "\", \"a\"\n" \
+ " .balign 8\n" \
+ VMLINUX_SYMBOL_STR(__ksymtab_##sym) ":\n" \
+ " .long " VMLINUX_SYMBOL_STR(sym) "- .\n" \
+ " .long " VMLINUX_SYMBOL_STR(__kstrtab_##sym) "- .\n" \
+ " .previous\n")
+
+struct kernel_symbol {
+ int value_offset;
+ int name_offset;
+};
+
+static inline unsigned long kernel_symbol_value(const struct kernel_symbol *sym)
+{
+ return (unsigned long)&sym->value_offset + sym->value_offset;
+}
+
+static inline const char *kernel_symbol_name(const struct kernel_symbol *sym)
+{
+ return (const char *)((unsigned long)&sym->name_offset +
+ sym->name_offset);
+}
+#else
+#define __KSYMTAB_ENTRY(sym, sec) \
+ static const struct kernel_symbol __ksymtab_##sym \
+ __attribute__((section("___ksymtab" sec "+" #sym), used)) \
+ = { (unsigned long)&sym, __kstrtab_##sym }
+
+struct kernel_symbol {
+ unsigned long value;
+ const char *name;
+};
+
+static inline unsigned long kernel_symbol_value(const struct kernel_symbol *sym)
+{
+ return sym->value;
+}
+
+static inline const char *kernel_symbol_name(const struct kernel_symbol *sym)
+{
+ return sym->name;
+}
+#endif
+
/* For every exported symbol, place a struct in the __ksymtab section */
#define ___EXPORT_SYMBOL(sym, sec) \
extern typeof(sym) sym; \
__CRC_SYMBOL(sym, sec) \
- static const char __kstrtab_##sym[] \
- __attribute__((section("__ksymtab_strings"), aligned(1))) \
+ static const char __kstrtab_##sym[] __used __aligned(1) \
+ __attribute__((section("__ksymtab_strings"))) \
= VMLINUX_SYMBOL_STR(sym); \
- static const struct kernel_symbol __ksymtab_##sym \
- __used \
- __attribute__((section("___ksymtab" sec "+" #sym), used)) \
- = { (unsigned long)&sym, __kstrtab_##sym }
+ __KSYMTAB_ENTRY(sym, sec)
#if defined(__KSYM_DEPS__)
diff --git a/kernel/module.c b/kernel/module.c
index 40f983cbea81..904c3634fdd0 100644
--- a/kernel/module.c
+++ b/kernel/module.c
@@ -544,7 +544,7 @@ static int cmp_name(const void *va, const void *vb)
const char *a;
const struct kernel_symbol *b;
a = va; b = vb;
- return strcmp(a, b->name);
+ return strcmp(a, kernel_symbol_name(b));
}
static bool find_symbol_in_section(const struct symsearch *syms,
@@ -2190,7 +2190,7 @@ void *__symbol_get(const char *symbol)
sym = NULL;
preempt_enable();
- return sym ? (void *)sym->value : NULL;
+ return sym ? (void *)kernel_symbol_value(sym) : NULL;
}
EXPORT_SYMBOL_GPL(__symbol_get);
@@ -2220,10 +2220,12 @@ static int verify_export_symbols(struct module *mod)
for (i = 0; i < ARRAY_SIZE(arr); i++) {
for (s = arr[i].sym; s < arr[i].sym + arr[i].num; s++) {
- if (find_symbol(s->name, &owner, NULL, true, false)) {
+ if (find_symbol(kernel_symbol_name(s), &owner, NULL,
+ true, false)) {
pr_err("%s: exports duplicate symbol %s"
" (owned by %s)\n",
- mod->name, s->name, module_name(owner));
+ mod->name, kernel_symbol_name(s),
+ module_name(owner));
return -ENOEXEC;
}
}
@@ -2272,7 +2274,7 @@ static int simplify_symbols(struct module *mod, const struct load_info *info)
ksym = resolve_symbol_wait(mod, info, name);
/* Ok if resolved. */
if (ksym && !IS_ERR(ksym)) {
- sym[i].st_value = ksym->value;
+ sym[i].st_value = kernel_symbol_value(ksym);
break;
}
@@ -2532,7 +2534,7 @@ static int is_exported(const char *name, unsigned long value,
ks = lookup_symbol(name, __start___ksymtab, __stop___ksymtab);
else
ks = lookup_symbol(name, mod->syms, mod->syms + mod->num_syms);
- return ks != NULL && ks->value == value;
+ return ks != NULL && kernel_symbol_value(ks) == value;
}
/* As per nm */
--
2.11.0
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH v2 2/6] module: use relative references for __ksymtab entries
2017-08-18 11:26 ` [PATCH v2 2/6] module: use relative references for __ksymtab entries Ard Biesheuvel
@ 2017-08-18 11:26 ` Ard Biesheuvel
0 siblings, 0 replies; 24+ messages in thread
From: Ard Biesheuvel @ 2017-08-18 11:26 UTC (permalink / raw)
To: linux-kernel, linux-arch
Cc: Ard Biesheuvel, H. Peter Anvin, Arnd Bergmann, Heiko Carstens,
Kees Cook, Will Deacon, Michael Ellerman, Thomas Garnier,
Thomas Gleixner, Serge E. Hallyn, Bjorn Helgaas,
Benjamin Herrenschmidt, Paul Mackerras, Catalin Marinas,
Petr Mladek, Ingo Molnar, James Morris, Andrew Morton,
Joe Perches, Nicolas Pitre, Steven Rostedt, Martin Schwidefsky,
Sergey Senozhatsky, Linus Torvalds, Andy Whitcroft, Jessica Yu,
Ingo Molnar
An ordinary arm64 defconfig build has ~64 KB worth of __ksymtab
entries, each consisting of two 64-bit fields containing absolute
references, to the symbol itself and to a char array containing
its name, respectively.
When we build the same configuration with KASLR enabled, we end
up with an additional ~192 KB of relocations in the .init section,
i.e., one 24 byte entry for each absolute reference, which all need
to be processed at boot time.
Given how the struct kernel_symbol that describes each entry is
completely local to module.c (except for the references emitted
by EXPORT_SYMBOL() itself), we can easily modify it to contain
two 32-bit relative references instead. This reduces the size of
the __ksymtab section by 50% for all 64-bit architectures, and
gets rid of the runtime relocations entirely for architectures
implementing KASLR, either via standard PIE linking (arm64) or
using custom host tools (x86).
Note that the binary search involving __ksymtab contents relies
on each section being sorted by symbol name. This is implemented
based on the input section names, not the names in the ksymtab
entries, so this patch does not interfere with that.
Given that the use of place-relative relocations requires support
both in the toolchain and in the module loader, we cannot enable
this feature for all architectures. So make it dependend on whether
CONFIG_HAVE_ARCH_PREL32_RELOCATIONS is defined.
Cc: Jessica Yu <jeyu@kernel.org>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Kees Cook <keescook@chromium.org>
Cc: Thomas Garnier <thgarnie@google.com>
Cc: Nicolas Pitre <nico@linaro.org>
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
---
arch/x86/include/asm/Kbuild | 1 +
arch/x86/include/asm/export.h | 4 --
include/asm-generic/export.h | 12 +++-
include/linux/compiler.h | 11 ++++
include/linux/export.h | 68 ++++++++++++++++----
kernel/module.c | 14 ++--
6 files changed, 86 insertions(+), 24 deletions(-)
diff --git a/arch/x86/include/asm/Kbuild b/arch/x86/include/asm/Kbuild
index 5d6a53fd7521..3e8a88dcaa1d 100644
--- a/arch/x86/include/asm/Kbuild
+++ b/arch/x86/include/asm/Kbuild
@@ -9,5 +9,6 @@ generated-y += xen-hypercalls.h
generic-y += clkdev.h
generic-y += dma-contiguous.h
generic-y += early_ioremap.h
+generic-y += export.h
generic-y += mcs_spinlock.h
generic-y += mm-arch-hooks.h
diff --git a/arch/x86/include/asm/export.h b/arch/x86/include/asm/export.h
deleted file mode 100644
index 138de56b13eb..000000000000
--- a/arch/x86/include/asm/export.h
+++ /dev/null
@@ -1,4 +0,0 @@
-#ifdef CONFIG_64BIT
-#define KSYM_ALIGN 16
-#endif
-#include <asm-generic/export.h>
diff --git a/include/asm-generic/export.h b/include/asm-generic/export.h
index 719db1968d81..97ce606459ae 100644
--- a/include/asm-generic/export.h
+++ b/include/asm-generic/export.h
@@ -5,12 +5,10 @@
#define KSYM_FUNC(x) x
#endif
#ifdef CONFIG_64BIT
-#define __put .quad
#ifndef KSYM_ALIGN
#define KSYM_ALIGN 8
#endif
#else
-#define __put .long
#ifndef KSYM_ALIGN
#define KSYM_ALIGN 4
#endif
@@ -25,6 +23,16 @@
#define KSYM(name) name
#endif
+.macro __put, val, name
+#ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
+ .long \val - ., \name - .
+#elif defined(CONFIG_64BIT)
+ .quad \val, \name
+#else
+ .long \val, \name
+#endif
+.endm
+
/*
* note on .section use: @progbits vs %progbits nastiness doesn't matter,
* since we immediately emit into those sections anyway.
diff --git a/include/linux/compiler.h b/include/linux/compiler.h
index eca8ad75e28b..3e0b707664b1 100644
--- a/include/linux/compiler.h
+++ b/include/linux/compiler.h
@@ -590,4 +590,15 @@ static __always_inline void __write_once_size(volatile void *p, void *res, int s
(_________p1); \
})
+/*
+ * Force the compiler to emit 'sym' as a symbol, so that we can reference
+ * it from inline assembler. Necessary in case 'sym' could be inlined
+ * otherwise, or eliminated entirely due to lack of references that are
+ * visibile to the compiler.
+ */
+#define __ADDRESSABLE(sym) \
+ static void *__attribute__((section(".discard.text"))) __used \
+ __PASTE(__discard_##sym, __LINE__)(void) \
+ { return (void *)&sym; } \
+
#endif /* __LINUX_COMPILER_H */
diff --git a/include/linux/export.h b/include/linux/export.h
index 1a1dfdb2a5c6..896883a44be3 100644
--- a/include/linux/export.h
+++ b/include/linux/export.h
@@ -24,12 +24,6 @@
#define VMLINUX_SYMBOL_STR(x) __VMLINUX_SYMBOL_STR(x)
#ifndef __ASSEMBLY__
-struct kernel_symbol
-{
- unsigned long value;
- const char *name;
-};
-
#ifdef MODULE
extern struct module __this_module;
#define THIS_MODULE (&__this_module)
@@ -60,17 +54,67 @@ extern struct module __this_module;
#define __CRC_SYMBOL(sym, sec)
#endif
+#ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
+/*
+ * Emit the ksymtab entry as a pair of relative references: this reduces
+ * the size by half on 64-bit architectures, and eliminates the need for
+ * absolute relocations that require runtime processing on relocatable
+ * kernels.
+ */
+#define __KSYMTAB_ENTRY(sym, sec) \
+ __ADDRESSABLE(sym) \
+ asm(" .section \"___ksymtab" sec "+" #sym "\", \"a\"\n" \
+ " .balign 8\n" \
+ VMLINUX_SYMBOL_STR(__ksymtab_##sym) ":\n" \
+ " .long " VMLINUX_SYMBOL_STR(sym) "- .\n" \
+ " .long " VMLINUX_SYMBOL_STR(__kstrtab_##sym) "- .\n" \
+ " .previous\n")
+
+struct kernel_symbol {
+ int value_offset;
+ int name_offset;
+};
+
+static inline unsigned long kernel_symbol_value(const struct kernel_symbol *sym)
+{
+ return (unsigned long)&sym->value_offset + sym->value_offset;
+}
+
+static inline const char *kernel_symbol_name(const struct kernel_symbol *sym)
+{
+ return (const char *)((unsigned long)&sym->name_offset +
+ sym->name_offset);
+}
+#else
+#define __KSYMTAB_ENTRY(sym, sec) \
+ static const struct kernel_symbol __ksymtab_##sym \
+ __attribute__((section("___ksymtab" sec "+" #sym), used)) \
+ = { (unsigned long)&sym, __kstrtab_##sym }
+
+struct kernel_symbol {
+ unsigned long value;
+ const char *name;
+};
+
+static inline unsigned long kernel_symbol_value(const struct kernel_symbol *sym)
+{
+ return sym->value;
+}
+
+static inline const char *kernel_symbol_name(const struct kernel_symbol *sym)
+{
+ return sym->name;
+}
+#endif
+
/* For every exported symbol, place a struct in the __ksymtab section */
#define ___EXPORT_SYMBOL(sym, sec) \
extern typeof(sym) sym; \
__CRC_SYMBOL(sym, sec) \
- static const char __kstrtab_##sym[] \
- __attribute__((section("__ksymtab_strings"), aligned(1))) \
+ static const char __kstrtab_##sym[] __used __aligned(1) \
+ __attribute__((section("__ksymtab_strings"))) \
= VMLINUX_SYMBOL_STR(sym); \
- static const struct kernel_symbol __ksymtab_##sym \
- __used \
- __attribute__((section("___ksymtab" sec "+" #sym), used)) \
- = { (unsigned long)&sym, __kstrtab_##sym }
+ __KSYMTAB_ENTRY(sym, sec)
#if defined(__KSYM_DEPS__)
diff --git a/kernel/module.c b/kernel/module.c
index 40f983cbea81..904c3634fdd0 100644
--- a/kernel/module.c
+++ b/kernel/module.c
@@ -544,7 +544,7 @@ static int cmp_name(const void *va, const void *vb)
const char *a;
const struct kernel_symbol *b;
a = va; b = vb;
- return strcmp(a, b->name);
+ return strcmp(a, kernel_symbol_name(b));
}
static bool find_symbol_in_section(const struct symsearch *syms,
@@ -2190,7 +2190,7 @@ void *__symbol_get(const char *symbol)
sym = NULL;
preempt_enable();
- return sym ? (void *)sym->value : NULL;
+ return sym ? (void *)kernel_symbol_value(sym) : NULL;
}
EXPORT_SYMBOL_GPL(__symbol_get);
@@ -2220,10 +2220,12 @@ static int verify_export_symbols(struct module *mod)
for (i = 0; i < ARRAY_SIZE(arr); i++) {
for (s = arr[i].sym; s < arr[i].sym + arr[i].num; s++) {
- if (find_symbol(s->name, &owner, NULL, true, false)) {
+ if (find_symbol(kernel_symbol_name(s), &owner, NULL,
+ true, false)) {
pr_err("%s: exports duplicate symbol %s"
" (owned by %s)\n",
- mod->name, s->name, module_name(owner));
+ mod->name, kernel_symbol_name(s),
+ module_name(owner));
return -ENOEXEC;
}
}
@@ -2272,7 +2274,7 @@ static int simplify_symbols(struct module *mod, const struct load_info *info)
ksym = resolve_symbol_wait(mod, info, name);
/* Ok if resolved. */
if (ksym && !IS_ERR(ksym)) {
- sym[i].st_value = ksym->value;
+ sym[i].st_value = kernel_symbol_value(ksym);
break;
}
@@ -2532,7 +2534,7 @@ static int is_exported(const char *name, unsigned long value,
ks = lookup_symbol(name, __start___ksymtab, __stop___ksymtab);
else
ks = lookup_symbol(name, mod->syms, mod->syms + mod->num_syms);
- return ks != NULL && ks->value == value;
+ return ks != NULL && kernel_symbol_value(ks) == value;
}
/* As per nm */
--
2.11.0
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH v2 3/6] treewide: add missing trailing semicolons to initcall() invocations
2017-08-18 11:26 [PATCH v2 0/6] add support for relative references in special sections Ard Biesheuvel
` (2 preceding siblings ...)
2017-08-18 11:26 ` [PATCH v2 2/6] module: use relative references for __ksymtab entries Ard Biesheuvel
@ 2017-08-18 11:26 ` Ard Biesheuvel
2017-08-18 11:26 ` Ard Biesheuvel
2017-08-18 11:26 ` [PATCH v2 4/6] init: allow initcall tables to be emitted using relative references Ard Biesheuvel
` (2 subsequent siblings)
6 siblings, 1 reply; 24+ messages in thread
From: Ard Biesheuvel @ 2017-08-18 11:26 UTC (permalink / raw)
To: linux-kernel, linux-arch
Cc: Ard Biesheuvel, H. Peter Anvin, Arnd Bergmann, Heiko Carstens,
Kees Cook, Will Deacon, Michael Ellerman, Thomas Garnier,
Thomas Gleixner, Serge E. Hallyn, Bjorn Helgaas,
Benjamin Herrenschmidt, Paul Mackerras, Catalin Marinas,
Petr Mladek, Ingo Molnar, James Morris, Andrew Morton,
Joe Perches, Nicolas Pitre, Steve
Before modifying the initcall() code to add support for relative
references in the initcall sections, fix the existing code that
lacks the required trailing semicolon so we can remove it from the
macros.
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
---
arch/arm64/kernel/perf_event.c | 2 +-
arch/s390/hypfs/inode.c | 2 +-
arch/x86/events/intel/core.c | 2 +-
drivers/net/cris/eth_v10.c | 2 +-
drivers/net/dsa/dsa_loop_bdinfo.c | 2 +-
drivers/parport/procfs.c | 4 ++--
drivers/perf/arm_pmu_acpi.c | 2 +-
drivers/platform/x86/intel_turbo_max_3.c | 2 +-
fs/hugetlbfs/inode.c | 2 +-
mm/compaction.c | 2 +-
mm/oom_kill.c | 2 +-
mm/page_alloc.c | 2 +-
mm/page_owner.c | 2 +-
net/core/lwt_bpf.c | 2 +-
net/sched/sch_blackhole.c | 2 +-
sound/core/seq_device.c | 4 ++--
16 files changed, 18 insertions(+), 18 deletions(-)
diff --git a/arch/arm64/kernel/perf_event.c b/arch/arm64/kernel/perf_event.c
index b5798ba21189..b8e866f08d27 100644
--- a/arch/arm64/kernel/perf_event.c
+++ b/arch/arm64/kernel/perf_event.c
@@ -1172,4 +1172,4 @@ static int __init armv8_pmu_driver_init(void)
else
return arm_pmu_acpi_probe(armv8_pmuv3_init);
}
-device_initcall(armv8_pmu_driver_init)
+device_initcall(armv8_pmu_driver_init);
diff --git a/arch/s390/hypfs/inode.c b/arch/s390/hypfs/inode.c
index cf8a2d92467f..0876f49ff6e9 100644
--- a/arch/s390/hypfs/inode.c
+++ b/arch/s390/hypfs/inode.c
@@ -498,4 +498,4 @@ static int __init hypfs_init(void)
pr_err("Initialization of hypfs failed with rc=%i\n", rc);
return rc;
}
-device_initcall(hypfs_init)
+device_initcall(hypfs_init);
diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c
index 98b0f0729527..2510b00aa152 100644
--- a/arch/x86/events/intel/core.c
+++ b/arch/x86/events/intel/core.c
@@ -4340,4 +4340,4 @@ static __init int fixup_ht_bug(void)
pr_info("PMU erratum BJ122, BV98, HSD29 workaround disabled, HT off\n");
return 0;
}
-subsys_initcall(fixup_ht_bug)
+subsys_initcall(fixup_ht_bug);
diff --git a/drivers/net/cris/eth_v10.c b/drivers/net/cris/eth_v10.c
index 017f48cdcab9..2494b2d47210 100644
--- a/drivers/net/cris/eth_v10.c
+++ b/drivers/net/cris/eth_v10.c
@@ -408,7 +408,7 @@ etrax_ethernet_init(void)
led_next_time = jiffies;
return 0;
}
-device_initcall(etrax_ethernet_init)
+device_initcall(etrax_ethernet_init);
/* set MAC address of the interface. called from the core after a
* SIOCSIFADDR ioctl, and from the bootup above.
diff --git a/drivers/net/dsa/dsa_loop_bdinfo.c b/drivers/net/dsa/dsa_loop_bdinfo.c
index fb8d5dc71013..62c2c2d60752 100644
--- a/drivers/net/dsa/dsa_loop_bdinfo.c
+++ b/drivers/net/dsa/dsa_loop_bdinfo.c
@@ -29,6 +29,6 @@ static int __init dsa_loop_bdinfo_init(void)
{
return mdiobus_register_board_info(&bdinfo, 1);
}
-arch_initcall(dsa_loop_bdinfo_init)
+arch_initcall(dsa_loop_bdinfo_init);
MODULE_LICENSE("GPL");
diff --git a/drivers/parport/procfs.c b/drivers/parport/procfs.c
index 8ee44a104ac4..ae7ecc27da97 100644
--- a/drivers/parport/procfs.c
+++ b/drivers/parport/procfs.c
@@ -617,5 +617,5 @@ static void __exit parport_default_proc_unregister (void)
}
#endif
-subsys_initcall(parport_default_proc_register)
-module_exit(parport_default_proc_unregister)
+subsys_initcall(parport_default_proc_register);
+module_exit(parport_default_proc_unregister);
diff --git a/drivers/perf/arm_pmu_acpi.c b/drivers/perf/arm_pmu_acpi.c
index 0a9b78705ee8..3798bc2461f8 100644
--- a/drivers/perf/arm_pmu_acpi.c
+++ b/drivers/perf/arm_pmu_acpi.c
@@ -264,4 +264,4 @@ static int arm_pmu_acpi_init(void)
return ret;
}
-subsys_initcall(arm_pmu_acpi_init)
+subsys_initcall(arm_pmu_acpi_init);
diff --git a/drivers/platform/x86/intel_turbo_max_3.c b/drivers/platform/x86/intel_turbo_max_3.c
index 4f60d8e32a0a..fbcface26d94 100644
--- a/drivers/platform/x86/intel_turbo_max_3.c
+++ b/drivers/platform/x86/intel_turbo_max_3.c
@@ -148,4 +148,4 @@ static int __init itmt_legacy_init(void)
return 0;
}
-late_initcall(itmt_legacy_init)
+late_initcall(itmt_legacy_init);
diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c
index 28d2753be094..501481383ec7 100644
--- a/fs/hugetlbfs/inode.c
+++ b/fs/hugetlbfs/inode.c
@@ -1423,4 +1423,4 @@ static int __init init_hugetlbfs_fs(void)
out2:
return error;
}
-fs_initcall(init_hugetlbfs_fs)
+fs_initcall(init_hugetlbfs_fs);
diff --git a/mm/compaction.c b/mm/compaction.c
index fb548e4c7bd4..9d456d62c6ef 100644
--- a/mm/compaction.c
+++ b/mm/compaction.c
@@ -2125,6 +2125,6 @@ static int __init kcompactd_init(void)
kcompactd_run(nid);
return 0;
}
-subsys_initcall(kcompactd_init)
+subsys_initcall(kcompactd_init);
#endif /* CONFIG_COMPACTION */
diff --git a/mm/oom_kill.c b/mm/oom_kill.c
index 9e8b4f030c1c..5e82359cb58f 100644
--- a/mm/oom_kill.c
+++ b/mm/oom_kill.c
@@ -634,7 +634,7 @@ static int __init oom_init(void)
}
return 0;
}
-subsys_initcall(oom_init)
+subsys_initcall(oom_init);
#else
static inline void wake_oom_reaper(struct task_struct *tsk)
{
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 6d00f746c2fd..5fc71b3155dd 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -7073,7 +7073,7 @@ int __meminit init_per_zone_wmark_min(void)
return 0;
}
-core_initcall(init_per_zone_wmark_min)
+core_initcall(init_per_zone_wmark_min);
/*
* min_free_kbytes_sysctl_handler - just a wrapper around proc_dointvec() so
diff --git a/mm/page_owner.c b/mm/page_owner.c
index 0fd9dcf2c5dc..dfc22d5e3dba 100644
--- a/mm/page_owner.c
+++ b/mm/page_owner.c
@@ -624,4 +624,4 @@ static int __init pageowner_init(void)
return 0;
}
-late_initcall(pageowner_init)
+late_initcall(pageowner_init);
diff --git a/net/core/lwt_bpf.c b/net/core/lwt_bpf.c
index 1307731ddfe4..6e416c781682 100644
--- a/net/core/lwt_bpf.c
+++ b/net/core/lwt_bpf.c
@@ -396,4 +396,4 @@ static int __init bpf_lwt_init(void)
return lwtunnel_encap_add_ops(&bpf_encap_ops, LWTUNNEL_ENCAP_BPF);
}
-subsys_initcall(bpf_lwt_init)
+subsys_initcall(bpf_lwt_init);
diff --git a/net/sched/sch_blackhole.c b/net/sched/sch_blackhole.c
index c98a61e980ba..3fe322bd1e05 100644
--- a/net/sched/sch_blackhole.c
+++ b/net/sched/sch_blackhole.c
@@ -42,4 +42,4 @@ static int __init blackhole_init(void)
{
return register_qdisc(&blackhole_qdisc_ops);
}
-device_initcall(blackhole_init)
+device_initcall(blackhole_init);
diff --git a/sound/core/seq_device.c b/sound/core/seq_device.c
index c4acf17e9f5e..4e859e4a0356 100644
--- a/sound/core/seq_device.c
+++ b/sound/core/seq_device.c
@@ -311,5 +311,5 @@ static void __exit alsa_seq_device_exit(void)
bus_unregister(&snd_seq_bus_type);
}
-subsys_initcall(alsa_seq_device_init)
-module_exit(alsa_seq_device_exit)
+subsys_initcall(alsa_seq_device_init);
+module_exit(alsa_seq_device_exit);
--
2.11.0
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH v2 3/6] treewide: add missing trailing semicolons to initcall() invocations
2017-08-18 11:26 ` [PATCH v2 3/6] treewide: add missing trailing semicolons to initcall() invocations Ard Biesheuvel
@ 2017-08-18 11:26 ` Ard Biesheuvel
0 siblings, 0 replies; 24+ messages in thread
From: Ard Biesheuvel @ 2017-08-18 11:26 UTC (permalink / raw)
To: linux-kernel, linux-arch
Cc: Ard Biesheuvel, H. Peter Anvin, Arnd Bergmann, Heiko Carstens,
Kees Cook, Will Deacon, Michael Ellerman, Thomas Garnier,
Thomas Gleixner, Serge E. Hallyn, Bjorn Helgaas,
Benjamin Herrenschmidt, Paul Mackerras, Catalin Marinas,
Petr Mladek, Ingo Molnar, James Morris, Andrew Morton,
Joe Perches, Nicolas Pitre, Steven Rostedt, Martin Schwidefsky,
Sergey Senozhatsky, Linus Torvalds, Andy Whitcroft, Jessica Yu
Before modifying the initcall() code to add support for relative
references in the initcall sections, fix the existing code that
lacks the required trailing semicolon so we can remove it from the
macros.
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
---
arch/arm64/kernel/perf_event.c | 2 +-
arch/s390/hypfs/inode.c | 2 +-
arch/x86/events/intel/core.c | 2 +-
drivers/net/cris/eth_v10.c | 2 +-
drivers/net/dsa/dsa_loop_bdinfo.c | 2 +-
drivers/parport/procfs.c | 4 ++--
drivers/perf/arm_pmu_acpi.c | 2 +-
drivers/platform/x86/intel_turbo_max_3.c | 2 +-
fs/hugetlbfs/inode.c | 2 +-
mm/compaction.c | 2 +-
mm/oom_kill.c | 2 +-
mm/page_alloc.c | 2 +-
mm/page_owner.c | 2 +-
net/core/lwt_bpf.c | 2 +-
net/sched/sch_blackhole.c | 2 +-
sound/core/seq_device.c | 4 ++--
16 files changed, 18 insertions(+), 18 deletions(-)
diff --git a/arch/arm64/kernel/perf_event.c b/arch/arm64/kernel/perf_event.c
index b5798ba21189..b8e866f08d27 100644
--- a/arch/arm64/kernel/perf_event.c
+++ b/arch/arm64/kernel/perf_event.c
@@ -1172,4 +1172,4 @@ static int __init armv8_pmu_driver_init(void)
else
return arm_pmu_acpi_probe(armv8_pmuv3_init);
}
-device_initcall(armv8_pmu_driver_init)
+device_initcall(armv8_pmu_driver_init);
diff --git a/arch/s390/hypfs/inode.c b/arch/s390/hypfs/inode.c
index cf8a2d92467f..0876f49ff6e9 100644
--- a/arch/s390/hypfs/inode.c
+++ b/arch/s390/hypfs/inode.c
@@ -498,4 +498,4 @@ static int __init hypfs_init(void)
pr_err("Initialization of hypfs failed with rc=%i\n", rc);
return rc;
}
-device_initcall(hypfs_init)
+device_initcall(hypfs_init);
diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c
index 98b0f0729527..2510b00aa152 100644
--- a/arch/x86/events/intel/core.c
+++ b/arch/x86/events/intel/core.c
@@ -4340,4 +4340,4 @@ static __init int fixup_ht_bug(void)
pr_info("PMU erratum BJ122, BV98, HSD29 workaround disabled, HT off\n");
return 0;
}
-subsys_initcall(fixup_ht_bug)
+subsys_initcall(fixup_ht_bug);
diff --git a/drivers/net/cris/eth_v10.c b/drivers/net/cris/eth_v10.c
index 017f48cdcab9..2494b2d47210 100644
--- a/drivers/net/cris/eth_v10.c
+++ b/drivers/net/cris/eth_v10.c
@@ -408,7 +408,7 @@ etrax_ethernet_init(void)
led_next_time = jiffies;
return 0;
}
-device_initcall(etrax_ethernet_init)
+device_initcall(etrax_ethernet_init);
/* set MAC address of the interface. called from the core after a
* SIOCSIFADDR ioctl, and from the bootup above.
diff --git a/drivers/net/dsa/dsa_loop_bdinfo.c b/drivers/net/dsa/dsa_loop_bdinfo.c
index fb8d5dc71013..62c2c2d60752 100644
--- a/drivers/net/dsa/dsa_loop_bdinfo.c
+++ b/drivers/net/dsa/dsa_loop_bdinfo.c
@@ -29,6 +29,6 @@ static int __init dsa_loop_bdinfo_init(void)
{
return mdiobus_register_board_info(&bdinfo, 1);
}
-arch_initcall(dsa_loop_bdinfo_init)
+arch_initcall(dsa_loop_bdinfo_init);
MODULE_LICENSE("GPL");
diff --git a/drivers/parport/procfs.c b/drivers/parport/procfs.c
index 8ee44a104ac4..ae7ecc27da97 100644
--- a/drivers/parport/procfs.c
+++ b/drivers/parport/procfs.c
@@ -617,5 +617,5 @@ static void __exit parport_default_proc_unregister (void)
}
#endif
-subsys_initcall(parport_default_proc_register)
-module_exit(parport_default_proc_unregister)
+subsys_initcall(parport_default_proc_register);
+module_exit(parport_default_proc_unregister);
diff --git a/drivers/perf/arm_pmu_acpi.c b/drivers/perf/arm_pmu_acpi.c
index 0a9b78705ee8..3798bc2461f8 100644
--- a/drivers/perf/arm_pmu_acpi.c
+++ b/drivers/perf/arm_pmu_acpi.c
@@ -264,4 +264,4 @@ static int arm_pmu_acpi_init(void)
return ret;
}
-subsys_initcall(arm_pmu_acpi_init)
+subsys_initcall(arm_pmu_acpi_init);
diff --git a/drivers/platform/x86/intel_turbo_max_3.c b/drivers/platform/x86/intel_turbo_max_3.c
index 4f60d8e32a0a..fbcface26d94 100644
--- a/drivers/platform/x86/intel_turbo_max_3.c
+++ b/drivers/platform/x86/intel_turbo_max_3.c
@@ -148,4 +148,4 @@ static int __init itmt_legacy_init(void)
return 0;
}
-late_initcall(itmt_legacy_init)
+late_initcall(itmt_legacy_init);
diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c
index 28d2753be094..501481383ec7 100644
--- a/fs/hugetlbfs/inode.c
+++ b/fs/hugetlbfs/inode.c
@@ -1423,4 +1423,4 @@ static int __init init_hugetlbfs_fs(void)
out2:
return error;
}
-fs_initcall(init_hugetlbfs_fs)
+fs_initcall(init_hugetlbfs_fs);
diff --git a/mm/compaction.c b/mm/compaction.c
index fb548e4c7bd4..9d456d62c6ef 100644
--- a/mm/compaction.c
+++ b/mm/compaction.c
@@ -2125,6 +2125,6 @@ static int __init kcompactd_init(void)
kcompactd_run(nid);
return 0;
}
-subsys_initcall(kcompactd_init)
+subsys_initcall(kcompactd_init);
#endif /* CONFIG_COMPACTION */
diff --git a/mm/oom_kill.c b/mm/oom_kill.c
index 9e8b4f030c1c..5e82359cb58f 100644
--- a/mm/oom_kill.c
+++ b/mm/oom_kill.c
@@ -634,7 +634,7 @@ static int __init oom_init(void)
}
return 0;
}
-subsys_initcall(oom_init)
+subsys_initcall(oom_init);
#else
static inline void wake_oom_reaper(struct task_struct *tsk)
{
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 6d00f746c2fd..5fc71b3155dd 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -7073,7 +7073,7 @@ int __meminit init_per_zone_wmark_min(void)
return 0;
}
-core_initcall(init_per_zone_wmark_min)
+core_initcall(init_per_zone_wmark_min);
/*
* min_free_kbytes_sysctl_handler - just a wrapper around proc_dointvec() so
diff --git a/mm/page_owner.c b/mm/page_owner.c
index 0fd9dcf2c5dc..dfc22d5e3dba 100644
--- a/mm/page_owner.c
+++ b/mm/page_owner.c
@@ -624,4 +624,4 @@ static int __init pageowner_init(void)
return 0;
}
-late_initcall(pageowner_init)
+late_initcall(pageowner_init);
diff --git a/net/core/lwt_bpf.c b/net/core/lwt_bpf.c
index 1307731ddfe4..6e416c781682 100644
--- a/net/core/lwt_bpf.c
+++ b/net/core/lwt_bpf.c
@@ -396,4 +396,4 @@ static int __init bpf_lwt_init(void)
return lwtunnel_encap_add_ops(&bpf_encap_ops, LWTUNNEL_ENCAP_BPF);
}
-subsys_initcall(bpf_lwt_init)
+subsys_initcall(bpf_lwt_init);
diff --git a/net/sched/sch_blackhole.c b/net/sched/sch_blackhole.c
index c98a61e980ba..3fe322bd1e05 100644
--- a/net/sched/sch_blackhole.c
+++ b/net/sched/sch_blackhole.c
@@ -42,4 +42,4 @@ static int __init blackhole_init(void)
{
return register_qdisc(&blackhole_qdisc_ops);
}
-device_initcall(blackhole_init)
+device_initcall(blackhole_init);
diff --git a/sound/core/seq_device.c b/sound/core/seq_device.c
index c4acf17e9f5e..4e859e4a0356 100644
--- a/sound/core/seq_device.c
+++ b/sound/core/seq_device.c
@@ -311,5 +311,5 @@ static void __exit alsa_seq_device_exit(void)
bus_unregister(&snd_seq_bus_type);
}
-subsys_initcall(alsa_seq_device_init)
-module_exit(alsa_seq_device_exit)
+subsys_initcall(alsa_seq_device_init);
+module_exit(alsa_seq_device_exit);
--
2.11.0
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH v2 4/6] init: allow initcall tables to be emitted using relative references
2017-08-18 11:26 [PATCH v2 0/6] add support for relative references in special sections Ard Biesheuvel
` (3 preceding siblings ...)
2017-08-18 11:26 ` [PATCH v2 3/6] treewide: add missing trailing semicolons to initcall() invocations Ard Biesheuvel
@ 2017-08-18 11:26 ` Ard Biesheuvel
2017-08-18 11:26 ` Ard Biesheuvel
2017-08-18 11:26 ` [PATCH v2 5/6] drivers: pci: add support for relative addressing in quirk tables Ard Biesheuvel
2017-08-18 11:26 ` [PATCH v2 6/6] kernel: tracepoints: add support for relative references Ard Biesheuvel
6 siblings, 1 reply; 24+ messages in thread
From: Ard Biesheuvel @ 2017-08-18 11:26 UTC (permalink / raw)
To: linux-kernel, linux-arch
Cc: Ard Biesheuvel, H. Peter Anvin, Arnd Bergmann, Heiko Carstens,
Kees Cook, Will Deacon, Michael Ellerman, Thomas Garnier,
Thomas Gleixner, Serge E. Hallyn, Bjorn Helgaas,
Benjamin Herrenschmidt, Paul Mackerras, Catalin Marinas,
Petr Mladek, Ingo Molnar, James Morris, Andrew Morton,
Joe Perches, Nicolas Pitre, Steve
Allow the initcall tables to be emitted using relative references that
are only half the size on 64-bit architectures and don't require fixups
at runtime on relocatable kernels.
Cc: Petr Mladek <pmladek@suse.com>
Cc: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: James Morris <james.l.morris@oracle.com>
Cc: "Serge E. Hallyn" <serge@hallyn.com>
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
---
include/linux/init.h | 64 ++++++++++++++++----
init/main.c | 22 ++-----
kernel/printk/printk.c | 4 +-
security/security.c | 6 +-
4 files changed, 62 insertions(+), 34 deletions(-)
diff --git a/include/linux/init.h b/include/linux/init.h
index 94769d687cf0..61022aec47ea 100644
--- a/include/linux/init.h
+++ b/include/linux/init.h
@@ -110,9 +110,6 @@
typedef int (*initcall_t)(void);
typedef void (*exitcall_t)(void);
-extern initcall_t __con_initcall_start[], __con_initcall_end[];
-extern initcall_t __security_initcall_start[], __security_initcall_end[];
-
/* Used for contructor calls. */
typedef void (*ctor_fn_t)(void);
@@ -161,9 +158,57 @@ extern bool initcall_debug;
* as KEEP() in the linker script.
*/
-#define __define_initcall(fn, id) \
+#ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
+#define ___define_initcall(fn, id, __sec) \
+ __ADDRESSABLE(fn) \
+ asm(".section \"" #__sec ".init\", \"a\"\n" \
+ "__initcall_" #fn #id ":\n" \
+ ".long " VMLINUX_SYMBOL_STR(fn) " - .\n" \
+ ".previous\n")
+
+struct initcall_entry_t {
+ int offset;
+};
+
+static inline
+initcall_t initcall_from_entry(const struct initcall_entry_t *entry)
+{
+ return (initcall_t)((unsigned long)entry + entry->offset);
+}
+#else
+#define ___define_initcall(fn, id, __sec) \
static initcall_t __initcall_##fn##id __used \
- __attribute__((__section__(".initcall" #id ".init"))) = fn;
+ __attribute__((__section__(#__sec ".init"))) = fn
+
+struct initcall_entry_t {
+ initcall_t call;
+};
+
+static inline
+initcall_t initcall_from_entry(const struct initcall_entry_t *entry)
+{
+ return entry->call;
+}
+#endif
+
+extern struct initcall_entry_t __initcall_start[];
+extern struct initcall_entry_t __initcall0_start[];
+extern struct initcall_entry_t __initcall1_start[];
+extern struct initcall_entry_t __initcall2_start[];
+extern struct initcall_entry_t __initcall3_start[];
+extern struct initcall_entry_t __initcall4_start[];
+extern struct initcall_entry_t __initcall5_start[];
+extern struct initcall_entry_t __initcall6_start[];
+extern struct initcall_entry_t __initcall7_start[];
+extern struct initcall_entry_t __initcall_end[];
+
+extern struct initcall_entry_t __con_initcall_start[];
+extern struct initcall_entry_t __con_initcall_end[];
+
+extern struct initcall_entry_t __security_initcall_start[];
+extern struct initcall_entry_t __security_initcall_end[];
+
+#define __define_initcall(fn, id) ___define_initcall(fn, id, .initcall##id)
/*
* Early initcalls run before initializing SMP.
@@ -202,13 +247,8 @@ extern bool initcall_debug;
#define __exitcall(fn) \
static exitcall_t __exitcall_##fn __exit_call = fn
-#define console_initcall(fn) \
- static initcall_t __initcall_##fn \
- __used __section(.con_initcall.init) = fn
-
-#define security_initcall(fn) \
- static initcall_t __initcall_##fn \
- __used __section(.security_initcall.init) = fn
+#define console_initcall(fn) ___define_initcall(fn,, .con_initcall)
+#define security_initcall(fn) ___define_initcall(fn,, .security_initcall)
struct obs_kernel_param {
const char *str;
diff --git a/init/main.c b/init/main.c
index 052481fbe363..174a68ee85c4 100644
--- a/init/main.c
+++ b/init/main.c
@@ -832,19 +832,7 @@ int __init_or_module do_one_initcall(initcall_t fn)
return ret;
}
-
-extern initcall_t __initcall_start[];
-extern initcall_t __initcall0_start[];
-extern initcall_t __initcall1_start[];
-extern initcall_t __initcall2_start[];
-extern initcall_t __initcall3_start[];
-extern initcall_t __initcall4_start[];
-extern initcall_t __initcall5_start[];
-extern initcall_t __initcall6_start[];
-extern initcall_t __initcall7_start[];
-extern initcall_t __initcall_end[];
-
-static initcall_t *initcall_levels[] __initdata = {
+static struct initcall_entry_t *initcall_levels[] __initdata = {
__initcall0_start,
__initcall1_start,
__initcall2_start,
@@ -870,7 +858,7 @@ static char *initcall_level_names[] __initdata = {
static void __init do_initcall_level(int level)
{
- initcall_t *fn;
+ struct initcall_entry_t *fn;
strcpy(initcall_command_line, saved_command_line);
parse_args(initcall_level_names[level],
@@ -880,7 +868,7 @@ static void __init do_initcall_level(int level)
NULL, &repair_env_string);
for (fn = initcall_levels[level]; fn < initcall_levels[level+1]; fn++)
- do_one_initcall(*fn);
+ do_one_initcall(initcall_from_entry(fn));
}
static void __init do_initcalls(void)
@@ -911,10 +899,10 @@ static void __init do_basic_setup(void)
static void __init do_pre_smp_initcalls(void)
{
- initcall_t *fn;
+ struct initcall_entry_t *fn;
for (fn = __initcall_start; fn < __initcall0_start; fn++)
- do_one_initcall(*fn);
+ do_one_initcall(initcall_from_entry(fn));
}
/*
diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
index fc47863f629c..95a964592dc6 100644
--- a/kernel/printk/printk.c
+++ b/kernel/printk/printk.c
@@ -2623,7 +2623,7 @@ EXPORT_SYMBOL(unregister_console);
*/
void __init console_init(void)
{
- initcall_t *call;
+ struct initcall_entry_t *call;
/* Setup the default TTY line discipline. */
n_tty_init();
@@ -2634,7 +2634,7 @@ void __init console_init(void)
*/
call = __con_initcall_start;
while (call < __con_initcall_end) {
- (*call)();
+ initcall_from_entry(call)();
call++;
}
}
diff --git a/security/security.c b/security/security.c
index 30132378d103..e878b6f5ce9c 100644
--- a/security/security.c
+++ b/security/security.c
@@ -44,10 +44,10 @@ static __initdata char chosen_lsm[SECURITY_NAME_MAX + 1] =
static void __init do_security_initcalls(void)
{
- initcall_t *call;
- call = __security_initcall_start;
+ struct initcall_entry_t *call = __security_initcall_start;
+
while (call < __security_initcall_end) {
- (*call) ();
+ initcall_from_entry(call)();
call++;
}
}
--
2.11.0
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH v2 4/6] init: allow initcall tables to be emitted using relative references
2017-08-18 11:26 ` [PATCH v2 4/6] init: allow initcall tables to be emitted using relative references Ard Biesheuvel
@ 2017-08-18 11:26 ` Ard Biesheuvel
0 siblings, 0 replies; 24+ messages in thread
From: Ard Biesheuvel @ 2017-08-18 11:26 UTC (permalink / raw)
To: linux-kernel, linux-arch
Cc: Ard Biesheuvel, H. Peter Anvin, Arnd Bergmann, Heiko Carstens,
Kees Cook, Will Deacon, Michael Ellerman, Thomas Garnier,
Thomas Gleixner, Serge E. Hallyn, Bjorn Helgaas,
Benjamin Herrenschmidt, Paul Mackerras, Catalin Marinas,
Petr Mladek, Ingo Molnar, James Morris, Andrew Morton,
Joe Perches, Nicolas Pitre, Steven Rostedt, Martin Schwidefsky,
Sergey Senozhatsky, Linus Torvalds, Andy Whitcroft, Jessica Yu
Allow the initcall tables to be emitted using relative references that
are only half the size on 64-bit architectures and don't require fixups
at runtime on relocatable kernels.
Cc: Petr Mladek <pmladek@suse.com>
Cc: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: James Morris <james.l.morris@oracle.com>
Cc: "Serge E. Hallyn" <serge@hallyn.com>
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
---
include/linux/init.h | 64 ++++++++++++++++----
init/main.c | 22 ++-----
kernel/printk/printk.c | 4 +-
security/security.c | 6 +-
4 files changed, 62 insertions(+), 34 deletions(-)
diff --git a/include/linux/init.h b/include/linux/init.h
index 94769d687cf0..61022aec47ea 100644
--- a/include/linux/init.h
+++ b/include/linux/init.h
@@ -110,9 +110,6 @@
typedef int (*initcall_t)(void);
typedef void (*exitcall_t)(void);
-extern initcall_t __con_initcall_start[], __con_initcall_end[];
-extern initcall_t __security_initcall_start[], __security_initcall_end[];
-
/* Used for contructor calls. */
typedef void (*ctor_fn_t)(void);
@@ -161,9 +158,57 @@ extern bool initcall_debug;
* as KEEP() in the linker script.
*/
-#define __define_initcall(fn, id) \
+#ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
+#define ___define_initcall(fn, id, __sec) \
+ __ADDRESSABLE(fn) \
+ asm(".section \"" #__sec ".init\", \"a\"\n" \
+ "__initcall_" #fn #id ":\n" \
+ ".long " VMLINUX_SYMBOL_STR(fn) " - .\n" \
+ ".previous\n")
+
+struct initcall_entry_t {
+ int offset;
+};
+
+static inline
+initcall_t initcall_from_entry(const struct initcall_entry_t *entry)
+{
+ return (initcall_t)((unsigned long)entry + entry->offset);
+}
+#else
+#define ___define_initcall(fn, id, __sec) \
static initcall_t __initcall_##fn##id __used \
- __attribute__((__section__(".initcall" #id ".init"))) = fn;
+ __attribute__((__section__(#__sec ".init"))) = fn
+
+struct initcall_entry_t {
+ initcall_t call;
+};
+
+static inline
+initcall_t initcall_from_entry(const struct initcall_entry_t *entry)
+{
+ return entry->call;
+}
+#endif
+
+extern struct initcall_entry_t __initcall_start[];
+extern struct initcall_entry_t __initcall0_start[];
+extern struct initcall_entry_t __initcall1_start[];
+extern struct initcall_entry_t __initcall2_start[];
+extern struct initcall_entry_t __initcall3_start[];
+extern struct initcall_entry_t __initcall4_start[];
+extern struct initcall_entry_t __initcall5_start[];
+extern struct initcall_entry_t __initcall6_start[];
+extern struct initcall_entry_t __initcall7_start[];
+extern struct initcall_entry_t __initcall_end[];
+
+extern struct initcall_entry_t __con_initcall_start[];
+extern struct initcall_entry_t __con_initcall_end[];
+
+extern struct initcall_entry_t __security_initcall_start[];
+extern struct initcall_entry_t __security_initcall_end[];
+
+#define __define_initcall(fn, id) ___define_initcall(fn, id, .initcall##id)
/*
* Early initcalls run before initializing SMP.
@@ -202,13 +247,8 @@ extern bool initcall_debug;
#define __exitcall(fn) \
static exitcall_t __exitcall_##fn __exit_call = fn
-#define console_initcall(fn) \
- static initcall_t __initcall_##fn \
- __used __section(.con_initcall.init) = fn
-
-#define security_initcall(fn) \
- static initcall_t __initcall_##fn \
- __used __section(.security_initcall.init) = fn
+#define console_initcall(fn) ___define_initcall(fn,, .con_initcall)
+#define security_initcall(fn) ___define_initcall(fn,, .security_initcall)
struct obs_kernel_param {
const char *str;
diff --git a/init/main.c b/init/main.c
index 052481fbe363..174a68ee85c4 100644
--- a/init/main.c
+++ b/init/main.c
@@ -832,19 +832,7 @@ int __init_or_module do_one_initcall(initcall_t fn)
return ret;
}
-
-extern initcall_t __initcall_start[];
-extern initcall_t __initcall0_start[];
-extern initcall_t __initcall1_start[];
-extern initcall_t __initcall2_start[];
-extern initcall_t __initcall3_start[];
-extern initcall_t __initcall4_start[];
-extern initcall_t __initcall5_start[];
-extern initcall_t __initcall6_start[];
-extern initcall_t __initcall7_start[];
-extern initcall_t __initcall_end[];
-
-static initcall_t *initcall_levels[] __initdata = {
+static struct initcall_entry_t *initcall_levels[] __initdata = {
__initcall0_start,
__initcall1_start,
__initcall2_start,
@@ -870,7 +858,7 @@ static char *initcall_level_names[] __initdata = {
static void __init do_initcall_level(int level)
{
- initcall_t *fn;
+ struct initcall_entry_t *fn;
strcpy(initcall_command_line, saved_command_line);
parse_args(initcall_level_names[level],
@@ -880,7 +868,7 @@ static void __init do_initcall_level(int level)
NULL, &repair_env_string);
for (fn = initcall_levels[level]; fn < initcall_levels[level+1]; fn++)
- do_one_initcall(*fn);
+ do_one_initcall(initcall_from_entry(fn));
}
static void __init do_initcalls(void)
@@ -911,10 +899,10 @@ static void __init do_basic_setup(void)
static void __init do_pre_smp_initcalls(void)
{
- initcall_t *fn;
+ struct initcall_entry_t *fn;
for (fn = __initcall_start; fn < __initcall0_start; fn++)
- do_one_initcall(*fn);
+ do_one_initcall(initcall_from_entry(fn));
}
/*
diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
index fc47863f629c..95a964592dc6 100644
--- a/kernel/printk/printk.c
+++ b/kernel/printk/printk.c
@@ -2623,7 +2623,7 @@ EXPORT_SYMBOL(unregister_console);
*/
void __init console_init(void)
{
- initcall_t *call;
+ struct initcall_entry_t *call;
/* Setup the default TTY line discipline. */
n_tty_init();
@@ -2634,7 +2634,7 @@ void __init console_init(void)
*/
call = __con_initcall_start;
while (call < __con_initcall_end) {
- (*call)();
+ initcall_from_entry(call)();
call++;
}
}
diff --git a/security/security.c b/security/security.c
index 30132378d103..e878b6f5ce9c 100644
--- a/security/security.c
+++ b/security/security.c
@@ -44,10 +44,10 @@ static __initdata char chosen_lsm[SECURITY_NAME_MAX + 1] =
static void __init do_security_initcalls(void)
{
- initcall_t *call;
- call = __security_initcall_start;
+ struct initcall_entry_t *call = __security_initcall_start;
+
while (call < __security_initcall_end) {
- (*call) ();
+ initcall_from_entry(call)();
call++;
}
}
--
2.11.0
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH v2 5/6] drivers: pci: add support for relative addressing in quirk tables
2017-08-18 11:26 [PATCH v2 0/6] add support for relative references in special sections Ard Biesheuvel
` (4 preceding siblings ...)
2017-08-18 11:26 ` [PATCH v2 4/6] init: allow initcall tables to be emitted using relative references Ard Biesheuvel
@ 2017-08-18 11:26 ` Ard Biesheuvel
2017-08-18 11:26 ` Ard Biesheuvel
2017-08-18 11:26 ` [PATCH v2 6/6] kernel: tracepoints: add support for relative references Ard Biesheuvel
6 siblings, 1 reply; 24+ messages in thread
From: Ard Biesheuvel @ 2017-08-18 11:26 UTC (permalink / raw)
To: linux-kernel, linux-arch
Cc: Ard Biesheuvel, H. Peter Anvin, Arnd Bergmann, Heiko Carstens,
Kees Cook, Will Deacon, Michael Ellerman, Thomas Garnier,
Thomas Gleixner, Serge E. Hallyn, Bjorn Helgaas,
Benjamin Herrenschmidt, Paul Mackerras, Catalin Marinas,
Petr Mladek, Ingo Molnar, James Morris, Andrew Morton,
Joe Perches, Nicolas Pitre, Steve
Allow the PCI quirk tables to be emitted in a way that avoids absolute
references to the hook functions. This reduces the size of the entries,
and, more importantly, makes them invariant under runtime relocation
(e.g., for KASLR)
Cc: Bjorn Helgaas <bhelgaas@google.com>
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
---
drivers/pci/quirks.c | 6 ++--
include/linux/pci.h | 32 ++++++++++++++++++++
2 files changed, 35 insertions(+), 3 deletions(-)
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
index 6967c6b4cf6b..0a7ba8c7f1f6 100644
--- a/drivers/pci/quirks.c
+++ b/drivers/pci/quirks.c
@@ -3547,9 +3547,9 @@ static void pci_do_fixups(struct pci_dev *dev, struct pci_fixup *f,
f->vendor == (u16) PCI_ANY_ID) &&
(f->device == dev->device ||
f->device == (u16) PCI_ANY_ID)) {
- calltime = fixup_debug_start(dev, f->hook);
- f->hook(dev);
- fixup_debug_report(dev, calltime, f->hook);
+ calltime = fixup_debug_start(dev, pci_fixup_hook(f));
+ pci_fixup_hook(f)(dev);
+ fixup_debug_report(dev, calltime, pci_fixup_hook(f));
}
}
diff --git a/include/linux/pci.h b/include/linux/pci.h
index a75c13673852..58eb4e7a15c3 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -1735,7 +1735,11 @@ struct pci_fixup {
u16 device; /* You can use PCI_ANY_ID here of course */
u32 class; /* You can use PCI_ANY_ID here too */
unsigned int class_shift; /* should be 0, 8, 16 */
+#ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
+ int hook_offset;
+#else
void (*hook)(struct pci_dev *dev);
+#endif
};
enum pci_fixup_pass {
@@ -1749,6 +1753,27 @@ enum pci_fixup_pass {
pci_fixup_suspend_late, /* pci_device_suspend_late() */
};
+#ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
+#define __DECLARE_PCI_FIXUP_SECTION(sec, name, vendor, device, class, \
+ class_shift, hook) \
+ __ADDRESSABLE(hook) \
+ asm(".section " #sec ", \"a\"\n" \
+ ".balign 16\n" \
+ ".short " #vendor ", " #device "\n" \
+ ".long " #class ", " #class_shift "\n" \
+ ".long " VMLINUX_SYMBOL_STR(hook) " - .\n" \
+ ".previous\n")
+#define DECLARE_PCI_FIXUP_SECTION(sec, name, vendor, device, class, \
+ class_shift, hook) \
+ __DECLARE_PCI_FIXUP_SECTION(sec, name, vendor, device, class, \
+ class_shift, hook)
+
+static inline
+void (*pci_fixup_hook(const struct pci_fixup *f))(struct pci_dev *)
+{
+ return (void *)((unsigned long)&f->hook_offset + f->hook_offset);
+}
+#else
/* Anonymous variables would be nice... */
#define DECLARE_PCI_FIXUP_SECTION(section, name, vendor, device, class, \
class_shift, hook) \
@@ -1756,6 +1781,13 @@ enum pci_fixup_pass {
__attribute__((__section__(#section), aligned((sizeof(void *))))) \
= { vendor, device, class, class_shift, hook };
+static inline
+void (*pci_fixup_hook(const struct pci_fixup *f))(struct pci_dev *)
+{
+ return f->hook;
+}
+#endif
+
#define DECLARE_PCI_FIXUP_CLASS_EARLY(vendor, device, class, \
class_shift, hook) \
DECLARE_PCI_FIXUP_SECTION(.pci_fixup_early, \
--
2.11.0
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH v2 5/6] drivers: pci: add support for relative addressing in quirk tables
2017-08-18 11:26 ` [PATCH v2 5/6] drivers: pci: add support for relative addressing in quirk tables Ard Biesheuvel
@ 2017-08-18 11:26 ` Ard Biesheuvel
0 siblings, 0 replies; 24+ messages in thread
From: Ard Biesheuvel @ 2017-08-18 11:26 UTC (permalink / raw)
To: linux-kernel, linux-arch
Cc: Ard Biesheuvel, H. Peter Anvin, Arnd Bergmann, Heiko Carstens,
Kees Cook, Will Deacon, Michael Ellerman, Thomas Garnier,
Thomas Gleixner, Serge E. Hallyn, Bjorn Helgaas,
Benjamin Herrenschmidt, Paul Mackerras, Catalin Marinas,
Petr Mladek, Ingo Molnar, James Morris, Andrew Morton,
Joe Perches, Nicolas Pitre, Steven Rostedt, Martin Schwidefsky,
Sergey Senozhatsky, Linus Torvalds, Andy Whitcroft, Jessica Yu
Allow the PCI quirk tables to be emitted in a way that avoids absolute
references to the hook functions. This reduces the size of the entries,
and, more importantly, makes them invariant under runtime relocation
(e.g., for KASLR)
Cc: Bjorn Helgaas <bhelgaas@google.com>
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
---
drivers/pci/quirks.c | 6 ++--
include/linux/pci.h | 32 ++++++++++++++++++++
2 files changed, 35 insertions(+), 3 deletions(-)
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
index 6967c6b4cf6b..0a7ba8c7f1f6 100644
--- a/drivers/pci/quirks.c
+++ b/drivers/pci/quirks.c
@@ -3547,9 +3547,9 @@ static void pci_do_fixups(struct pci_dev *dev, struct pci_fixup *f,
f->vendor == (u16) PCI_ANY_ID) &&
(f->device == dev->device ||
f->device == (u16) PCI_ANY_ID)) {
- calltime = fixup_debug_start(dev, f->hook);
- f->hook(dev);
- fixup_debug_report(dev, calltime, f->hook);
+ calltime = fixup_debug_start(dev, pci_fixup_hook(f));
+ pci_fixup_hook(f)(dev);
+ fixup_debug_report(dev, calltime, pci_fixup_hook(f));
}
}
diff --git a/include/linux/pci.h b/include/linux/pci.h
index a75c13673852..58eb4e7a15c3 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -1735,7 +1735,11 @@ struct pci_fixup {
u16 device; /* You can use PCI_ANY_ID here of course */
u32 class; /* You can use PCI_ANY_ID here too */
unsigned int class_shift; /* should be 0, 8, 16 */
+#ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
+ int hook_offset;
+#else
void (*hook)(struct pci_dev *dev);
+#endif
};
enum pci_fixup_pass {
@@ -1749,6 +1753,27 @@ enum pci_fixup_pass {
pci_fixup_suspend_late, /* pci_device_suspend_late() */
};
+#ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
+#define __DECLARE_PCI_FIXUP_SECTION(sec, name, vendor, device, class, \
+ class_shift, hook) \
+ __ADDRESSABLE(hook) \
+ asm(".section " #sec ", \"a\"\n" \
+ ".balign 16\n" \
+ ".short " #vendor ", " #device "\n" \
+ ".long " #class ", " #class_shift "\n" \
+ ".long " VMLINUX_SYMBOL_STR(hook) " - .\n" \
+ ".previous\n")
+#define DECLARE_PCI_FIXUP_SECTION(sec, name, vendor, device, class, \
+ class_shift, hook) \
+ __DECLARE_PCI_FIXUP_SECTION(sec, name, vendor, device, class, \
+ class_shift, hook)
+
+static inline
+void (*pci_fixup_hook(const struct pci_fixup *f))(struct pci_dev *)
+{
+ return (void *)((unsigned long)&f->hook_offset + f->hook_offset);
+}
+#else
/* Anonymous variables would be nice... */
#define DECLARE_PCI_FIXUP_SECTION(section, name, vendor, device, class, \
class_shift, hook) \
@@ -1756,6 +1781,13 @@ enum pci_fixup_pass {
__attribute__((__section__(#section), aligned((sizeof(void *))))) \
= { vendor, device, class, class_shift, hook };
+static inline
+void (*pci_fixup_hook(const struct pci_fixup *f))(struct pci_dev *)
+{
+ return f->hook;
+}
+#endif
+
#define DECLARE_PCI_FIXUP_CLASS_EARLY(vendor, device, class, \
class_shift, hook) \
DECLARE_PCI_FIXUP_SECTION(.pci_fixup_early, \
--
2.11.0
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH v2 6/6] kernel: tracepoints: add support for relative references
2017-08-18 11:26 [PATCH v2 0/6] add support for relative references in special sections Ard Biesheuvel
` (5 preceding siblings ...)
2017-08-18 11:26 ` [PATCH v2 5/6] drivers: pci: add support for relative addressing in quirk tables Ard Biesheuvel
@ 2017-08-18 11:26 ` Ard Biesheuvel
2017-08-18 11:26 ` Ard Biesheuvel
2017-08-18 11:44 ` Ard Biesheuvel
6 siblings, 2 replies; 24+ messages in thread
From: Ard Biesheuvel @ 2017-08-18 11:26 UTC (permalink / raw)
To: linux-kernel, linux-arch
Cc: Ard Biesheuvel, H. Peter Anvin, Arnd Bergmann, Heiko Carstens,
Kees Cook, Will Deacon, Michael Ellerman, Thomas Garnier,
Thomas Gleixner, Serge E. Hallyn, Bjorn Helgaas,
Benjamin Herrenschmidt, Paul Mackerras, Catalin Marinas,
Petr Mladek, Ingo Molnar, James Morris, Andrew Morton,
Joe Perches, Nicolas Pitre, Steve
To avoid the need for relocating absolute references to tracepoint
structures at boot time when running relocatable kernels (which may
take a disproportionate amount of space), add the option to emit
these tables as relative references instead.
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Ingo Molnar <mingo@redhat.com>
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
---
include/linux/tracepoint.h | 42 ++++++++++++++++++--
kernel/tracepoint.c | 7 +---
2 files changed, 40 insertions(+), 9 deletions(-)
diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h
index a26ffbe09e71..68701821933a 100644
--- a/include/linux/tracepoint.h
+++ b/include/linux/tracepoint.h
@@ -228,6 +228,42 @@ extern void syscall_unregfunc(void);
return static_key_false(&__tracepoint_##name.key); \
}
+#ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
+#define __TRACEPOINT_ENTRY(name) \
+ asm(" .section \"__tracepoints_ptrs\", \"a\"\n" \
+ " .balign 4\n" \
+ " .long " VMLINUX_SYMBOL_STR(__tracepoint_##name) " - .\n"\
+ " .previous\n")
+
+struct tracepoint_entry_t {
+ int tp_offset;
+};
+
+static inline
+struct tracepoint *tracepoint_from_entry(const struct tracepoint_entry_t *ent)
+{
+ return (struct tracepoint *)((unsigned long)ent + ent->tp_offset);
+}
+#else
+#define __TRACEPOINT_ENTRY(name) \
+ static struct tracepoint * const __tracepoint_ptr_##name __used \
+ __attribute__((section("__tracepoints_ptrs"))) = \
+ &__tracepoint_##name
+
+struct tracepoint_entry_t {
+ struct tracepoint *tp;
+};
+
+static inline
+struct tracepoint *tracepoint_from_entry(const struct tracepoint_entry_t *ent)
+{
+ return ent->tp;
+}
+#endif
+
+extern struct tracepoint_entry_t const __start___tracepoints_ptrs[];
+extern struct tracepoint_entry_t const __stop___tracepoints_ptrs[];
+
/*
* We have no guarantee that gcc and the linker won't up-align the tracepoint
* structures, so we create an array of pointers that will be used for iteration
@@ -237,11 +273,9 @@ extern void syscall_unregfunc(void);
static const char __tpstrtab_##name[] \
__attribute__((section("__tracepoints_strings"))) = #name; \
struct tracepoint __tracepoint_##name \
- __attribute__((section("__tracepoints"))) = \
+ __attribute__((section("__tracepoints"))) __used = \
{ __tpstrtab_##name, STATIC_KEY_INIT_FALSE, reg, unreg, NULL };\
- static struct tracepoint * const __tracepoint_ptr_##name __used \
- __attribute__((section("__tracepoints_ptrs"))) = \
- &__tracepoint_##name;
+ __TRACEPOINT_ENTRY(name);
#define DEFINE_TRACE(name) \
DEFINE_TRACE_FN(name, NULL, NULL);
diff --git a/kernel/tracepoint.c b/kernel/tracepoint.c
index 685c50ae6300..21bc41454fd6 100644
--- a/kernel/tracepoint.c
+++ b/kernel/tracepoint.c
@@ -28,9 +28,6 @@
#include <linux/sched/task.h>
#include <linux/static_key.h>
-extern struct tracepoint * const __start___tracepoints_ptrs[];
-extern struct tracepoint * const __stop___tracepoints_ptrs[];
-
/* Set to 1 to enable tracepoint debug output */
static const int tracepoint_debug;
@@ -508,12 +505,12 @@ static void for_each_tracepoint_range(struct tracepoint * const *begin,
void (*fct)(struct tracepoint *tp, void *priv),
void *priv)
{
- struct tracepoint * const *iter;
+ struct tracepoint_entry_t const *iter;
if (!begin)
return;
for (iter = begin; iter < end; iter++)
- fct(*iter, priv);
+ fct(tracepoint_from_entry(iter), priv);
}
/**
--
2.11.0
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH v2 6/6] kernel: tracepoints: add support for relative references
2017-08-18 11:26 ` [PATCH v2 6/6] kernel: tracepoints: add support for relative references Ard Biesheuvel
@ 2017-08-18 11:26 ` Ard Biesheuvel
2017-08-18 11:44 ` Ard Biesheuvel
1 sibling, 0 replies; 24+ messages in thread
From: Ard Biesheuvel @ 2017-08-18 11:26 UTC (permalink / raw)
To: linux-kernel, linux-arch
Cc: Ard Biesheuvel, H. Peter Anvin, Arnd Bergmann, Heiko Carstens,
Kees Cook, Will Deacon, Michael Ellerman, Thomas Garnier,
Thomas Gleixner, Serge E. Hallyn, Bjorn Helgaas,
Benjamin Herrenschmidt, Paul Mackerras, Catalin Marinas,
Petr Mladek, Ingo Molnar, James Morris, Andrew Morton,
Joe Perches, Nicolas Pitre, Steven Rostedt, Martin Schwidefsky,
Sergey Senozhatsky, Linus Torvalds, Andy Whitcroft, Jessica Yu
To avoid the need for relocating absolute references to tracepoint
structures at boot time when running relocatable kernels (which may
take a disproportionate amount of space), add the option to emit
these tables as relative references instead.
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Ingo Molnar <mingo@redhat.com>
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
---
include/linux/tracepoint.h | 42 ++++++++++++++++++--
kernel/tracepoint.c | 7 +---
2 files changed, 40 insertions(+), 9 deletions(-)
diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h
index a26ffbe09e71..68701821933a 100644
--- a/include/linux/tracepoint.h
+++ b/include/linux/tracepoint.h
@@ -228,6 +228,42 @@ extern void syscall_unregfunc(void);
return static_key_false(&__tracepoint_##name.key); \
}
+#ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
+#define __TRACEPOINT_ENTRY(name) \
+ asm(" .section \"__tracepoints_ptrs\", \"a\"\n" \
+ " .balign 4\n" \
+ " .long " VMLINUX_SYMBOL_STR(__tracepoint_##name) " - .\n"\
+ " .previous\n")
+
+struct tracepoint_entry_t {
+ int tp_offset;
+};
+
+static inline
+struct tracepoint *tracepoint_from_entry(const struct tracepoint_entry_t *ent)
+{
+ return (struct tracepoint *)((unsigned long)ent + ent->tp_offset);
+}
+#else
+#define __TRACEPOINT_ENTRY(name) \
+ static struct tracepoint * const __tracepoint_ptr_##name __used \
+ __attribute__((section("__tracepoints_ptrs"))) = \
+ &__tracepoint_##name
+
+struct tracepoint_entry_t {
+ struct tracepoint *tp;
+};
+
+static inline
+struct tracepoint *tracepoint_from_entry(const struct tracepoint_entry_t *ent)
+{
+ return ent->tp;
+}
+#endif
+
+extern struct tracepoint_entry_t const __start___tracepoints_ptrs[];
+extern struct tracepoint_entry_t const __stop___tracepoints_ptrs[];
+
/*
* We have no guarantee that gcc and the linker won't up-align the tracepoint
* structures, so we create an array of pointers that will be used for iteration
@@ -237,11 +273,9 @@ extern void syscall_unregfunc(void);
static const char __tpstrtab_##name[] \
__attribute__((section("__tracepoints_strings"))) = #name; \
struct tracepoint __tracepoint_##name \
- __attribute__((section("__tracepoints"))) = \
+ __attribute__((section("__tracepoints"))) __used = \
{ __tpstrtab_##name, STATIC_KEY_INIT_FALSE, reg, unreg, NULL };\
- static struct tracepoint * const __tracepoint_ptr_##name __used \
- __attribute__((section("__tracepoints_ptrs"))) = \
- &__tracepoint_##name;
+ __TRACEPOINT_ENTRY(name);
#define DEFINE_TRACE(name) \
DEFINE_TRACE_FN(name, NULL, NULL);
diff --git a/kernel/tracepoint.c b/kernel/tracepoint.c
index 685c50ae6300..21bc41454fd6 100644
--- a/kernel/tracepoint.c
+++ b/kernel/tracepoint.c
@@ -28,9 +28,6 @@
#include <linux/sched/task.h>
#include <linux/static_key.h>
-extern struct tracepoint * const __start___tracepoints_ptrs[];
-extern struct tracepoint * const __stop___tracepoints_ptrs[];
-
/* Set to 1 to enable tracepoint debug output */
static const int tracepoint_debug;
@@ -508,12 +505,12 @@ static void for_each_tracepoint_range(struct tracepoint * const *begin,
void (*fct)(struct tracepoint *tp, void *priv),
void *priv)
{
- struct tracepoint * const *iter;
+ struct tracepoint_entry_t const *iter;
if (!begin)
return;
for (iter = begin; iter < end; iter++)
- fct(*iter, priv);
+ fct(tracepoint_from_entry(iter), priv);
}
/**
--
2.11.0
^ permalink raw reply related [flat|nested] 24+ messages in thread
* Re: [PATCH v2 6/6] kernel: tracepoints: add support for relative references
2017-08-18 11:26 ` [PATCH v2 6/6] kernel: tracepoints: add support for relative references Ard Biesheuvel
2017-08-18 11:26 ` Ard Biesheuvel
@ 2017-08-18 11:44 ` Ard Biesheuvel
2017-08-18 11:44 ` Ard Biesheuvel
2017-08-18 13:43 ` Steven Rostedt
1 sibling, 2 replies; 24+ messages in thread
From: Ard Biesheuvel @ 2017-08-18 11:44 UTC (permalink / raw)
To: linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org
Cc: Ard Biesheuvel, H. Peter Anvin, Arnd Bergmann, Heiko Carstens,
Kees Cook, Will Deacon, Michael Ellerman, Thomas Garnier,
Thomas Gleixner, Serge E. Hallyn, Bjorn Helgaas,
Benjamin Herrenschmidt, Paul Mackerras, Catalin Marinas,
Petr Mladek, Ingo Molnar, James Morris, Andrew Morton,
Joe Perches, Nicolas Pitre, Steve
On 18 August 2017 at 12:26, Ard Biesheuvel <ard.biesheuvel@linaro.org> wrote:
> To avoid the need for relocating absolute references to tracepoint
> structures at boot time when running relocatable kernels (which may
> take a disproportionate amount of space), add the option to emit
> these tables as relative references instead.
>
> Cc: Steven Rostedt <rostedt@goodmis.org>
> Cc: Ingo Molnar <mingo@redhat.com>
> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
> ---
> include/linux/tracepoint.h | 42 ++++++++++++++++++--
> kernel/tracepoint.c | 7 +---
> 2 files changed, 40 insertions(+), 9 deletions(-)
>
> diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h
> index a26ffbe09e71..68701821933a 100644
> --- a/include/linux/tracepoint.h
> +++ b/include/linux/tracepoint.h
> @@ -228,6 +228,42 @@ extern void syscall_unregfunc(void);
> return static_key_false(&__tracepoint_##name.key); \
> }
>
> +#ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
> +#define __TRACEPOINT_ENTRY(name) \
> + asm(" .section \"__tracepoints_ptrs\", \"a\"\n" \
> + " .balign 4\n" \
> + " .long " VMLINUX_SYMBOL_STR(__tracepoint_##name) " - .\n"\
> + " .previous\n")
> +
> +struct tracepoint_entry_t {
> + int tp_offset;
> +};
> +
> +static inline
> +struct tracepoint *tracepoint_from_entry(const struct tracepoint_entry_t *ent)
> +{
> + return (struct tracepoint *)((unsigned long)ent + ent->tp_offset);
> +}
> +#else
> +#define __TRACEPOINT_ENTRY(name) \
> + static struct tracepoint * const __tracepoint_ptr_##name __used \
> + __attribute__((section("__tracepoints_ptrs"))) = \
> + &__tracepoint_##name
> +
> +struct tracepoint_entry_t {
> + struct tracepoint *tp;
> +};
> +
> +static inline
> +struct tracepoint *tracepoint_from_entry(const struct tracepoint_entry_t *ent)
> +{
> + return ent->tp;
> +}
> +#endif
> +
> +extern struct tracepoint_entry_t const __start___tracepoints_ptrs[];
> +extern struct tracepoint_entry_t const __stop___tracepoints_ptrs[];
> +
It appears the stuff above needs to be move inside the double-include
guard (which oddly enough does not cover the entire file)
> /*
> * We have no guarantee that gcc and the linker won't up-align the tracepoint
> * structures, so we create an array of pointers that will be used for iteration
> @@ -237,11 +273,9 @@ extern void syscall_unregfunc(void);
> static const char __tpstrtab_##name[] \
> __attribute__((section("__tracepoints_strings"))) = #name; \
> struct tracepoint __tracepoint_##name \
> - __attribute__((section("__tracepoints"))) = \
> + __attribute__((section("__tracepoints"))) __used = \
> { __tpstrtab_##name, STATIC_KEY_INIT_FALSE, reg, unreg, NULL };\
> - static struct tracepoint * const __tracepoint_ptr_##name __used \
> - __attribute__((section("__tracepoints_ptrs"))) = \
> - &__tracepoint_##name;
> + __TRACEPOINT_ENTRY(name);
>
> #define DEFINE_TRACE(name) \
> DEFINE_TRACE_FN(name, NULL, NULL);
> diff --git a/kernel/tracepoint.c b/kernel/tracepoint.c
> index 685c50ae6300..21bc41454fd6 100644
> --- a/kernel/tracepoint.c
> +++ b/kernel/tracepoint.c
> @@ -28,9 +28,6 @@
> #include <linux/sched/task.h>
> #include <linux/static_key.h>
>
> -extern struct tracepoint * const __start___tracepoints_ptrs[];
> -extern struct tracepoint * const __stop___tracepoints_ptrs[];
> -
> /* Set to 1 to enable tracepoint debug output */
> static const int tracepoint_debug;
>
> @@ -508,12 +505,12 @@ static void for_each_tracepoint_range(struct tracepoint * const *begin,
> void (*fct)(struct tracepoint *tp, void *priv),
> void *priv)
> {
> - struct tracepoint * const *iter;
> + struct tracepoint_entry_t const *iter;
>
> if (!begin)
> return;
> for (iter = begin; iter < end; iter++)
> - fct(*iter, priv);
> + fct(tracepoint_from_entry(iter), priv);
> }
>
> /**
> --
> 2.11.0
>
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH v2 6/6] kernel: tracepoints: add support for relative references
2017-08-18 11:44 ` Ard Biesheuvel
@ 2017-08-18 11:44 ` Ard Biesheuvel
2017-08-18 13:43 ` Steven Rostedt
1 sibling, 0 replies; 24+ messages in thread
From: Ard Biesheuvel @ 2017-08-18 11:44 UTC (permalink / raw)
To: linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org
Cc: Ard Biesheuvel, H. Peter Anvin, Arnd Bergmann, Heiko Carstens,
Kees Cook, Will Deacon, Michael Ellerman, Thomas Garnier,
Thomas Gleixner, Serge E. Hallyn, Bjorn Helgaas,
Benjamin Herrenschmidt, Paul Mackerras, Catalin Marinas,
Petr Mladek, Ingo Molnar, James Morris, Andrew Morton,
Joe Perches, Nicolas Pitre, Steven Rostedt, Martin Schwidefsky,
Sergey Senozhatsky, Linus Torvalds, Andy Whitcroft, Jessica Yu
On 18 August 2017 at 12:26, Ard Biesheuvel <ard.biesheuvel@linaro.org> wrote:
> To avoid the need for relocating absolute references to tracepoint
> structures at boot time when running relocatable kernels (which may
> take a disproportionate amount of space), add the option to emit
> these tables as relative references instead.
>
> Cc: Steven Rostedt <rostedt@goodmis.org>
> Cc: Ingo Molnar <mingo@redhat.com>
> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
> ---
> include/linux/tracepoint.h | 42 ++++++++++++++++++--
> kernel/tracepoint.c | 7 +---
> 2 files changed, 40 insertions(+), 9 deletions(-)
>
> diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h
> index a26ffbe09e71..68701821933a 100644
> --- a/include/linux/tracepoint.h
> +++ b/include/linux/tracepoint.h
> @@ -228,6 +228,42 @@ extern void syscall_unregfunc(void);
> return static_key_false(&__tracepoint_##name.key); \
> }
>
> +#ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
> +#define __TRACEPOINT_ENTRY(name) \
> + asm(" .section \"__tracepoints_ptrs\", \"a\"\n" \
> + " .balign 4\n" \
> + " .long " VMLINUX_SYMBOL_STR(__tracepoint_##name) " - .\n"\
> + " .previous\n")
> +
> +struct tracepoint_entry_t {
> + int tp_offset;
> +};
> +
> +static inline
> +struct tracepoint *tracepoint_from_entry(const struct tracepoint_entry_t *ent)
> +{
> + return (struct tracepoint *)((unsigned long)ent + ent->tp_offset);
> +}
> +#else
> +#define __TRACEPOINT_ENTRY(name) \
> + static struct tracepoint * const __tracepoint_ptr_##name __used \
> + __attribute__((section("__tracepoints_ptrs"))) = \
> + &__tracepoint_##name
> +
> +struct tracepoint_entry_t {
> + struct tracepoint *tp;
> +};
> +
> +static inline
> +struct tracepoint *tracepoint_from_entry(const struct tracepoint_entry_t *ent)
> +{
> + return ent->tp;
> +}
> +#endif
> +
> +extern struct tracepoint_entry_t const __start___tracepoints_ptrs[];
> +extern struct tracepoint_entry_t const __stop___tracepoints_ptrs[];
> +
It appears the stuff above needs to be move inside the double-include
guard (which oddly enough does not cover the entire file)
> /*
> * We have no guarantee that gcc and the linker won't up-align the tracepoint
> * structures, so we create an array of pointers that will be used for iteration
> @@ -237,11 +273,9 @@ extern void syscall_unregfunc(void);
> static const char __tpstrtab_##name[] \
> __attribute__((section("__tracepoints_strings"))) = #name; \
> struct tracepoint __tracepoint_##name \
> - __attribute__((section("__tracepoints"))) = \
> + __attribute__((section("__tracepoints"))) __used = \
> { __tpstrtab_##name, STATIC_KEY_INIT_FALSE, reg, unreg, NULL };\
> - static struct tracepoint * const __tracepoint_ptr_##name __used \
> - __attribute__((section("__tracepoints_ptrs"))) = \
> - &__tracepoint_##name;
> + __TRACEPOINT_ENTRY(name);
>
> #define DEFINE_TRACE(name) \
> DEFINE_TRACE_FN(name, NULL, NULL);
> diff --git a/kernel/tracepoint.c b/kernel/tracepoint.c
> index 685c50ae6300..21bc41454fd6 100644
> --- a/kernel/tracepoint.c
> +++ b/kernel/tracepoint.c
> @@ -28,9 +28,6 @@
> #include <linux/sched/task.h>
> #include <linux/static_key.h>
>
> -extern struct tracepoint * const __start___tracepoints_ptrs[];
> -extern struct tracepoint * const __stop___tracepoints_ptrs[];
> -
> /* Set to 1 to enable tracepoint debug output */
> static const int tracepoint_debug;
>
> @@ -508,12 +505,12 @@ static void for_each_tracepoint_range(struct tracepoint * const *begin,
> void (*fct)(struct tracepoint *tp, void *priv),
> void *priv)
> {
> - struct tracepoint * const *iter;
> + struct tracepoint_entry_t const *iter;
>
> if (!begin)
> return;
> for (iter = begin; iter < end; iter++)
> - fct(*iter, priv);
> + fct(tracepoint_from_entry(iter), priv);
> }
>
> /**
> --
> 2.11.0
>
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH v2 6/6] kernel: tracepoints: add support for relative references
2017-08-18 11:44 ` Ard Biesheuvel
2017-08-18 11:44 ` Ard Biesheuvel
@ 2017-08-18 13:43 ` Steven Rostedt
2017-08-18 13:43 ` Steven Rostedt
2017-08-18 13:44 ` Ard Biesheuvel
1 sibling, 2 replies; 24+ messages in thread
From: Steven Rostedt @ 2017-08-18 13:43 UTC (permalink / raw)
To: Ard Biesheuvel
Cc: linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org,
H. Peter Anvin, Arnd Bergmann, Heiko Carstens, Kees Cook,
Will Deacon, Michael Ellerman, Thomas Garnier, Thomas Gleixner,
Serge E. Hallyn, Bjorn Helgaas, Benjamin Herrenschmidt,
Paul Mackerras, Catalin Marinas, Petr Mladek, Ingo Molnar,
James Morris, Andrew Morton
On Fri, 18 Aug 2017 12:44:17 +0100
Ard Biesheuvel <ard.biesheuvel@linaro.org> wrote:
> On 18 August 2017 at 12:26, Ard Biesheuvel <ard.biesheuvel@linaro.org> wrote:
> > To avoid the need for relocating absolute references to tracepoint
> > structures at boot time when running relocatable kernels (which may
> > take a disproportionate amount of space), add the option to emit
> > these tables as relative references instead.
> >
> > Cc: Steven Rostedt <rostedt@goodmis.org>
> > Cc: Ingo Molnar <mingo@redhat.com>
> > Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
> > ---
> > include/linux/tracepoint.h | 42 ++++++++++++++++++--
> > kernel/tracepoint.c | 7 +---
> > 2 files changed, 40 insertions(+), 9 deletions(-)
> >
> > diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h
> > index a26ffbe09e71..68701821933a 100644
> > --- a/include/linux/tracepoint.h
> > +++ b/include/linux/tracepoint.h
> > @@ -228,6 +228,42 @@ extern void syscall_unregfunc(void);
> > return static_key_false(&__tracepoint_##name.key); \
> > }
> >
> > +#ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
> > +#define __TRACEPOINT_ENTRY(name) \
> > + asm(" .section \"__tracepoints_ptrs\", \"a\"\n" \
> > + " .balign 4\n" \
> > + " .long " VMLINUX_SYMBOL_STR(__tracepoint_##name) " - .\n"\
> > + " .previous\n")
> > +
> > +struct tracepoint_entry_t {
> > + int tp_offset;
> > +};
> > +
> > +static inline
> > +struct tracepoint *tracepoint_from_entry(const struct tracepoint_entry_t *ent)
> > +{
> > + return (struct tracepoint *)((unsigned long)ent + ent->tp_offset);
> > +}
> > +#else
> > +#define __TRACEPOINT_ENTRY(name) \
> > + static struct tracepoint * const __tracepoint_ptr_##name __used \
> > + __attribute__((section("__tracepoints_ptrs"))) = \
> > + &__tracepoint_##name
> > +
> > +struct tracepoint_entry_t {
> > + struct tracepoint *tp;
> > +};
> > +
> > +static inline
> > +struct tracepoint *tracepoint_from_entry(const struct tracepoint_entry_t *ent)
> > +{
> > + return ent->tp;
> > +}
> > +#endif
> > +
> > +extern struct tracepoint_entry_t const __start___tracepoints_ptrs[];
> > +extern struct tracepoint_entry_t const __stop___tracepoints_ptrs[];
> > +
>
> It appears the stuff above needs to be move inside the double-include
> guard (which oddly enough does not cover the entire file)
Why was this moved to the header file? To fulfill some checkpatch
warning?
-- Steve
>
> > /*
> > * We have no guarantee that gcc and the linker won't up-align the tracepoint
> > * structures, so we create an array of pointers that will be used for iteration
> > @@ -237,11 +273,9 @@ extern void syscall_unregfunc(void);
> > static const char __tpstrtab_##name[] \
> > __attribute__((section("__tracepoints_strings"))) = #name; \
> > struct tracepoint __tracepoint_##name \
> > - __attribute__((section("__tracepoints"))) = \
> > + __attribute__((section("__tracepoints"))) __used = \
> > { __tpstrtab_##name, STATIC_KEY_INIT_FALSE, reg, unreg, NULL };\
> > - static struct tracepoint * const __tracepoint_ptr_##name __used \
> > - __attribute__((section("__tracepoints_ptrs"))) = \
> > - &__tracepoint_##name;
> > + __TRACEPOINT_ENTRY(name);
> >
> > #define DEFINE_TRACE(name) \
> > DEFINE_TRACE_FN(name, NULL, NULL);
> > diff --git a/kernel/tracepoint.c b/kernel/tracepoint.c
> > index 685c50ae6300..21bc41454fd6 100644
> > --- a/kernel/tracepoint.c
> > +++ b/kernel/tracepoint.c
> > @@ -28,9 +28,6 @@
> > #include <linux/sched/task.h>
> > #include <linux/static_key.h>
> >
> > -extern struct tracepoint * const __start___tracepoints_ptrs[];
> > -extern struct tracepoint * const __stop___tracepoints_ptrs[];
> > -
> > /* Set to 1 to enable tracepoint debug output */
> > static const int tracepoint_debug;
> >
> > @@ -508,12 +505,12 @@ static void for_each_tracepoint_range(struct tracepoint * const *begin,
> > void (*fct)(struct tracepoint *tp, void *priv),
> > void *priv)
> > {
> > - struct tracepoint * const *iter;
> > + struct tracepoint_entry_t const *iter;
> >
> > if (!begin)
> > return;
> > for (iter = begin; iter < end; iter++)
> > - fct(*iter, priv);
> > + fct(tracepoint_from_entry(iter), priv);
> > }
> >
> > /**
> > --
> > 2.11.0
> >
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH v2 6/6] kernel: tracepoints: add support for relative references
2017-08-18 13:43 ` Steven Rostedt
@ 2017-08-18 13:43 ` Steven Rostedt
2017-08-18 13:44 ` Ard Biesheuvel
1 sibling, 0 replies; 24+ messages in thread
From: Steven Rostedt @ 2017-08-18 13:43 UTC (permalink / raw)
To: Ard Biesheuvel
Cc: linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org,
H. Peter Anvin, Arnd Bergmann, Heiko Carstens, Kees Cook,
Will Deacon, Michael Ellerman, Thomas Garnier, Thomas Gleixner,
Serge E. Hallyn, Bjorn Helgaas, Benjamin Herrenschmidt,
Paul Mackerras, Catalin Marinas, Petr Mladek, Ingo Molnar,
James Morris, Andrew Morton, Joe Perches, Nicolas Pitre,
Martin Schwidefsky, Sergey Senozhatsky, Linus Torvalds,
Andy Whitcroft, Jessica Yu
On Fri, 18 Aug 2017 12:44:17 +0100
Ard Biesheuvel <ard.biesheuvel@linaro.org> wrote:
> On 18 August 2017 at 12:26, Ard Biesheuvel <ard.biesheuvel@linaro.org> wrote:
> > To avoid the need for relocating absolute references to tracepoint
> > structures at boot time when running relocatable kernels (which may
> > take a disproportionate amount of space), add the option to emit
> > these tables as relative references instead.
> >
> > Cc: Steven Rostedt <rostedt@goodmis.org>
> > Cc: Ingo Molnar <mingo@redhat.com>
> > Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
> > ---
> > include/linux/tracepoint.h | 42 ++++++++++++++++++--
> > kernel/tracepoint.c | 7 +---
> > 2 files changed, 40 insertions(+), 9 deletions(-)
> >
> > diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h
> > index a26ffbe09e71..68701821933a 100644
> > --- a/include/linux/tracepoint.h
> > +++ b/include/linux/tracepoint.h
> > @@ -228,6 +228,42 @@ extern void syscall_unregfunc(void);
> > return static_key_false(&__tracepoint_##name.key); \
> > }
> >
> > +#ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
> > +#define __TRACEPOINT_ENTRY(name) \
> > + asm(" .section \"__tracepoints_ptrs\", \"a\"\n" \
> > + " .balign 4\n" \
> > + " .long " VMLINUX_SYMBOL_STR(__tracepoint_##name) " - .\n"\
> > + " .previous\n")
> > +
> > +struct tracepoint_entry_t {
> > + int tp_offset;
> > +};
> > +
> > +static inline
> > +struct tracepoint *tracepoint_from_entry(const struct tracepoint_entry_t *ent)
> > +{
> > + return (struct tracepoint *)((unsigned long)ent + ent->tp_offset);
> > +}
> > +#else
> > +#define __TRACEPOINT_ENTRY(name) \
> > + static struct tracepoint * const __tracepoint_ptr_##name __used \
> > + __attribute__((section("__tracepoints_ptrs"))) = \
> > + &__tracepoint_##name
> > +
> > +struct tracepoint_entry_t {
> > + struct tracepoint *tp;
> > +};
> > +
> > +static inline
> > +struct tracepoint *tracepoint_from_entry(const struct tracepoint_entry_t *ent)
> > +{
> > + return ent->tp;
> > +}
> > +#endif
> > +
> > +extern struct tracepoint_entry_t const __start___tracepoints_ptrs[];
> > +extern struct tracepoint_entry_t const __stop___tracepoints_ptrs[];
> > +
>
> It appears the stuff above needs to be move inside the double-include
> guard (which oddly enough does not cover the entire file)
Why was this moved to the header file? To fulfill some checkpatch
warning?
-- Steve
>
> > /*
> > * We have no guarantee that gcc and the linker won't up-align the tracepoint
> > * structures, so we create an array of pointers that will be used for iteration
> > @@ -237,11 +273,9 @@ extern void syscall_unregfunc(void);
> > static const char __tpstrtab_##name[] \
> > __attribute__((section("__tracepoints_strings"))) = #name; \
> > struct tracepoint __tracepoint_##name \
> > - __attribute__((section("__tracepoints"))) = \
> > + __attribute__((section("__tracepoints"))) __used = \
> > { __tpstrtab_##name, STATIC_KEY_INIT_FALSE, reg, unreg, NULL };\
> > - static struct tracepoint * const __tracepoint_ptr_##name __used \
> > - __attribute__((section("__tracepoints_ptrs"))) = \
> > - &__tracepoint_##name;
> > + __TRACEPOINT_ENTRY(name);
> >
> > #define DEFINE_TRACE(name) \
> > DEFINE_TRACE_FN(name, NULL, NULL);
> > diff --git a/kernel/tracepoint.c b/kernel/tracepoint.c
> > index 685c50ae6300..21bc41454fd6 100644
> > --- a/kernel/tracepoint.c
> > +++ b/kernel/tracepoint.c
> > @@ -28,9 +28,6 @@
> > #include <linux/sched/task.h>
> > #include <linux/static_key.h>
> >
> > -extern struct tracepoint * const __start___tracepoints_ptrs[];
> > -extern struct tracepoint * const __stop___tracepoints_ptrs[];
> > -
> > /* Set to 1 to enable tracepoint debug output */
> > static const int tracepoint_debug;
> >
> > @@ -508,12 +505,12 @@ static void for_each_tracepoint_range(struct tracepoint * const *begin,
> > void (*fct)(struct tracepoint *tp, void *priv),
> > void *priv)
> > {
> > - struct tracepoint * const *iter;
> > + struct tracepoint_entry_t const *iter;
> >
> > if (!begin)
> > return;
> > for (iter = begin; iter < end; iter++)
> > - fct(*iter, priv);
> > + fct(tracepoint_from_entry(iter), priv);
> > }
> >
> > /**
> > --
> > 2.11.0
> >
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH v2 6/6] kernel: tracepoints: add support for relative references
2017-08-18 13:43 ` Steven Rostedt
2017-08-18 13:43 ` Steven Rostedt
@ 2017-08-18 13:44 ` Ard Biesheuvel
2017-08-18 13:44 ` Ard Biesheuvel
2017-08-18 13:52 ` Steven Rostedt
1 sibling, 2 replies; 24+ messages in thread
From: Ard Biesheuvel @ 2017-08-18 13:44 UTC (permalink / raw)
To: Steven Rostedt
Cc: linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org,
H. Peter Anvin, Arnd Bergmann, Heiko Carstens, Kees Cook,
Will Deacon, Michael Ellerman, Thomas Garnier, Thomas Gleixner,
Serge E. Hallyn, Bjorn Helgaas, Benjamin Herrenschmidt,
Paul Mackerras, Catalin Marinas, Petr Mladek, Ingo Molnar,
James Morris, Andrew Morton
On 18 August 2017 at 14:43, Steven Rostedt <rostedt@goodmis.org> wrote:
> On Fri, 18 Aug 2017 12:44:17 +0100
> Ard Biesheuvel <ard.biesheuvel@linaro.org> wrote:
>
>> On 18 August 2017 at 12:26, Ard Biesheuvel <ard.biesheuvel@linaro.org> wrote:
>> > To avoid the need for relocating absolute references to tracepoint
>> > structures at boot time when running relocatable kernels (which may
>> > take a disproportionate amount of space), add the option to emit
>> > these tables as relative references instead.
>> >
>> > Cc: Steven Rostedt <rostedt@goodmis.org>
>> > Cc: Ingo Molnar <mingo@redhat.com>
>> > Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
>> > ---
>> > include/linux/tracepoint.h | 42 ++++++++++++++++++--
>> > kernel/tracepoint.c | 7 +---
>> > 2 files changed, 40 insertions(+), 9 deletions(-)
>> >
>> > diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h
>> > index a26ffbe09e71..68701821933a 100644
>> > --- a/include/linux/tracepoint.h
>> > +++ b/include/linux/tracepoint.h
>> > @@ -228,6 +228,42 @@ extern void syscall_unregfunc(void);
>> > return static_key_false(&__tracepoint_##name.key); \
>> > }
>> >
>> > +#ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
>> > +#define __TRACEPOINT_ENTRY(name) \
>> > + asm(" .section \"__tracepoints_ptrs\", \"a\"\n" \
>> > + " .balign 4\n" \
>> > + " .long " VMLINUX_SYMBOL_STR(__tracepoint_##name) " - .\n"\
>> > + " .previous\n")
>> > +
>> > +struct tracepoint_entry_t {
>> > + int tp_offset;
>> > +};
>> > +
>> > +static inline
>> > +struct tracepoint *tracepoint_from_entry(const struct tracepoint_entry_t *ent)
>> > +{
>> > + return (struct tracepoint *)((unsigned long)ent + ent->tp_offset);
>> > +}
>> > +#else
>> > +#define __TRACEPOINT_ENTRY(name) \
>> > + static struct tracepoint * const __tracepoint_ptr_##name __used \
>> > + __attribute__((section("__tracepoints_ptrs"))) = \
>> > + &__tracepoint_##name
>> > +
>> > +struct tracepoint_entry_t {
>> > + struct tracepoint *tp;
>> > +};
>> > +
>> > +static inline
>> > +struct tracepoint *tracepoint_from_entry(const struct tracepoint_entry_t *ent)
>> > +{
>> > + return ent->tp;
>> > +}
>> > +#endif
>> > +
>> > +extern struct tracepoint_entry_t const __start___tracepoints_ptrs[];
>> > +extern struct tracepoint_entry_t const __stop___tracepoints_ptrs[];
>> > +
>>
>> It appears the stuff above needs to be move inside the double-include
>> guard (which oddly enough does not cover the entire file)
>
> Why was this moved to the header file? To fulfill some checkpatch
> warning?
>
Yes.
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH v2 6/6] kernel: tracepoints: add support for relative references
2017-08-18 13:44 ` Ard Biesheuvel
@ 2017-08-18 13:44 ` Ard Biesheuvel
2017-08-18 13:52 ` Steven Rostedt
1 sibling, 0 replies; 24+ messages in thread
From: Ard Biesheuvel @ 2017-08-18 13:44 UTC (permalink / raw)
To: Steven Rostedt
Cc: linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org,
H. Peter Anvin, Arnd Bergmann, Heiko Carstens, Kees Cook,
Will Deacon, Michael Ellerman, Thomas Garnier, Thomas Gleixner,
Serge E. Hallyn, Bjorn Helgaas, Benjamin Herrenschmidt,
Paul Mackerras, Catalin Marinas, Petr Mladek, Ingo Molnar,
James Morris, Andrew Morton, Joe Perches, Nicolas Pitre,
Martin Schwidefsky, Sergey Senozhatsky, Linus Torvalds,
Andy Whitcroft, Jessica Yu
On 18 August 2017 at 14:43, Steven Rostedt <rostedt@goodmis.org> wrote:
> On Fri, 18 Aug 2017 12:44:17 +0100
> Ard Biesheuvel <ard.biesheuvel@linaro.org> wrote:
>
>> On 18 August 2017 at 12:26, Ard Biesheuvel <ard.biesheuvel@linaro.org> wrote:
>> > To avoid the need for relocating absolute references to tracepoint
>> > structures at boot time when running relocatable kernels (which may
>> > take a disproportionate amount of space), add the option to emit
>> > these tables as relative references instead.
>> >
>> > Cc: Steven Rostedt <rostedt@goodmis.org>
>> > Cc: Ingo Molnar <mingo@redhat.com>
>> > Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
>> > ---
>> > include/linux/tracepoint.h | 42 ++++++++++++++++++--
>> > kernel/tracepoint.c | 7 +---
>> > 2 files changed, 40 insertions(+), 9 deletions(-)
>> >
>> > diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h
>> > index a26ffbe09e71..68701821933a 100644
>> > --- a/include/linux/tracepoint.h
>> > +++ b/include/linux/tracepoint.h
>> > @@ -228,6 +228,42 @@ extern void syscall_unregfunc(void);
>> > return static_key_false(&__tracepoint_##name.key); \
>> > }
>> >
>> > +#ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
>> > +#define __TRACEPOINT_ENTRY(name) \
>> > + asm(" .section \"__tracepoints_ptrs\", \"a\"\n" \
>> > + " .balign 4\n" \
>> > + " .long " VMLINUX_SYMBOL_STR(__tracepoint_##name) " - .\n"\
>> > + " .previous\n")
>> > +
>> > +struct tracepoint_entry_t {
>> > + int tp_offset;
>> > +};
>> > +
>> > +static inline
>> > +struct tracepoint *tracepoint_from_entry(const struct tracepoint_entry_t *ent)
>> > +{
>> > + return (struct tracepoint *)((unsigned long)ent + ent->tp_offset);
>> > +}
>> > +#else
>> > +#define __TRACEPOINT_ENTRY(name) \
>> > + static struct tracepoint * const __tracepoint_ptr_##name __used \
>> > + __attribute__((section("__tracepoints_ptrs"))) = \
>> > + &__tracepoint_##name
>> > +
>> > +struct tracepoint_entry_t {
>> > + struct tracepoint *tp;
>> > +};
>> > +
>> > +static inline
>> > +struct tracepoint *tracepoint_from_entry(const struct tracepoint_entry_t *ent)
>> > +{
>> > + return ent->tp;
>> > +}
>> > +#endif
>> > +
>> > +extern struct tracepoint_entry_t const __start___tracepoints_ptrs[];
>> > +extern struct tracepoint_entry_t const __stop___tracepoints_ptrs[];
>> > +
>>
>> It appears the stuff above needs to be move inside the double-include
>> guard (which oddly enough does not cover the entire file)
>
> Why was this moved to the header file? To fulfill some checkpatch
> warning?
>
Yes.
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH v2 6/6] kernel: tracepoints: add support for relative references
2017-08-18 13:44 ` Ard Biesheuvel
2017-08-18 13:44 ` Ard Biesheuvel
@ 2017-08-18 13:52 ` Steven Rostedt
2017-08-18 13:52 ` Steven Rostedt
2017-08-18 13:54 ` Ard Biesheuvel
1 sibling, 2 replies; 24+ messages in thread
From: Steven Rostedt @ 2017-08-18 13:52 UTC (permalink / raw)
To: Ard Biesheuvel
Cc: linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org,
H. Peter Anvin, Arnd Bergmann, Heiko Carstens, Kees Cook,
Will Deacon, Michael Ellerman, Thomas Garnier, Thomas Gleixner,
Serge E. Hallyn, Bjorn Helgaas, Benjamin Herrenschmidt,
Paul Mackerras, Catalin Marinas, Petr Mladek, Ingo Molnar,
James Morris, Andrew Morton
On Fri, 18 Aug 2017 14:44:15 +0100
Ard Biesheuvel <ard.biesheuvel@linaro.org> wrote:
> >> It appears the stuff above needs to be move inside the double-include
> >> guard (which oddly enough does not cover the entire file)
> >
> > Why was this moved to the header file? To fulfill some checkpatch
> > warning?
> >
>
> Yes.
My preference is to ignore that checkpatch warning. The section
variables are created by linker magic, and not normal "extern"
variables. They are only used in one location, and I like to keep them
where they are used, and not be something other places might think they
can be used. In other words, keep them by the C code, and out of
headers.
Tracepoints and linker/asm work always triggers a lot of bogus
checkpatch warnings. Which is unfortunate. :-/
Thanks!
-- Steve
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH v2 6/6] kernel: tracepoints: add support for relative references
2017-08-18 13:52 ` Steven Rostedt
@ 2017-08-18 13:52 ` Steven Rostedt
2017-08-18 13:54 ` Ard Biesheuvel
1 sibling, 0 replies; 24+ messages in thread
From: Steven Rostedt @ 2017-08-18 13:52 UTC (permalink / raw)
To: Ard Biesheuvel
Cc: linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org,
H. Peter Anvin, Arnd Bergmann, Heiko Carstens, Kees Cook,
Will Deacon, Michael Ellerman, Thomas Garnier, Thomas Gleixner,
Serge E. Hallyn, Bjorn Helgaas, Benjamin Herrenschmidt,
Paul Mackerras, Catalin Marinas, Petr Mladek, Ingo Molnar,
James Morris, Andrew Morton, Joe Perches, Nicolas Pitre,
Martin Schwidefsky, Sergey Senozhatsky, Linus Torvalds,
Andy Whitcroft, Jessica Yu
On Fri, 18 Aug 2017 14:44:15 +0100
Ard Biesheuvel <ard.biesheuvel@linaro.org> wrote:
> >> It appears the stuff above needs to be move inside the double-include
> >> guard (which oddly enough does not cover the entire file)
> >
> > Why was this moved to the header file? To fulfill some checkpatch
> > warning?
> >
>
> Yes.
My preference is to ignore that checkpatch warning. The section
variables are created by linker magic, and not normal "extern"
variables. They are only used in one location, and I like to keep them
where they are used, and not be something other places might think they
can be used. In other words, keep them by the C code, and out of
headers.
Tracepoints and linker/asm work always triggers a lot of bogus
checkpatch warnings. Which is unfortunate. :-/
Thanks!
-- Steve
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH v2 6/6] kernel: tracepoints: add support for relative references
2017-08-18 13:52 ` Steven Rostedt
2017-08-18 13:52 ` Steven Rostedt
@ 2017-08-18 13:54 ` Ard Biesheuvel
2017-08-18 13:54 ` Ard Biesheuvel
1 sibling, 1 reply; 24+ messages in thread
From: Ard Biesheuvel @ 2017-08-18 13:54 UTC (permalink / raw)
To: Steven Rostedt
Cc: linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org,
H. Peter Anvin, Arnd Bergmann, Heiko Carstens, Kees Cook,
Will Deacon, Michael Ellerman, Thomas Garnier, Thomas Gleixner,
Serge E. Hallyn, Bjorn Helgaas, Benjamin Herrenschmidt,
Paul Mackerras, Catalin Marinas, Petr Mladek, Ingo Molnar,
James Morris, Andrew Morton
On 18 August 2017 at 14:52, Steven Rostedt <rostedt@goodmis.org> wrote:
> On Fri, 18 Aug 2017 14:44:15 +0100
> Ard Biesheuvel <ard.biesheuvel@linaro.org> wrote:
>
>> >> It appears the stuff above needs to be move inside the double-include
>> >> guard (which oddly enough does not cover the entire file)
>> >
>> > Why was this moved to the header file? To fulfill some checkpatch
>> > warning?
>> >
>>
>> Yes.
>
> My preference is to ignore that checkpatch warning. The section
> variables are created by linker magic, and not normal "extern"
> variables. They are only used in one location, and I like to keep them
> where they are used, and not be something other places might think they
> can be used. In other words, keep them by the C code, and out of
> headers.
>
> Tracepoints and linker/asm work always triggers a lot of bogus
> checkpatch warnings. Which is unfortunate. :-/
>
Actually, I couldn't agree more. I will backpedal on the checkpatch
appeasement in v3 in general.
Thanks,
Ard.
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH v2 6/6] kernel: tracepoints: add support for relative references
2017-08-18 13:54 ` Ard Biesheuvel
@ 2017-08-18 13:54 ` Ard Biesheuvel
0 siblings, 0 replies; 24+ messages in thread
From: Ard Biesheuvel @ 2017-08-18 13:54 UTC (permalink / raw)
To: Steven Rostedt
Cc: linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org,
H. Peter Anvin, Arnd Bergmann, Heiko Carstens, Kees Cook,
Will Deacon, Michael Ellerman, Thomas Garnier, Thomas Gleixner,
Serge E. Hallyn, Bjorn Helgaas, Benjamin Herrenschmidt,
Paul Mackerras, Catalin Marinas, Petr Mladek, Ingo Molnar,
James Morris, Andrew Morton, Joe Perches, Nicolas Pitre,
Martin Schwidefsky, Sergey Senozhatsky, Linus Torvalds,
Andy Whitcroft, Jessica Yu
On 18 August 2017 at 14:52, Steven Rostedt <rostedt@goodmis.org> wrote:
> On Fri, 18 Aug 2017 14:44:15 +0100
> Ard Biesheuvel <ard.biesheuvel@linaro.org> wrote:
>
>> >> It appears the stuff above needs to be move inside the double-include
>> >> guard (which oddly enough does not cover the entire file)
>> >
>> > Why was this moved to the header file? To fulfill some checkpatch
>> > warning?
>> >
>>
>> Yes.
>
> My preference is to ignore that checkpatch warning. The section
> variables are created by linker magic, and not normal "extern"
> variables. They are only used in one location, and I like to keep them
> where they are used, and not be something other places might think they
> can be used. In other words, keep them by the C code, and out of
> headers.
>
> Tracepoints and linker/asm work always triggers a lot of bogus
> checkpatch warnings. Which is unfortunate. :-/
>
Actually, I couldn't agree more. I will backpedal on the checkpatch
appeasement in v3 in general.
Thanks,
Ard.
^ permalink raw reply [flat|nested] 24+ messages in thread
end of thread, other threads:[~2017-08-18 13:54 UTC | newest]
Thread overview: 24+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-08-18 11:26 [PATCH v2 0/6] add support for relative references in special sections Ard Biesheuvel
2017-08-18 11:26 ` Ard Biesheuvel
2017-08-18 11:26 ` [PATCH v2 1/6] arch: enable relative relocations for arm64, power, x86, s390 and x86 Ard Biesheuvel
2017-08-18 11:26 ` Ard Biesheuvel
2017-08-18 11:26 ` [PATCH v2 2/6] module: use relative references for __ksymtab entries Ard Biesheuvel
2017-08-18 11:26 ` Ard Biesheuvel
2017-08-18 11:26 ` [PATCH v2 3/6] treewide: add missing trailing semicolons to initcall() invocations Ard Biesheuvel
2017-08-18 11:26 ` Ard Biesheuvel
2017-08-18 11:26 ` [PATCH v2 4/6] init: allow initcall tables to be emitted using relative references Ard Biesheuvel
2017-08-18 11:26 ` Ard Biesheuvel
2017-08-18 11:26 ` [PATCH v2 5/6] drivers: pci: add support for relative addressing in quirk tables Ard Biesheuvel
2017-08-18 11:26 ` Ard Biesheuvel
2017-08-18 11:26 ` [PATCH v2 6/6] kernel: tracepoints: add support for relative references Ard Biesheuvel
2017-08-18 11:26 ` Ard Biesheuvel
2017-08-18 11:44 ` Ard Biesheuvel
2017-08-18 11:44 ` Ard Biesheuvel
2017-08-18 13:43 ` Steven Rostedt
2017-08-18 13:43 ` Steven Rostedt
2017-08-18 13:44 ` Ard Biesheuvel
2017-08-18 13:44 ` Ard Biesheuvel
2017-08-18 13:52 ` Steven Rostedt
2017-08-18 13:52 ` Steven Rostedt
2017-08-18 13:54 ` Ard Biesheuvel
2017-08-18 13:54 ` Ard Biesheuvel
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).