Message ID | 20210127110944.41813-1-alexander.sverdlin@nokia.com (mailing list archive) |
---|---|
Headers | show |
Series | ARM: Implement MODULE_PLT support in FTRACE | expand |
On 1/27/21 3:09 AM, Alexander A Sverdlin wrote: > From: Alexander Sverdlin <alexander.sverdlin@nokia.com> > > FTRACE's function tracer currently doesn't always work on ARM with > MODULE_PLT option enabled. If the module is loaded too far, FTRACE's > code modifier cannot cope with introduced veneers and turns the > function tracer off globally. > > ARM64 already has a solution for the problem, refer to the following > patches: > > arm64: ftrace: emit ftrace-mod.o contents through code > arm64: module-plts: factor out PLT generation code for ftrace > arm64: ftrace: fix !CONFIG_ARM64_MODULE_PLTS kernels > arm64: ftrace: fix building without CONFIG_MODULES > arm64: ftrace: add support for far branches to dynamic ftrace > arm64: ftrace: don't validate branch via PLT in ftrace_make_nop() > > But the presented ARM variant has just a half of the footprint in terms of > the changed LoCs. It also retains the code validation-before-modification > instead of switching it off. Ard, Russell should this be sent to the patch tracker?
(+ Linus) On Wed, 3 Feb 2021 at 19:24, Florian Fainelli <f.fainelli@gmail.com> wrote: > > On 1/27/21 3:09 AM, Alexander A Sverdlin wrote: > > From: Alexander Sverdlin <alexander.sverdlin@nokia.com> > > > > FTRACE's function tracer currently doesn't always work on ARM with > > MODULE_PLT option enabled. If the module is loaded too far, FTRACE's > > code modifier cannot cope with introduced veneers and turns the > > function tracer off globally. > > > > ARM64 already has a solution for the problem, refer to the following > > patches: > > > > arm64: ftrace: emit ftrace-mod.o contents through code > > arm64: module-plts: factor out PLT generation code for ftrace > > arm64: ftrace: fix !CONFIG_ARM64_MODULE_PLTS kernels > > arm64: ftrace: fix building without CONFIG_MODULES > > arm64: ftrace: add support for far branches to dynamic ftrace > > arm64: ftrace: don't validate branch via PLT in ftrace_make_nop() > > > > But the presented ARM variant has just a half of the footprint in terms of > > the changed LoCs. It also retains the code validation-before-modification > > instead of switching it off. > > Ard, Russell should this be sent to the patch tracker? Apologies for the delay. Unfortunately, I don't have time to review this. Linus?
On Mon, Feb 15, 2021 at 7:32 PM Ard Biesheuvel <ardb@kernel.org> wrote: > > (+ Linus) > > On Wed, 3 Feb 2021 at 19:24, Florian Fainelli <f.fainelli@gmail.com> wrote: > > > > On 1/27/21 3:09 AM, Alexander A Sverdlin wrote: > > > From: Alexander Sverdlin <alexander.sverdlin@nokia.com> > > > > > > FTRACE's function tracer currently doesn't always work on ARM with > > > MODULE_PLT option enabled. If the module is loaded too far, FTRACE's > > > code modifier cannot cope with introduced veneers and turns the > > > function tracer off globally. > > > > > > ARM64 already has a solution for the problem, refer to the following > > > patches: > > > > > > arm64: ftrace: emit ftrace-mod.o contents through code > > > arm64: module-plts: factor out PLT generation code for ftrace > > > arm64: ftrace: fix !CONFIG_ARM64_MODULE_PLTS kernels > > > arm64: ftrace: fix building without CONFIG_MODULES > > > arm64: ftrace: add support for far branches to dynamic ftrace > > > arm64: ftrace: don't validate branch via PLT in ftrace_make_nop() > > > > > > But the presented ARM variant has just a half of the footprint in terms of > > > the changed LoCs. It also retains the code validation-before-modification > > > instead of switching it off. > > > > Ard, Russell should this be sent to the patch tracker? > > Apologies for the delay. Unfortunately, I don't have time to review this. > > Linus? I can look at them, I just need some starting strip because I honestly almost never use tracing, so I need to figure out how to provoke the error before the patches and then how to test that it is gone after. Any suggestions on a quick use case that illustrates how the problem manifest and how to test it is gone? The errors in patch 2, what do I need to configure in to get them? Does it manifest at modprobe? Yours, Linus Walleij
Hello Linus, On 02/03/2021 09:29, Linus Walleij wrote: >>>> FTRACE's function tracer currently doesn't always work on ARM with >>>> MODULE_PLT option enabled. If the module is loaded too far, FTRACE's First of all: config ARM_MODULE_PLTS bool "Use PLTs to allow module memory to spill over into vmalloc area" [...] > Any suggestions on a quick use case that illustrates how the problem > manifest and how to test it is gone? The errors in patch 2, what do > I need to configure in to get them? Does it manifest at modprobe? And then I use this module to test for the problem: /********************************************************************** * Author: Alexander Sverdlin <alexander.sverdlin@nokia.com> * * Copyright (c) 2018 Nokia * * SPDX-License-Identifier: GPL-2.0 * * This module is intended to test ARM MODULE_PLT functionality **********************************************************************/ #include <linux/types.h> #include <linux/kernel.h> #include <linux/module.h> static int fatmod_init(void) { asm volatile (".rept (6 * 1024 * 1024 / 2)\n\t" "nop\n\t" ".endr"); return 0; } module_init(fatmod_init); static void __exit fatmod_exit(void) { } module_exit(fatmod_exit); MODULE_AUTHOR("Alexander Sverdlin <alexander.sverdlin@nokia.com>"); MODULE_DESCRIPTION("ARM MODULE_PLT test module"); MODULE_LICENSE("GPL");
From: Alexander Sverdlin <alexander.sverdlin@nokia.com> FTRACE's function tracer currently doesn't always work on ARM with MODULE_PLT option enabled. If the module is loaded too far, FTRACE's code modifier cannot cope with introduced veneers and turns the function tracer off globally. ARM64 already has a solution for the problem, refer to the following patches: arm64: ftrace: emit ftrace-mod.o contents through code arm64: module-plts: factor out PLT generation code for ftrace arm64: ftrace: fix !CONFIG_ARM64_MODULE_PLTS kernels arm64: ftrace: fix building without CONFIG_MODULES arm64: ftrace: add support for far branches to dynamic ftrace arm64: ftrace: don't validate branch via PLT in ftrace_make_nop() But the presented ARM variant has just a half of the footprint in terms of the changed LoCs. It also retains the code validation-before-modification instead of switching it off. Changelog: v7: * rebased v6: * rebased v5: * BUILD_BUG_ON() ensures fixed_plts[] always fits one PLT block * use "for" loop instead of "while" * scripts/recordmcount is filtering reloc types v4: * Fixed build without CONFIG_FUNCTION_TRACER * Reorganized pre-allocated PLTs handling in get_module_plt(), now compiler eliminates the whole FTRACE-related handling code if ARRAY_SIZE(fixed_plts) == 0 v3: * Only extend struct dyn_arch_ftrace when ARM_MODULE_PLTS is enabled v2: * As suggested by Steven Rostedt, refrain from tree-wide API modification, save module pointer in struct dyn_arch_ftrace instead (PowerPC way) Alexander Sverdlin (2): ARM: PLT: Move struct plt_entries definition to header ARM: ftrace: Add MODULE_PLTS support arch/arm/include/asm/ftrace.h | 3 +++ arch/arm/include/asm/module.h | 10 +++++++++ arch/arm/kernel/ftrace.c | 46 ++++++++++++++++++++++++++++++++++++++-- arch/arm/kernel/module-plts.c | 49 +++++++++++++++++++++++++++++++++---------- 4 files changed, 95 insertions(+), 13 deletions(-)