Patch "perf tools: Fix copying of /proc/kcore" has been added to the 3.14-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
perf tools: Fix copying of /proc/kcore
to the 3.14-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
perf-tools-fix-copying-of-proc-kcore.patch
and it can be found in the queue-3.14 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
b5cabbcbd157a4bf5a92dfc85134999a3b55342dMon Sep 17 00:00:00 2001
From: Adrian Hunter <[email protected]>
Date: Thu, 24 Sep 2015 13:05:22 +0300
Subject: perf tools: Fix copying of /proc/kcore
From: Adrian Hunter <[email protected]>
commit b5cabbcbd157a4bf5a92dfc85134999a3b55342d upstream.
A copy of /proc/kcore containing the kernel text can be made to the buildid cache. e.g.
perf buildid-cache -v -k /proc/kcore
To workaround objdump limitations, a copy is also made when annotating against /proc/kcore.
The copying process stops working from libelf about v1.62 onwards (the problem was found with v1.63).
The cause is that a call to gelf_getphdr() in kcore__add_phdr() fails because additional validation has been added to gelf_getphdr().
The use of gelf_getphdr() is a misguided attempt to get default initialization of the Gelf_Phdr structure. That should not be necessary because every member of the Gelf_Phdr structure is subsequently assigned. So just remove the call to gelf_getphdr().
Similarly, a call to gelf_getehdr() in gelf_kcore__init() can be removed also.
Committer notes:
Note to [email protected], from Adrian in the cover letter for this patchkit:
The "Fix copying of /proc/kcore" problem goes back to v3.13 if you think it is important enough for stable.
--- tools/perf/util/symbol-elf.c | 33 ++++++++++++--------------------- 1 file changed, 12 insertions(+), 21 deletions(-)
tools/perf/util/symbol-elf.c +12 -21
@@ -1100,8 +1100,6 @@ out_close:static int kcore__init (struct kcore *kcore,char *filename,int elfclass,bool temp) { -GElf_Ehdr *ehdr; - kcore->elfclass = elfclass;if (temp)
@@ -1118,9 +1116,7 @@ static int kcore__init(struct kcore *kcoif (!gelf_newehdr (kcore->elf, elfclass)) goto out_end; - ehdr =gelf_getehdr (kcore->elf, &kcore->ehdr); -if (!ehdr) - goto out_end; +memset (&kcore->ehdr,0 ,sizeof (GElf_Ehdr));return 0 ;
@@ -1177,23 +1173,18 @@ static int kcore__copy_hdr(struct kcorestatic int kcore__add_phdr (struct kcore *kcore,int idx,off_t offset,u64 addr,u64 len) { -GElf_Phdr gphdr; -GElf_Phdr *phdr; - - phdr =gelf_getphdr (kcore->elf, idx, &gphdr); -if (!phdr) -return -1 ; - - phdr->p_type =PT_LOAD ; - phdr->p_flags =PF_R |PF_W |PF_X ; - phdr->p_offset = offset; - phdr->p_vaddr = addr; - phdr->p_paddr =0 ; - phdr->p_filesz = len; - phdr->p_memsz = len; - phdr->p_align = page_size; +GElf_Phdr phdr = { + .p_type =PT_LOAD , + .p_flags =PF_R |PF_W |PF_X , + .p_offset = offset, + .p_vaddr = addr, + .p_paddr =0 , + .p_filesz = len, + .p_memsz = len, + .p_align = page_size, + }; -if (!gelf_update_phdr (kcore->elf, idx, phdr)) +if (!gelf_update_phdr (kcore->elf, idx, &phdr))return -1 ;return 0 ;
Patches currently in stable-queue which might be from [email protected] are
queue-3.14/perf-stat-get-correct-cpu-id-for-print_aggr.patch queue-3.14/perf-tools-fix-copying-of-proc-kcore.patch queue-3.14/perf-header-fixup-reading-of-header_nrcpus-feature.patch