All of lore.kernel.org
 help / color / mirror / Atom feed
From: Arnaldo Carvalho de Melo <arnaldo.melo@gmail.com>
To: Thomas Richter <tmricht@linux.ibm.com>
Cc: linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org,
	brueckner@linux.ibm.com, gor@linux.ibm.com,
	heiko.carstens@de.ibm.com, stable@vger.kernel.org
Subject: Re: [PATCH 1/2] perf/record: Fix module size on s390
Date: Thu, 8 Aug 2019 10:47:21 -0300	[thread overview]
Message-ID: <20190808134721.GF19444@kernel.org> (raw)
In-Reply-To: <20190724122703.3996-1-tmricht@linux.ibm.com>

Em Wed, Jul 24, 2019 at 02:27:02PM +0200, Thomas Richter escreveu:
> On s390 the modules loaded in memory have the text segment
> located after the GOT and Relocation table. This can be seen
> with this output:
>   [root@m35lp76 perf]# fgrep qeth /proc/modules
>   qeth 151552 1 qeth_l2, Live 0x000003ff800b2000
>   ...
>   [root@m35lp76 perf]# cat /sys/module/qeth/sections/.text
>   0x000003ff800b3990
>   [root@m35lp76 perf]#

Thanks, applied.

- Arnaldo
 
