On 2/09/19 5:15 PM, Leo Yan wrote:
Hi Adrian,
On Mon, Aug 26, 2019 at 08:51:05PM +0800, Leo Yan wrote:
Hi Adrian,
On Fri, Aug 16, 2019 at 04:00:02PM +0300, Adrian Hunter wrote:
On 16/08/19 4:45 AM, Leo Yan wrote:
Hi Adrian,
On Thu, Aug 15, 2019 at 02:45:57PM +0300, Adrian Hunter wrote:
[...]
> How come you cannot use kallsyms to get the information?
Thanks for pointing out this. Sorry I skipped your comment "I don't know how you intend to calculate ARM_PRE_START_SIZE" when you reviewed the patch v3, I should use that chance to elaborate the detailed idea and so can get more feedback/guidance before procceed.
Actually, I have considered to use kallsyms when worked on the previous patch set.
As mentioned in patch set v4's cover letter, I tried to implement machine__create_extra_kernel_maps() for arm/arm64, the purpose is to parse kallsyms so can find more kernel maps and thus also can fixup the kernel start address. But I found the 'perf script' tool directly calls machine__get_kernel_start() instead of running into the flow for machine__create_extra_kernel_maps();
Doesn't it just need to loop through each kernel map to find the lowest start address?
Based on your suggestion, I worked out below change and verified it can work well on arm64 for fixing up start address; please let me know if the change works for you?
How does that work if take a perf.data file to a machine with a different architecture?
Sorry I delayed so long to respond to your question; I didn't have confidence to give out very reasonale answer and this is the main reason for delaying.
Could you take chance to review my below replying? I'd like to get your confirmation before I send out offical patch.
It is not necessary to do kallsyms__parse for x86_64, so it would be better to check the arch before calling that.
However in general, having to copy and use kallsyms with perf.data if on a different arch does not seem very user friendly. But really that is up to Arnaldo.
Thanks, Leo Yan
For your question for taking a perf.data file to a machine with a different architecture, we can firstly use command 'perf buildid-list' to print out the buildid for kallsyms, based on the dumped buildid we can find out the location for the saved kallsyms file; then we can use option '--kallsyms' to specify the offline kallsyms file and use the offline kallsyms to fixup kernel start address. The detailed commands are listed as below:
root@debian:~# perf buildid-list 7b36dfca8317ef74974ebd7ee5ec0a8b35c97640 [kernel.kallsyms] 56b84aa88a1bcfe222a97a53698b92723a3977ca /usr/lib/systemd/systemd 0956b952e9cd673d48ff2cfeb1a9dbd0c853e686 /usr/lib/aarch64-linux-gnu/libm-2.28.so [...]
root@debian:~# perf script --kallsyms ~/.debug/[kernel.kallsyms]/7b36dfca8317ef74974ebd7ee5ec0a8b35c97640/kallsyms
The amended patch is as below, please review and always welcome any suggestions or comments!
diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c index 5734460fc89e..593f05cc453f 100644 --- a/tools/perf/util/machine.c +++ b/tools/perf/util/machine.c @@ -2672,9 +2672,26 @@ int machine__nr_cpus_avail(struct machine *machine) return machine ? perf_env__nr_cpus_avail(machine->env) : 0; } +static int machine__fixup_kernel_start(void *arg,
const char *name __maybe_unused,
char type,
u64 start)
+{
- struct machine *machine = arg;
- type = toupper(type);
- /* Fixup for text, weak, data and bss sections. */
- if (type == 'T' || type == 'W' || type == 'D' || type == 'B')
machine->kernel_start = min(machine->kernel_start, start);
- return 0;
+}
int machine__get_kernel_start(struct machine *machine) { struct map *map = machine__kernel_map(machine);
- char filename[PATH_MAX]; int err = 0;
/* @@ -2696,6 +2713,22 @@ int machine__get_kernel_start(struct machine *machine) if (!err && !machine__is(machine, "x86_64")) machine->kernel_start = map->start; }
- if (symbol_conf.kallsyms_name != NULL) {
strncpy(filename, symbol_conf.kallsyms_name, PATH_MAX);
- } else {
machine__get_kallsyms_filename(machine, filename, PATH_MAX);
if (symbol__restricted_filename(filename, "/proc/kallsyms"))
goto out;
- }
- if (kallsyms__parse(filename, machine, machine__fixup_kernel_start))
pr_warning("Fail to fixup kernel start address. skipping...\n");
+out: return err; }
Thanks, Leo Yan