mirror of https://gitee.com/openkylin/linux.git
perf sdt: Add scanning of sdt probes arguments
During a "perf buildid-cache --add" command, the section ".note.stapsdt" of the "added" binary is scanned in order to list the available SDT markers available in a binary. The parts containing the probes arguments were left unscanned. The whole section is now parsed; the probe arguments are extracted for later use. Signed-off-by: Alexis Berlemont <alexis.berlemont@gmail.com> Acked-by: Masami Hiramatsu <mhiramat@kernel.org> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Hemant Kumar <hemant@linux.vnet.ibm.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Ravi Bangoria <ravi.bangoria@linux.vnet.ibm.com> Link: http://lkml.kernel.org/r/20161214000732.1710-2-alexis.berlemont@gmail.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
70946723ee
commit
be88184b1c
|
@ -1828,7 +1828,7 @@ void kcore_extract__delete(struct kcore_extract *kce)
|
|||
static int populate_sdt_note(Elf **elf, const char *data, size_t len,
|
||||
struct list_head *sdt_notes)
|
||||
{
|
||||
const char *provider, *name;
|
||||
const char *provider, *name, *args;
|
||||
struct sdt_note *tmp = NULL;
|
||||
GElf_Ehdr ehdr;
|
||||
GElf_Addr base_off = 0;
|
||||
|
@ -1887,6 +1887,25 @@ static int populate_sdt_note(Elf **elf, const char *data, size_t len,
|
|||
goto out_free_prov;
|
||||
}
|
||||
|
||||
args = memchr(name, '\0', data + len - name);
|
||||
|
||||
/*
|
||||
* There is no argument if:
|
||||
* - We reached the end of the note;
|
||||
* - There is not enough room to hold a potential string;
|
||||
* - The argument string is empty or just contains ':'.
|
||||
*/
|
||||
if (args == NULL || data + len - args < 2 ||
|
||||
args[1] == ':' || args[1] == '\0')
|
||||
tmp->args = NULL;
|
||||
else {
|
||||
tmp->args = strdup(++args);
|
||||
if (!tmp->args) {
|
||||
ret = -ENOMEM;
|
||||
goto out_free_name;
|
||||
}
|
||||
}
|
||||
|
||||
if (gelf_getclass(*elf) == ELFCLASS32) {
|
||||
memcpy(&tmp->addr, &buf, 3 * sizeof(Elf32_Addr));
|
||||
tmp->bit32 = true;
|
||||
|
@ -1898,7 +1917,7 @@ static int populate_sdt_note(Elf **elf, const char *data, size_t len,
|
|||
if (!gelf_getehdr(*elf, &ehdr)) {
|
||||
pr_debug("%s : cannot get elf header.\n", __func__);
|
||||
ret = -EBADF;
|
||||
goto out_free_name;
|
||||
goto out_free_args;
|
||||
}
|
||||
|
||||
/* Adjust the prelink effect :
|
||||
|
@ -1923,6 +1942,8 @@ static int populate_sdt_note(Elf **elf, const char *data, size_t len,
|
|||
list_add_tail(&tmp->note_list, sdt_notes);
|
||||
return 0;
|
||||
|
||||
out_free_args:
|
||||
free(tmp->args);
|
||||
out_free_name:
|
||||
free(tmp->name);
|
||||
out_free_prov:
|
||||
|
|
|
@ -351,6 +351,7 @@ int arch__choose_best_symbol(struct symbol *syma, struct symbol *symb);
|
|||
struct sdt_note {
|
||||
char *name; /* name of the note*/
|
||||
char *provider; /* provider name */
|
||||
char *args;
|
||||
bool bit32; /* whether the location is 32 bits? */
|
||||
union { /* location, base and semaphore addrs */
|
||||
Elf64_Addr a64[3];
|
||||
|
|
Loading…
Reference in New Issue