[PATCH 2/6] perf header: Add ->process callbacks to most of features
>From now on each feature information is processed and saved in perf header so that it can be used wherever needed. The BRANCH_STACK feature is an exception since it needs nothing to be done. Cc: Stephane Eranian Cc: Robert Richter Signed-off-by: Namhyung Kim --- tools/perf/util/header.c | 319 +-- 1 file changed, 308 insertions(+), 11 deletions(-) diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c index ad72b2814ba8..d74b58d4105d 100644 --- a/tools/perf/util/header.c +++ b/tools/perf/util/header.c @@ -22,6 +22,7 @@ #include "cpumap.h" #include "pmu.h" #include "vdso.h" +#include "strbuf.h" static bool no_buildid_cache = false; @@ -1673,6 +1674,99 @@ static int process_build_id(struct perf_file_section *section, return 0; } +static int process_hostname(struct perf_file_section *section __maybe_unused, + struct perf_header *ph, int feat __maybe_unused, + int fd, void *data __maybe_unused) +{ + ph->env.hostname = do_read_string(fd, ph); + return ph->env.hostname ? 0 : -ENOMEM; +} + +static int process_osrelease(struct perf_file_section *section __maybe_unused, +struct perf_header *ph, int feat __maybe_unused, +int fd, void *data __maybe_unused) +{ + ph->env.os_release = do_read_string(fd, ph); + return ph->env.os_release ? 0 : -ENOMEM; +} + +static int process_version(struct perf_file_section *section __maybe_unused, + struct perf_header *ph, int feat __maybe_unused, + int fd, void *data __maybe_unused) +{ + ph->env.version = do_read_string(fd, ph); + return ph->env.version ? 0 : -ENOMEM; +} + +static int process_arch(struct perf_file_section *section __maybe_unused, + struct perf_header *ph, int feat __maybe_unused, + int fd, void *data __maybe_unused) +{ + ph->env.arch = do_read_string(fd, ph); + return ph->env.arch ? 0 : -ENOMEM; +} + +static int process_nrcpus(struct perf_file_section *section __maybe_unused, + struct perf_header *ph, int feat __maybe_unused, + int fd, void *data __maybe_unused) +{ + size_t ret; + u32 nr; + + ret = read(fd, , sizeof(nr)); + if (ret != sizeof(nr)) + return -1; + + if (ph->needs_swap) + nr = bswap_32(nr); + + ph->env.nr_cpus_online = nr; + + ret = read(fd, , sizeof(nr)); + if (ret != sizeof(nr)) + return -1; + + if (ph->needs_swap) + nr = bswap_32(nr); + + ph->env.nr_cpus_avail = nr; + return 0; +} + +static int process_cpudesc(struct perf_file_section *section __maybe_unused, + struct perf_header *ph, int feat __maybe_unused, + int fd, void *data __maybe_unused) +{ + ph->env.cpu_desc = do_read_string(fd, ph); + return ph->env.cpu_desc ? 0 : -ENOMEM; +} + +static int process_cpuid(struct perf_file_section *section __maybe_unused, +struct perf_header *ph, int feat __maybe_unused, +int fd, void *data __maybe_unused) +{ + ph->env.cpuid = do_read_string(fd, ph); + return ph->env.cpuid ? 0 : -ENOMEM; +} + +static int process_total_mem(struct perf_file_section *section __maybe_unused, +struct perf_header *ph, int feat __maybe_unused, +int fd, void *data __maybe_unused) +{ + uint64_t mem; + size_t ret; + + ret = read(fd, , sizeof(mem)); + if (ret != sizeof(mem)) + return -1; + + if (ph->needs_swap) + mem = bswap_64(mem); + + ph->env.total_mem = mem; + return 0; +} + static char *read_cpuid(struct perf_header *ph, int fd) { return do_read_string(fd, ph); @@ -1728,6 +1822,208 @@ process_event_desc(struct perf_file_section *section __maybe_unused, return 0; } +static int process_cmdline(struct perf_file_section *section __maybe_unused, + struct perf_header *ph, int feat __maybe_unused, + int fd, void *data __maybe_unused) +{ + size_t ret; + char *str; + u32 nr, i; + struct strbuf sb; + + ret = read(fd, , sizeof(nr)); + if (ret != sizeof(nr)) + return -1; + + if (ph->needs_swap) + nr = bswap_32(nr); + + ph->env.nr_cmdline = nr; + strbuf_init(, 128); + + for (i = 0; i < nr; i++) { + str = do_read_string(fd, ph); + if (!str) + goto error; + + /* include a NULL character at the end */ + strbuf_add(, str, strlen(str) + 1); + free(str); + } + ph->env.cmdline = strbuf_detach(, NULL); +
[PATCH 2/6] perf header: Add -process callbacks to most of features
From now on each feature information is processed and saved in perf header so that it can be used wherever needed. The BRANCH_STACK feature is an exception since it needs nothing to be done. Cc: Stephane Eranian eran...@google.com Cc: Robert Richter robert.rich...@amd.com Signed-off-by: Namhyung Kim namhy...@kernel.org --- tools/perf/util/header.c | 319 +-- 1 file changed, 308 insertions(+), 11 deletions(-) diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c index ad72b2814ba8..d74b58d4105d 100644 --- a/tools/perf/util/header.c +++ b/tools/perf/util/header.c @@ -22,6 +22,7 @@ #include cpumap.h #include pmu.h #include vdso.h +#include strbuf.h static bool no_buildid_cache = false; @@ -1673,6 +1674,99 @@ static int process_build_id(struct perf_file_section *section, return 0; } +static int process_hostname(struct perf_file_section *section __maybe_unused, + struct perf_header *ph, int feat __maybe_unused, + int fd, void *data __maybe_unused) +{ + ph-env.hostname = do_read_string(fd, ph); + return ph-env.hostname ? 0 : -ENOMEM; +} + +static int process_osrelease(struct perf_file_section *section __maybe_unused, +struct perf_header *ph, int feat __maybe_unused, +int fd, void *data __maybe_unused) +{ + ph-env.os_release = do_read_string(fd, ph); + return ph-env.os_release ? 0 : -ENOMEM; +} + +static int process_version(struct perf_file_section *section __maybe_unused, + struct perf_header *ph, int feat __maybe_unused, + int fd, void *data __maybe_unused) +{ + ph-env.version = do_read_string(fd, ph); + return ph-env.version ? 0 : -ENOMEM; +} + +static int process_arch(struct perf_file_section *section __maybe_unused, + struct perf_header *ph, int feat __maybe_unused, + int fd, void *data __maybe_unused) +{ + ph-env.arch = do_read_string(fd, ph); + return ph-env.arch ? 0 : -ENOMEM; +} + +static int process_nrcpus(struct perf_file_section *section __maybe_unused, + struct perf_header *ph, int feat __maybe_unused, + int fd, void *data __maybe_unused) +{ + size_t ret; + u32 nr; + + ret = read(fd, nr, sizeof(nr)); + if (ret != sizeof(nr)) + return -1; + + if (ph-needs_swap) + nr = bswap_32(nr); + + ph-env.nr_cpus_online = nr; + + ret = read(fd, nr, sizeof(nr)); + if (ret != sizeof(nr)) + return -1; + + if (ph-needs_swap) + nr = bswap_32(nr); + + ph-env.nr_cpus_avail = nr; + return 0; +} + +static int process_cpudesc(struct perf_file_section *section __maybe_unused, + struct perf_header *ph, int feat __maybe_unused, + int fd, void *data __maybe_unused) +{ + ph-env.cpu_desc = do_read_string(fd, ph); + return ph-env.cpu_desc ? 0 : -ENOMEM; +} + +static int process_cpuid(struct perf_file_section *section __maybe_unused, +struct perf_header *ph, int feat __maybe_unused, +int fd, void *data __maybe_unused) +{ + ph-env.cpuid = do_read_string(fd, ph); + return ph-env.cpuid ? 0 : -ENOMEM; +} + +static int process_total_mem(struct perf_file_section *section __maybe_unused, +struct perf_header *ph, int feat __maybe_unused, +int fd, void *data __maybe_unused) +{ + uint64_t mem; + size_t ret; + + ret = read(fd, mem, sizeof(mem)); + if (ret != sizeof(mem)) + return -1; + + if (ph-needs_swap) + mem = bswap_64(mem); + + ph-env.total_mem = mem; + return 0; +} + static char *read_cpuid(struct perf_header *ph, int fd) { return do_read_string(fd, ph); @@ -1728,6 +1822,208 @@ process_event_desc(struct perf_file_section *section __maybe_unused, return 0; } +static int process_cmdline(struct perf_file_section *section __maybe_unused, + struct perf_header *ph, int feat __maybe_unused, + int fd, void *data __maybe_unused) +{ + size_t ret; + char *str; + u32 nr, i; + struct strbuf sb; + + ret = read(fd, nr, sizeof(nr)); + if (ret != sizeof(nr)) + return -1; + + if (ph-needs_swap) + nr = bswap_32(nr); + + ph-env.nr_cmdline = nr; + strbuf_init(sb, 128); + + for (i = 0; i nr; i++) { + str = do_read_string(fd, ph); + if (!str) + goto error; + + /* include a NULL character at the end */ + strbuf_add(sb, str, strlen(str) + 1); + free(str); + } +