> There is an offset of 0x1990 bytes. The size of the qeth module
> is 151552 bytes (0x25000 in hex).
> The location of the GOT/relocation table at the beginning of a
> module is unique to s390.
> 
> commit 203d8a4aa6ed ("perf s390: Fix 'start' address of module's map")
> adjusts the start address of a module in the map structures, but
> does not adjust the size of the modules. This leads to overlapping
> of module maps as this example shows:
> 
> [root@m35lp76 perf] # ./perf report -D
>      0 0 0xfb0 [0xa0]: PERF_RECORD_MMAP -1/0: [0x3ff800b3990(0x25000)
>           @ 0]:  x /lib/modules/.../qeth.ko.xz
>      0 0 0x1050 [0xb0]: PERF_RECORD_MMAP -1/0: [0x3ff800d85a0(0x8000)
>           @ 0]:  x /lib/modules/.../ip6_tables.ko.xz
> 
> The module qeth.ko has an adjusted start address modified to b3990,
> but its size is unchanged and the module ends at 0x3ff800d8990.
> This end address overlaps with the next modules start address of
> 0x3ff800d85a0.
> 
> When the size of the leading GOT/Relocation table stored in the
> beginning of the text segment (0x1990 bytes) is subtracted from
> module qeth end address, there are no overlaps anymore:
> 
>    0x3ff800d8990 - 0x1990 = 0x0x3ff800d7000
> 
> which is the same as
> 
>    0x3ff800b2000 + 0x25000 = 0x0x3ff800d7000.
> 
> To fix this issue, also adjust the modules size in function
> arch__fix_module_text_start(). Add another function parameter
> named size and reduce the size of the module when the text segment
> start address is changed.
> 
> Output after:
>      0 0 0xfb0 [0xa0]: PERF_RECORD_MMAP -1/0: [0x3ff800b3990(0x23670)
>           @ 0]:  x /lib/modules/.../qeth.ko.xz
>      0 0 0x1050 [0xb0]: PERF_RECORD_MMAP -1/0: [0x3ff800d85a0(0x7a60)
>           @ 0]:  x /lib/modules/.../ip6_tables.ko.xz
> 
> Fixes: 203d8a4aa6ed ("perf s390: Fix 'start' address of module's map")
> Cc: <stable@vger.kernel.org> # v4.9+
> Reported-by: Stefan Liebler <stli@linux.ibm.com>
> Signed-off-by: Thomas Richter <tmricht@linux.ibm.com>
> Acked-by: Heiko Carstens <heiko.carstens@de.ibm.com>
> ---
>  tools/perf/arch/s390/util/machine.c | 14 +++++++++++++-
>  tools/perf/util/machine.c           |  3 ++-
>  tools/perf/util/machine.h           |  2 +-
>  3 files changed, 16 insertions(+), 3 deletions(-)
> 
> diff --git a/tools/perf/arch/s390/util/machine.c b/tools/perf/arch/s390/util/machine.c
> index a19690a17291..de26b1441a48 100644
> --- a/tools/perf/arch/s390/util/machine.c
> +++ b/tools/perf/arch/s390/util/machine.c
> @@ -7,7 +7,7 @@
>  #include "api/fs/fs.h"
>  #include "debug.h"
>  
> -int arch__fix_module_text_start(u64 *start, const char *name)
> +int arch__fix_module_text_start(u64 *start, u64 *size, const char *name)
>  {
>  	u64 m_start = *start;
>  	char path[PATH_MAX];
> @@ -17,6 +17,18 @@ int arch__fix_module_text_start(u64 *start, const char *name)
>  	if (sysfs__read_ull(path, (unsigned long long *)start) < 0) {
>  		pr_debug2("Using module %s start:%#lx\n", path, m_start);
>  		*start = m_start;
> +	} else {
> +		/* Successful read of the modules segment text start address.
> +		 * Calculate difference between module start address
> +		 * in memory and module text segment start address.
> +		 * For example module load address is 0x3ff8011b000
> +		 * (from /proc/modules) and module text segment start
> +		 * address is 0x3ff8011b870 (from file above).
> +		 *
> +		 * Adjust the module size and subtract the GOT table
> +		 * size located at the beginning of the module.
> +		 */
> +		*size -= (*start - m_start);
>  	}
>  
>  	return 0;
> diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c
> index dc7aafe45a2b..081fe4bdebaa 100644
> --- a/tools/perf/util/machine.c
> +++ b/tools/perf/util/machine.c
> @@ -1365,6 +1365,7 @@ static int machine__set_modules_path(struct machine *machine)
>  	return map_groups__set_modules_path_dir(&machine->kmaps, modules_path, 0);
>  }
>  int __weak arch__fix_module_text_start(u64 *start __maybe_unused,
> +				u64 *size __maybe_unused,
>  				const char *name __maybe_unused)
>  {
>  	return 0;
> @@ -1376,7 +1377,7 @@ static int machine__create_module(void *arg, const char *name, u64 start,
>  	struct machine *machine = arg;
>  	struct map *map;
>  
> -	if (arch__fix_module_text_start(&start, name) < 0)
> +	if (arch__fix_module_text_start(&start, &size, name) < 0)
>  		return -1;
>  
>  	map = machine__findnew_module_map(machine, start, name);
> diff --git a/tools/perf/util/machine.h b/tools/perf/util/machine.h
> index f70ab98a7bde..7aa38da26427 100644
> --- a/tools/perf/util/machine.h
> +++ b/tools/perf/util/machine.h
> @@ -222,7 +222,7 @@ struct symbol *machine__find_kernel_symbol_by_name(struct machine *machine,
>  
>  struct map *machine__findnew_module_map(struct machine *machine, u64 start,
>  					const char *filename);
> -int arch__fix_module_text_start(u64 *start, const char *name);
> +int arch__fix_module_text_start(u64 *start, u64 *size, const char *name);
>  
>  int machine__load_kallsyms(struct machine *machine, const char *filename);
>  
> -- 
> 2.21.0

-- 

- Arnaldo

  parent reply	other threads:[~2019-08-08 13:47 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-07-24 12:27 [PATCH 1/2] perf/record: Fix module size on s390 Thomas Richter
2019-07-24 12:27 ` [PATCH 2/2] perf/top: Fix s390 gap between kernel end and module start Thomas Richter
2019-08-08 13:49   ` Arnaldo Carvalho de Melo
2019-08-08 20:22   ` [tip:perf/urgent] perf annotate: " tip-bot for Thomas Richter
2019-08-08 13:47 ` Arnaldo Carvalho de Melo [this message]
2019-08-08 20:21 ` [tip:perf/urgent] perf record: Fix module size on s390 tip-bot for Thomas Richter

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190808134721.GF19444@kernel.org \
    --to=arnaldo.melo@gmail.com \
    --cc=brueckner@linux.ibm.com \
    --cc=gor@linux.ibm.com \
    --cc=heiko.carstens@de.ibm.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-perf-users@vger.kernel.org \
    --cc=stable@vger.kernel.org \
    --cc=tmricht@linux.ibm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.