lkml.org 
[lkml]   [2017]   [Mar]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 03/20] perf sdt: Add scanning of sdt probes arguments
    Date
    From: Alexis Berlemont <alexis.berlemont@gmail.com>

    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>
    ---
    tools/perf/util/symbol-elf.c | 25 +++++++++++++++++++++++--
    tools/perf/util/symbol.h | 1 +
    2 files changed, 24 insertions(+), 2 deletions(-)

    diff --git a/tools/perf/util/symbol-elf.c b/tools/perf/util/symbol-elf.c
    index 4e59ddeb4eda..0e660dba58ad 100644
    --- a/tools/perf/util/symbol-elf.c
    +++ b/tools/perf/util/symbol-elf.c
    @@ -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:
    diff --git a/tools/perf/util/symbol.h b/tools/perf/util/symbol.h
    index 6c358b7ed336..9222c7e702f3 100644
    --- a/tools/perf/util/symbol.h
    +++ b/tools/perf/util/symbol.h
    @@ -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];
    --
    2.9.3
    \
     
     \ /
      Last update: 2017-03-24 16:45    [W:4.366 / U:0.352 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site