mbox series

[v7,0/2] ARM: Implement MODULE_PLT support in FTRACE

Message ID 20210127110944.41813-1-alexander.sverdlin@nokia.com (mailing list archive)
Headers show
Series ARM: Implement MODULE_PLT support in FTRACE | expand

Message

Alexander Sverdlin Jan. 27, 2021, 11:09 a.m. UTC
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(-)

Comments

Florian Fainelli Feb. 3, 2021, 6:23 p.m. UTC | #1
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?
Ard Biesheuvel Feb. 15, 2021, 6:31 p.m. UTC | #2
(+ 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?
Linus Walleij March 2, 2021, 8:29 a.m. UTC | #3
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
Alexander Sverdlin March 2, 2021, 10 a.m. UTC | #4
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");