* [PATCH 1/5] perf header: Do not write event_desc feature
@ 2012-07-21 16:45 Namhyung Kim
2012-07-21 16:45 ` [PATCH 2/5] perf header: add ->process callbacks to most of features Namhyung Kim
` (3 more replies)
0 siblings, 4 replies; 5+ messages in thread
From: Namhyung Kim @ 2012-07-21 16:45 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo
Cc: Ingo Molnar, Peter Zijlstra, LKML, Stephane Eranian
Since the event descriptions are saved already in the header, do not
write them to the feature section.
Cc: Stephane Eranian <eranian@google.com>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
| 154 +++++++---------------------------------------
1 file changed, 21 insertions(+), 133 deletions(-)
--git a/tools/perf/util/header.c b/tools/perf/util/header.c
index 5a47aba46759..193aa089f9a6 100644
--- a/tools/perf/util/header.c
+++ b/tools/perf/util/header.c
@@ -596,61 +596,9 @@ static int write_nrcpus(int fd, struct perf_header *h __used,
return do_write(fd, &nra, sizeof(nra));
}
-static int write_event_desc(int fd, struct perf_header *h __used,
- struct perf_evlist *evlist)
+static int write_event_desc(int fd __used, struct perf_header *h __used,
+ struct perf_evlist *evlist __used)
{
- struct perf_evsel *attr;
- u32 nre = 0, nri, sz;
- int ret;
-
- list_for_each_entry(attr, &evlist->entries, node)
- nre++;
-
- /*
- * write number of events
- */
- ret = do_write(fd, &nre, sizeof(nre));
- if (ret < 0)
- return ret;
-
- /*
- * size of perf_event_attr struct
- */
- sz = (u32)sizeof(attr->attr);
- ret = do_write(fd, &sz, sizeof(sz));
- if (ret < 0)
- return ret;
-
- list_for_each_entry(attr, &evlist->entries, node) {
-
- ret = do_write(fd, &attr->attr, sz);
- if (ret < 0)
- return ret;
- /*
- * write number of unique id per event
- * there is one id per instance of an event
- *
- * copy into an nri to be independent of the
- * type of ids,
- */
- nri = attr->ids;
- ret = do_write(fd, &nri, sizeof(nri));
- if (ret < 0)
- return ret;
-
- /*
- * write event string as passed on cmdline
- */
- ret = do_write_string(fd, perf_evsel__name(attr));
- if (ret < 0)
- return ret;
- /*
- * write unique ids for this event
- */
- ret = do_write(fd, attr->id, attr->ids * sizeof(u64));
- if (ret < 0)
- return ret;
- }
return 0;
}
@@ -1139,103 +1087,43 @@ static void print_cpu_topology(struct perf_header *ph, int fd, FILE *fp)
}
}
-static void print_event_desc(struct perf_header *ph, int fd, FILE *fp)
+static void print_event_desc(struct perf_header *ph, int fd __used, FILE *fp)
{
- struct perf_event_attr attr;
- uint64_t id;
- void *buf = NULL;
- char *str;
- u32 nre, sz, nr, i, j;
- ssize_t ret;
- size_t msz;
-
- /* number of events */
- ret = read(fd, &nre, sizeof(nre));
- if (ret != (ssize_t)sizeof(nre))
- goto error;
-
- if (ph->needs_swap)
- nre = bswap_32(nre);
-
- ret = read(fd, &sz, sizeof(sz));
- if (ret != (ssize_t)sizeof(sz))
- goto error;
-
- if (ph->needs_swap)
- sz = bswap_32(sz);
-
- memset(&attr, 0, sizeof(attr));
-
- /* buffer to hold on file attr struct */
- buf = malloc(sz);
- if (!buf)
- goto error;
-
- msz = sizeof(attr);
- if (sz < msz)
- msz = sz;
-
- for (i = 0 ; i < nre; i++) {
-
- /*
- * must read entire on-file attr struct to
- * sync up with layout.
- */
- ret = read(fd, buf, sz);
- if (ret != (ssize_t)sz)
- goto error;
-
- if (ph->needs_swap)
- perf_event__attr_swap(buf);
+ struct perf_session *session;
+ struct perf_evsel *evsel;
+ int i;
- memcpy(&attr, buf, msz);
+ session = container_of(ph, struct perf_session, header);
- ret = read(fd, &nr, sizeof(nr));
- if (ret != (ssize_t)sizeof(nr))
- goto error;
+ list_for_each_entry(evsel, &session->evlist->entries, node) {
+ struct perf_event_attr *attr = &evsel->attr;
- if (ph->needs_swap)
- nr = bswap_32(nr);
-
- str = do_read_string(fd, ph);
- fprintf(fp, "# event : name = %s, ", str);
- free(str);
+ fprintf(fp, "# event : name = %s, ", perf_evsel__name(evsel));
fprintf(fp, "type = %d, config = 0x%"PRIx64
", config1 = 0x%"PRIx64", config2 = 0x%"PRIx64,
- attr.type,
- (u64)attr.config,
- (u64)attr.config1,
- (u64)attr.config2);
+ attr->type,
+ (u64)attr->config,
+ (u64)attr->config1,
+ (u64)attr->config2);
fprintf(fp, ", excl_usr = %d, excl_kern = %d",
- attr.exclude_user,
- attr.exclude_kernel);
+ attr->exclude_user,
+ attr->exclude_kernel);
- if (nr)
+ if (evsel->ids)
fprintf(fp, ", id = {");
- for (j = 0 ; j < nr; j++) {
- ret = read(fd, &id, sizeof(id));
- if (ret != (ssize_t)sizeof(id))
- goto error;
-
- if (ph->needs_swap)
- id = bswap_64(id);
-
- if (j)
+ for (i = 0 ; i < evsel->ids; i++) {
+ if (i)
fputc(',', fp);
- fprintf(fp, " %"PRIu64, id);
+ fprintf(fp, " %"PRIu64, evsel->id[i]);
}
- if (nr && j == nr)
+ if (evsel->ids && i == evsel->ids)
fprintf(fp, " }");
fputc('\n', fp);
}
- free(buf);
- return;
-error:
- fprintf(fp, "# event desc: not available or unable to read\n");
}
static void print_total_mem(struct perf_header *h __used, int fd, FILE *fp)
--
1.7.9.2
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 2/5] perf header: add ->process callbacks to most of features
2012-07-21 16:45 [PATCH 1/5] perf header: Do not write event_desc feature Namhyung Kim
@ 2012-07-21 16:45 ` Namhyung Kim
2012-07-21 16:45 ` [PATCH 3/5] perf header: Make feat_ops->print use processed result Namhyung Kim
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Namhyung Kim @ 2012-07-21 16:45 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo
Cc: Ingo Molnar, Peter Zijlstra, LKML, Stephane Eranian
>From now for each feature information is processed and saved in perf
header so that it can be used wherever needed. The EVENT_DESC and
BRANCH_STACK features are exceptions since they need nothing to be done.
Cc: Stephane Eranian <eranian@google.com>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
| 360 ++++++++++++++++++++++++++++++++++++++++++++--
| 13 ++
2 files changed, 363 insertions(+), 10 deletions(-)
--git a/tools/perf/util/header.c b/tools/perf/util/header.c
index 193aa089f9a6..1a30f2831616 100644
--- a/tools/perf/util/header.c
+++ b/tools/perf/util/header.c
@@ -1377,6 +1377,346 @@ static int process_build_id(struct perf_file_section *section,
return 0;
}
+static int process_hostname(struct perf_file_section *section __used,
+ struct perf_header *ph, int feat __used, int fd,
+ void *data __used)
+{
+ ph->hostname = do_read_string(fd, ph);
+ return ph->hostname ? 0 : -ENOMEM;
+}
+
+static int process_osrelease(struct perf_file_section *section __used,
+ struct perf_header *ph, int feat __used, int fd,
+ void *data __used)
+{
+
+ ph->os_release = do_read_string(fd, ph);
+ return ph->os_release ? 0 : -ENOMEM;
+}
+
+static int process_arch(struct perf_file_section *section __used,
+ struct perf_header *ph, int feat __used, int fd,
+ void *data __used)
+{
+ ph->arch = do_read_string(fd, ph);
+ return ph->arch ? 0 : -ENOMEM;
+}
+
+static int process_cpudesc(struct perf_file_section *section __used,
+ struct perf_header *ph, int feat __used, int fd,
+ void *data __used)
+{
+ ph->cpu_desc = do_read_string(fd, ph);
+ return ph->cpu_desc ? 0 : -ENOMEM;
+}
+
+static int process_nrcpus(struct perf_file_section *section __used,
+ struct perf_header *ph, int feat __used, int fd,
+ void *data __used)
+{
+ ssize_t ret;
+ u32 nr;
+
+ ret = read(fd, &nr, sizeof(nr));
+ if (ret != (ssize_t)sizeof(nr))
+ nr = -1; /* interpreted as error */
+
+ if (ph->needs_swap)
+ nr = bswap_32(nr);
+
+ ph->nr_cpus_online = nr;
+
+ ret = read(fd, &nr, sizeof(nr));
+ if (ret != (ssize_t)sizeof(nr))
+ nr = -1; /* interpreted as error */
+
+ if (ph->needs_swap)
+ nr = bswap_32(nr);
+
+ ph->nr_cpus_avail = nr;
+
+ return 0;
+}
+
+static int process_version(struct perf_file_section *section __used,
+ struct perf_header *ph, int feat __used, int fd,
+ void *data __used)
+{
+ ph->version = do_read_string(fd, ph);
+ return ph->version ? 0 : -ENOMEM;
+}
+
+/* Each argv would be separated by a NULL character */
+static int process_cmdline(struct perf_file_section *section __used,
+ struct perf_header *ph, int feat __used, int fd,
+ void *data __used)
+{
+ ssize_t ret;
+ char *str, *tmp;
+ u32 nr, i;
+ char *cmdline = NULL;
+ size_t len = 0;
+
+ ret = read(fd, &nr, sizeof(nr));
+ if (ret != (ssize_t)sizeof(nr))
+ return -1;
+
+ if (ph->needs_swap)
+ nr = bswap_32(nr);
+
+ ph->cmdline_argc = nr;
+
+ for (i = 0; i < nr; i++) {
+ str = do_read_string(fd, ph);
+ if (!str)
+ goto error;
+
+ tmp = realloc(cmdline, len + strlen(str) + 1);
+ if (!tmp)
+ goto error;
+ cmdline = tmp;
+
+ /* include null character at the end */
+ strcpy(cmdline + len, str);
+
+ len += strlen(str) + 1;
+ free(str);
+ }
+ ph->cmdline = cmdline;
+ return 0;
+
+error:
+ free(cmdline);
+ free(str);
+ return -1;
+}
+
+#define TOPO_STR_LEN ((size_t) 256)
+#define TOPO_STR_DELIM ':'
+
+#define check_topo_len(topo, allocated, used, len) \
+({ \
+ if (len > allocated - used) { \
+ char *tmp = realloc(topo, allocated + TOPO_STR_LEN); \
+ if (!tmp) \
+ goto error; \
+ topo = tmp; \
+ allocated += TOPO_STR_LEN; \
+ } \
+})
+
+/*
+ * The topology string looks like below (':' is used for delimiter):
+ *
+ * "NR_CORE_SIBLINGS(N):SIBLING[0]:SIBLING[1]:...:SIBLING[N-1]\n"
+ * "NR_THREAD_SIBLINGS(M):SIBLING[0]:SIBLING[1]:...:SIBLING[M-1]\n"
+ */
+static int process_cpu_topology(struct perf_file_section *section __used,
+ struct perf_header *ph, int feat __used,
+ int fd, void *data __used)
+{
+ ssize_t ret;
+ u32 nr, i;
+ char *str;
+ char buf[128];
+ char *topo = NULL;
+ size_t allocated = 0, used, len;
+
+ ret = read(fd, &nr, sizeof(nr));
+ if (ret != (ssize_t)sizeof(nr))
+ return -1;
+
+ if (ph->needs_swap)
+ nr = bswap_32(nr);
+
+ allocated = TOPO_STR_LEN;
+ topo = malloc(TOPO_STR_LEN);
+ if (!topo)
+ return -ENOMEM;
+
+ /* core siblings */
+ used = scnprintf(topo, allocated, "%u", nr);
+
+ for (i = 0; i < nr; i++) {
+ str = do_read_string(fd, ph);
+ if (!str)
+ goto error;
+
+ len = strlen(str) + 1;
+ check_topo_len(topo, allocated, used, len);
+
+ scnprintf(topo + used, allocated - used, "%c%s",
+ TOPO_STR_DELIM, str);
+ used += len;
+ free(str);
+ }
+ check_topo_len(topo, allocated, used, 1);
+ scnprintf(topo + used, allocated - used, "\n");
+ used++;
+
+ /* thread siblings */
+ ret = read(fd, &nr, sizeof(nr));
+ if (ret != (ssize_t)sizeof(nr))
+ goto error;
+
+ if (ph->needs_swap)
+ nr = bswap_32(nr);
+
+ len = scnprintf(buf, sizeof(buf), "%u", nr);
+ check_topo_len(topo, allocated, used, len);
+
+ strcat(topo, buf);
+ used += len;
+
+ for (i = 0; i < nr; i++) {
+ str = do_read_string(fd, ph);
+ if (!str)
+ goto error;
+
+ len = strlen(str) + 1;
+ check_topo_len(topo, allocated, used, len);
+
+ scnprintf(topo + used, allocated - used, "%c%s",
+ TOPO_STR_DELIM, str);
+ used += len;
+ free(str);
+ }
+ check_topo_len(topo, allocated, used, 1);
+ scnprintf(topo + used, allocated - used, "\n");
+
+ ph->cpu_topology = topo;
+ return 0;
+
+error:
+ free(topo);
+ return -1;
+}
+
+/*
+ * The topology string looks like below (':' is used for delimiter):
+ *
+ * "NR_NODES(N)\n
+ * "NODE_NUM(0):MEM_TOTAL:MEM_FREE:CPULIST\n"
+ * "NODE_NUM(1):MEM_TOTAL:MEM_FREE:CPULIST\n"
+ * ...
+ * "NODE_NUM(N-1):MEM_TOTAL:MEM_FREE:CPULIST\n"
+ */
+static int process_numa_topology(struct perf_file_section *section __used,
+ struct perf_header *ph, int feat __used,
+ int fd, void *data __used)
+{
+ ssize_t ret;
+ u32 nr, node, i;
+ char *str;
+ uint64_t mem_total, mem_free;
+ char *topo = NULL;
+ size_t allocated = 0, used, len;
+
+ /* nr nodes */
+ ret = read(fd, &nr, sizeof(nr));
+ if (ret != (ssize_t)sizeof(nr))
+ goto error;
+
+ if (ph->needs_swap)
+ nr = bswap_32(nr);
+
+ allocated = TOPO_STR_LEN;
+ topo = malloc(TOPO_STR_LEN);
+ if (!topo)
+ return -ENOMEM;
+
+ used = scnprintf(topo, allocated, "%u\n", nr);
+
+ for (i = 0; i < nr; i++) {
+ char buf[128];
+
+ /* node number */
+ ret = read(fd, &node, sizeof(node));
+ if (ret != (ssize_t)sizeof(node))
+ goto error;
+
+ if (ph->needs_swap)
+ node = bswap_32(node);
+
+ len = scnprintf(buf, sizeof(buf), "%u%c", node, TOPO_STR_DELIM);
+ check_topo_len(topo, allocated, used, len);
+
+ scnprintf(topo + used, allocated - used, "%s", buf);
+ used += len;
+
+ ret = read(fd, &mem_total, sizeof(u64));
+ if (ret != sizeof(u64))
+ goto error;
+
+ if (ph->needs_swap)
+ mem_total = bswap_64(mem_total);
+
+ len = scnprintf(buf, sizeof(buf), "%"PRIu64"%c",
+ mem_total, TOPO_STR_DELIM);
+ check_topo_len(topo, allocated, used, len);
+
+ scnprintf(topo + used, allocated - used, "%s", buf);
+ used += len;
+
+ ret = read(fd, &mem_free, sizeof(u64));
+ if (ret != sizeof(u64))
+ goto error;
+
+ if (ph->needs_swap)
+ mem_free = bswap_64(mem_free);
+
+ len = scnprintf(buf, sizeof(buf), "%"PRIu64"%c",
+ mem_total, TOPO_STR_DELIM);
+ check_topo_len(topo, allocated, used, len);
+
+ scnprintf(topo + used, allocated - used, "%s", buf);
+ used += len;
+
+ str = do_read_string(fd, ph);
+ if (!str)
+ goto error;
+
+ len = strlen(str) + 1;
+ check_topo_len(topo, allocated, used, len);
+
+ scnprintf(topo + used, allocated - used, "%s\n", str);
+ used += len;
+ free(str);
+ }
+
+ ph->numa_topology = topo;
+ return 0;
+error:
+ free(topo);
+ return -1;
+}
+
+static int process_cpuid(struct perf_file_section *section __used,
+ struct perf_header *ph, int feat __used, int fd,
+ void *data __used)
+{
+ ph->cpuid = do_read_string(fd, ph);
+ return ph->cpuid ? 0 : -ENOMEM;
+}
+
+static int process_total_mem(struct perf_file_section *section __used,
+ struct perf_header *ph, int feat __used, int fd,
+ void *data __used)
+{
+ uint64_t mem;
+ ssize_t ret;
+
+ ret = read(fd, &mem, sizeof(mem));
+ if (ret != sizeof(mem))
+ return -1;
+
+ if (ph->needs_swap)
+ mem = bswap_64(mem);
+
+ ph->total_mem = mem;
+ return 0;
+}
+
struct feature_ops {
int (*write)(int fd, struct perf_header *h, struct perf_evlist *evlist);
void (*print)(struct perf_header *h, int fd, FILE *fp);
@@ -1393,7 +1733,7 @@ struct feature_ops {
.process = process_##func }
#define FEAT_OPF(n, func) \
[n] = { .name = #n, .write = write_##func, .print = print_##func, \
- .full_only = true }
+ .process = process_##func, .full_only = true }
/* feature_ops not implemented: */
#define print_tracing_data NULL
@@ -1402,16 +1742,16 @@ struct feature_ops {
static const struct feature_ops feat_ops[HEADER_LAST_FEATURE] = {
FEAT_OPP(HEADER_TRACING_DATA, tracing_data),
FEAT_OPP(HEADER_BUILD_ID, build_id),
- FEAT_OPA(HEADER_HOSTNAME, hostname),
- FEAT_OPA(HEADER_OSRELEASE, osrelease),
- FEAT_OPA(HEADER_VERSION, version),
- FEAT_OPA(HEADER_ARCH, arch),
- FEAT_OPA(HEADER_NRCPUS, nrcpus),
- FEAT_OPA(HEADER_CPUDESC, cpudesc),
- FEAT_OPA(HEADER_CPUID, cpuid),
- FEAT_OPA(HEADER_TOTAL_MEM, total_mem),
+ FEAT_OPP(HEADER_HOSTNAME, hostname),
+ FEAT_OPP(HEADER_OSRELEASE, osrelease),
+ FEAT_OPP(HEADER_VERSION, version),
+ FEAT_OPP(HEADER_ARCH, arch),
+ FEAT_OPP(HEADER_NRCPUS, nrcpus),
+ FEAT_OPP(HEADER_CPUDESC, cpudesc),
+ FEAT_OPP(HEADER_CPUID, cpuid),
+ FEAT_OPP(HEADER_TOTAL_MEM, total_mem),
FEAT_OPA(HEADER_EVENT_DESC, event_desc),
- FEAT_OPA(HEADER_CMDLINE, cmdline),
+ FEAT_OPP(HEADER_CMDLINE, cmdline),
FEAT_OPF(HEADER_CPU_TOPOLOGY, cpu_topology),
FEAT_OPF(HEADER_NUMA_TOPOLOGY, numa_topology),
FEAT_OPA(HEADER_BRANCH_STACK, branch_stack),
--git a/tools/perf/util/header.h b/tools/perf/util/header.h
index 2d42b3e1826f..6e4f14eb3c95 100644
--- a/tools/perf/util/header.h
+++ b/tools/perf/util/header.h
@@ -66,6 +66,19 @@ struct perf_header {
u64 event_offset;
u64 event_size;
DECLARE_BITMAP(adds_features, HEADER_FEAT_BITS);
+ char *hostname;
+ char *os_release;
+ char *version;
+ char *arch;
+ u32 nr_cpus_online;
+ u32 nr_cpus_avail;
+ char *cpu_desc;
+ char *cpuid;
+ u64 total_mem;
+ int cmdline_argc;
+ char *cmdline;
+ char *cpu_topology;
+ char *numa_topology;
};
struct perf_evlist;
--
1.7.9.2
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 3/5] perf header: Make feat_ops->print use processed result
2012-07-21 16:45 [PATCH 1/5] perf header: Do not write event_desc feature Namhyung Kim
2012-07-21 16:45 ` [PATCH 2/5] perf header: add ->process callbacks to most of features Namhyung Kim
@ 2012-07-21 16:45 ` Namhyung Kim
2012-07-21 16:45 ` [PATCH 4/5] perf header: Remove unused @fd arg from ->print callback Namhyung Kim
2012-07-21 16:45 ` [PATCH 5/5] perf header: Remove unused @feat arg from ->process callback Namhyung Kim
3 siblings, 0 replies; 5+ messages in thread
From: Namhyung Kim @ 2012-07-21 16:45 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo
Cc: Ingo Molnar, Peter Zijlstra, LKML, Stephane Eranian
Now we have all of necessary information in the perf_header so just
use it for printing.
Cc: Stephane Eranian <eranian@google.com>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
| 219 +++++++++++++++++++---------------------------
1 file changed, 92 insertions(+), 127 deletions(-)
--git a/tools/perf/util/header.c b/tools/perf/util/header.c
index 1a30f2831616..9ab1803d601d 100644
--- a/tools/perf/util/header.c
+++ b/tools/perf/util/header.c
@@ -6,6 +6,7 @@
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
+#include <string.h>
#include <linux/list.h>
#include <linux/kernel.h>
#include <linux/bitops.h>
@@ -972,118 +973,104 @@ static int write_branch_stack(int fd __used, struct perf_header *h __used,
return 0;
}
-static void print_hostname(struct perf_header *ph, int fd, FILE *fp)
+static void print_hostname(struct perf_header *ph, int fd __used, FILE *fp)
{
- char *str = do_read_string(fd, ph);
- fprintf(fp, "# hostname : %s\n", str);
- free(str);
+ fprintf(fp, "# hostname : %s\n", ph->hostname);
}
-static void print_osrelease(struct perf_header *ph, int fd, FILE *fp)
+static void print_osrelease(struct perf_header *ph, int fd __used, FILE *fp)
{
- char *str = do_read_string(fd, ph);
- fprintf(fp, "# os release : %s\n", str);
- free(str);
+ fprintf(fp, "# os release : %s\n", ph->os_release);
}
-static void print_arch(struct perf_header *ph, int fd, FILE *fp)
+static void print_arch(struct perf_header *ph, int fd __used, FILE *fp)
{
- char *str = do_read_string(fd, ph);
- fprintf(fp, "# arch : %s\n", str);
- free(str);
+ fprintf(fp, "# arch : %s\n", ph->arch);
}
-static void print_cpudesc(struct perf_header *ph, int fd, FILE *fp)
+static void print_cpudesc(struct perf_header *ph, int fd __used, FILE *fp)
{
- char *str = do_read_string(fd, ph);
- fprintf(fp, "# cpudesc : %s\n", str);
- free(str);
+ fprintf(fp, "# cpudesc : %s\n", ph->cpu_desc);
}
-static void print_nrcpus(struct perf_header *ph, int fd, FILE *fp)
+static void print_nrcpus(struct perf_header *ph, int fd __used, FILE *fp)
{
- ssize_t ret;
- u32 nr;
-
- ret = read(fd, &nr, sizeof(nr));
- if (ret != (ssize_t)sizeof(nr))
- nr = -1; /* interpreted as error */
-
- if (ph->needs_swap)
- nr = bswap_32(nr);
-
- fprintf(fp, "# nrcpus online : %u\n", nr);
-
- ret = read(fd, &nr, sizeof(nr));
- if (ret != (ssize_t)sizeof(nr))
- nr = -1; /* interpreted as error */
-
- if (ph->needs_swap)
- nr = bswap_32(nr);
-
- fprintf(fp, "# nrcpus avail : %u\n", nr);
+ fprintf(fp, "# nrcpus online : %u\n", ph->nr_cpus_online);
+ fprintf(fp, "# nrcpus avail : %u\n", ph->nr_cpus_avail);
}
-static void print_version(struct perf_header *ph, int fd, FILE *fp)
+static void print_version(struct perf_header *ph, int fd __used, FILE *fp)
{
- char *str = do_read_string(fd, ph);
- fprintf(fp, "# perf version : %s\n", str);
- free(str);
+ fprintf(fp, "# perf version : %s\n", ph->version);
}
-static void print_cmdline(struct perf_header *ph, int fd, FILE *fp)
+static void print_cmdline(struct perf_header *ph, int fd __used, FILE *fp)
{
- ssize_t ret;
char *str;
- u32 nr, i;
-
- ret = read(fd, &nr, sizeof(nr));
- if (ret != (ssize_t)sizeof(nr))
- return;
-
- if (ph->needs_swap)
- nr = bswap_32(nr);
+ int i;
fprintf(fp, "# cmdline : ");
- for (i = 0; i < nr; i++) {
- str = do_read_string(fd, ph);
+ str = ph->cmdline;
+ for (i = 0; i < ph->cmdline_argc; i++) {
+ /* each argv is null-terminated */
fprintf(fp, "%s ", str);
- free(str);
+ str += strlen(str) + 1;
}
fputc('\n', fp);
}
-static void print_cpu_topology(struct perf_header *ph, int fd, FILE *fp)
+#define TOPO_STR_DELIM ':'
+
+/* For string formatting, see process_cpu_topology() */
+static void print_cpu_topology(struct perf_header *ph, int fd __used, FILE *fp)
{
- ssize_t ret;
u32 nr, i;
char *str;
+ char *delim;
- ret = read(fd, &nr, sizeof(nr));
- if (ret != (ssize_t)sizeof(nr))
- return;
+ str = ph->cpu_topology;
- if (ph->needs_swap)
- nr = bswap_32(nr);
+ nr = strtoul(str, &delim, 0);
+ if (*delim != TOPO_STR_DELIM)
+ return;
+ str = delim + 1;
for (i = 0; i < nr; i++) {
- str = do_read_string(fd, ph);
+ char c;
+
+ delim = strpbrk(str, ":\n");
+ if (!delim)
+ return;
+
+ c = *delim;
+ *delim = '\0';
fprintf(fp, "# sibling cores : %s\n", str);
- free(str);
+ *delim = c;
+
+ str = delim + 1;
}
- ret = read(fd, &nr, sizeof(nr));
- if (ret != (ssize_t)sizeof(nr))
- return;
+ BUG_ON(*(str-1) != '\n');
- if (ph->needs_swap)
- nr = bswap_32(nr);
+ nr = strtoul(str, &delim, 0);
+ if (*delim != TOPO_STR_DELIM)
+ return;
+ str = delim + 1;
for (i = 0; i < nr; i++) {
- str = do_read_string(fd, ph);
+ char c;
+
+ delim = strpbrk(str, ":\n");
+ if (!delim)
+ return;
+
+ c = *delim;
+ *delim = '\0';
fprintf(fp, "# sibling threads : %s\n", str);
- free(str);
+ *delim = c;
+
+ str = delim + 1;
}
}
@@ -1126,82 +1113,61 @@ static void print_event_desc(struct perf_header *ph, int fd __used, FILE *fp)
}
}
-static void print_total_mem(struct perf_header *h __used, int fd, FILE *fp)
+static void print_total_mem(struct perf_header *ph, int fd __used, FILE *fp)
{
- uint64_t mem;
- ssize_t ret;
-
- ret = read(fd, &mem, sizeof(mem));
- if (ret != sizeof(mem))
- goto error;
-
- if (h->needs_swap)
- mem = bswap_64(mem);
-
- fprintf(fp, "# total memory : %"PRIu64" kB\n", mem);
- return;
-error:
- fprintf(fp, "# total memory : unknown\n");
+ fprintf(fp, "# total memory : %"PRIu64" kB\n", ph->total_mem);
}
-static void print_numa_topology(struct perf_header *h __used, int fd, FILE *fp)
+/* For string formatting, see process_numa_topology() */
+static void print_numa_topology(struct perf_header *ph, int fd __used, FILE *fp)
{
- ssize_t ret;
- u32 nr, c, i;
+ u32 nr, i, node;
+ u64 mem_total, mem_free;
char *str;
- uint64_t mem_total, mem_free;
+ char *delim;
- /* nr nodes */
- ret = read(fd, &nr, sizeof(nr));
- if (ret != (ssize_t)sizeof(nr))
- goto error;
+ str = ph->numa_topology;
- if (h->needs_swap)
- nr = bswap_32(nr);
+ nr = strtoul(str, &delim, 0);
+ if (*delim != '\n')
+ return;
+ str = delim + 1;
for (i = 0; i < nr; i++) {
+ char c;
- /* node number */
- ret = read(fd, &c, sizeof(c));
- if (ret != (ssize_t)sizeof(c))
- goto error;
+ node = strtoul(str, &delim, 0);
+ if (*delim != TOPO_STR_DELIM)
+ return;
- if (h->needs_swap)
- c = bswap_32(c);
+ str = delim + 1;
+ mem_total = strtoull(str, &delim, 0);
+ if (*delim != TOPO_STR_DELIM)
+ return;
- ret = read(fd, &mem_total, sizeof(u64));
- if (ret != sizeof(u64))
- goto error;
+ str = delim + 1;
+ mem_free = strtoull(str, &delim, 0);
+ if (*delim != TOPO_STR_DELIM)
+ return;
- ret = read(fd, &mem_free, sizeof(u64));
- if (ret != sizeof(u64))
- goto error;
-
- if (h->needs_swap) {
- mem_total = bswap_64(mem_total);
- mem_free = bswap_64(mem_free);
- }
+ delim = strchr(str, '\n');
+ if (!delim)
+ return;
+ c = *delim;
+ *delim = '\0';
fprintf(fp, "# node%u meminfo : total = %"PRIu64" kB,"
- " free = %"PRIu64" kB\n",
- c,
- mem_total,
- mem_free);
+ " free = %"PRIu64" kB\n", node, mem_total, mem_free);
+ fprintf(fp, "# node%u cpu list : %s\n", node, str);
+ *delim = c;
- str = do_read_string(fd, h);
- fprintf(fp, "# node%u cpu list : %s\n", c, str);
- free(str);
+ str = delim + 1;
}
- return;
-error:
- fprintf(fp, "# numa topology : not available\n");
}
-static void print_cpuid(struct perf_header *ph, int fd, FILE *fp)
+static void print_cpuid(struct perf_header *ph, int fd __used, FILE *fp)
{
- char *str = do_read_string(fd, ph);
- fprintf(fp, "# cpuid : %s\n", str);
- free(str);
+ fprintf(fp, "# cpuid : %s\n", ph->cpuid);
}
static void print_branch_stack(struct perf_header *ph __used, int fd __used,
@@ -1492,7 +1458,6 @@ error:
}
#define TOPO_STR_LEN ((size_t) 256)
-#define TOPO_STR_DELIM ':'
#define check_topo_len(topo, allocated, used, len) \
({ \
--
1.7.9.2
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 4/5] perf header: Remove unused @fd arg from ->print callback
2012-07-21 16:45 [PATCH 1/5] perf header: Do not write event_desc feature Namhyung Kim
2012-07-21 16:45 ` [PATCH 2/5] perf header: add ->process callbacks to most of features Namhyung Kim
2012-07-21 16:45 ` [PATCH 3/5] perf header: Make feat_ops->print use processed result Namhyung Kim
@ 2012-07-21 16:45 ` Namhyung Kim
2012-07-21 16:45 ` [PATCH 5/5] perf header: Remove unused @feat arg from ->process callback Namhyung Kim
3 siblings, 0 replies; 5+ messages in thread
From: Namhyung Kim @ 2012-07-21 16:45 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo
Cc: Ingo Molnar, Peter Zijlstra, LKML, Stephane Eranian
As we don't need the @fd in the ->print any more, get rid of it from
the signature.
Cc: Stephane Eranian <eranian@google.com>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
| 31 +++++++++++++++----------------
1 file changed, 15 insertions(+), 16 deletions(-)
--git a/tools/perf/util/header.c b/tools/perf/util/header.c
index 9ab1803d601d..4484a80c20ba 100644
--- a/tools/perf/util/header.c
+++ b/tools/perf/util/header.c
@@ -973,38 +973,38 @@ static int write_branch_stack(int fd __used, struct perf_header *h __used,
return 0;
}
-static void print_hostname(struct perf_header *ph, int fd __used, FILE *fp)
+static void print_hostname(struct perf_header *ph, FILE *fp)
{
fprintf(fp, "# hostname : %s\n", ph->hostname);
}
-static void print_osrelease(struct perf_header *ph, int fd __used, FILE *fp)
+static void print_osrelease(struct perf_header *ph, FILE *fp)
{
fprintf(fp, "# os release : %s\n", ph->os_release);
}
-static void print_arch(struct perf_header *ph, int fd __used, FILE *fp)
+static void print_arch(struct perf_header *ph, FILE *fp)
{
fprintf(fp, "# arch : %s\n", ph->arch);
}
-static void print_cpudesc(struct perf_header *ph, int fd __used, FILE *fp)
+static void print_cpudesc(struct perf_header *ph, FILE *fp)
{
fprintf(fp, "# cpudesc : %s\n", ph->cpu_desc);
}
-static void print_nrcpus(struct perf_header *ph, int fd __used, FILE *fp)
+static void print_nrcpus(struct perf_header *ph, FILE *fp)
{
fprintf(fp, "# nrcpus online : %u\n", ph->nr_cpus_online);
fprintf(fp, "# nrcpus avail : %u\n", ph->nr_cpus_avail);
}
-static void print_version(struct perf_header *ph, int fd __used, FILE *fp)
+static void print_version(struct perf_header *ph, FILE *fp)
{
fprintf(fp, "# perf version : %s\n", ph->version);
}
-static void print_cmdline(struct perf_header *ph, int fd __used, FILE *fp)
+static void print_cmdline(struct perf_header *ph, FILE *fp)
{
char *str;
int i;
@@ -1023,7 +1023,7 @@ static void print_cmdline(struct perf_header *ph, int fd __used, FILE *fp)
#define TOPO_STR_DELIM ':'
/* For string formatting, see process_cpu_topology() */
-static void print_cpu_topology(struct perf_header *ph, int fd __used, FILE *fp)
+static void print_cpu_topology(struct perf_header *ph, FILE *fp)
{
u32 nr, i;
char *str;
@@ -1074,7 +1074,7 @@ static void print_cpu_topology(struct perf_header *ph, int fd __used, FILE *fp)
}
}
-static void print_event_desc(struct perf_header *ph, int fd __used, FILE *fp)
+static void print_event_desc(struct perf_header *ph, FILE *fp)
{
struct perf_session *session;
struct perf_evsel *evsel;
@@ -1113,13 +1113,13 @@ static void print_event_desc(struct perf_header *ph, int fd __used, FILE *fp)
}
}
-static void print_total_mem(struct perf_header *ph, int fd __used, FILE *fp)
+static void print_total_mem(struct perf_header *ph, FILE *fp)
{
fprintf(fp, "# total memory : %"PRIu64" kB\n", ph->total_mem);
}
/* For string formatting, see process_numa_topology() */
-static void print_numa_topology(struct perf_header *ph, int fd __used, FILE *fp)
+static void print_numa_topology(struct perf_header *ph, FILE *fp)
{
u32 nr, i, node;
u64 mem_total, mem_free;
@@ -1165,13 +1165,12 @@ static void print_numa_topology(struct perf_header *ph, int fd __used, FILE *fp)
}
}
-static void print_cpuid(struct perf_header *ph, int fd __used, FILE *fp)
+static void print_cpuid(struct perf_header *ph, FILE *fp)
{
fprintf(fp, "# cpuid : %s\n", ph->cpuid);
}
-static void print_branch_stack(struct perf_header *ph __used, int fd __used,
- FILE *fp)
+static void print_branch_stack(struct perf_header *ph __used, FILE *fp)
{
fprintf(fp, "# contains samples with branch stack\n");
}
@@ -1684,7 +1683,7 @@ static int process_total_mem(struct perf_file_section *section __used,
struct feature_ops {
int (*write)(int fd, struct perf_header *h, struct perf_evlist *evlist);
- void (*print)(struct perf_header *h, int fd, FILE *fp);
+ void (*print)(struct perf_header *h, FILE *fp);
int (*process)(struct perf_file_section *section,
struct perf_header *h, int feat, int fd, void *data);
const char *name;
@@ -1746,7 +1745,7 @@ static int perf_file_section__fprintf_info(struct perf_file_section *section,
return 0;
if (!feat_ops[feat].full_only || hd->full)
- feat_ops[feat].print(ph, fd, hd->fp);
+ feat_ops[feat].print(ph, hd->fp);
else
fprintf(hd->fp, "# %s info available, use -I to display\n",
feat_ops[feat].name);
--
1.7.9.2
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 5/5] perf header: Remove unused @feat arg from ->process callback
2012-07-21 16:45 [PATCH 1/5] perf header: Do not write event_desc feature Namhyung Kim
` (2 preceding siblings ...)
2012-07-21 16:45 ` [PATCH 4/5] perf header: Remove unused @fd arg from ->print callback Namhyung Kim
@ 2012-07-21 16:45 ` Namhyung Kim
3 siblings, 0 replies; 5+ messages in thread
From: Namhyung Kim @ 2012-07-21 16:45 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo
Cc: Ingo Molnar, Peter Zijlstra, LKML, Stephane Eranian
As the @feat arg is not used anywhere, get rid of it from the signature.
Cc: Stephane Eranian <eranian@google.com>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
| 48 ++++++++++++++++++----------------------------
1 file changed, 19 insertions(+), 29 deletions(-)
--git a/tools/perf/util/header.c b/tools/perf/util/header.c
index 4484a80c20ba..0efbaa3c5a6b 100644
--- a/tools/perf/util/header.c
+++ b/tools/perf/util/header.c
@@ -1325,17 +1325,16 @@ out:
return err;
}
-static int process_tracing_data(struct perf_file_section *section __unused,
- struct perf_header *ph __unused,
- int feat __unused, int fd, void *data)
+static int process_tracing_data(struct perf_file_section *section __used,
+ struct perf_header *ph __used, int fd,
+ void *data)
{
trace_report(fd, data, false);
return 0;
}
static int process_build_id(struct perf_file_section *section,
- struct perf_header *ph,
- int feat __unused, int fd, void *data __used)
+ struct perf_header *ph, int fd, void *data __used)
{
if (perf_header__read_build_ids(ph, fd, section->offset, section->size))
pr_debug("Failed to read buildids, continuing...\n");
@@ -1343,16 +1342,14 @@ static int process_build_id(struct perf_file_section *section,
}
static int process_hostname(struct perf_file_section *section __used,
- struct perf_header *ph, int feat __used, int fd,
- void *data __used)
+ struct perf_header *ph, int fd, void *data __used)
{
ph->hostname = do_read_string(fd, ph);
return ph->hostname ? 0 : -ENOMEM;
}
static int process_osrelease(struct perf_file_section *section __used,
- struct perf_header *ph, int feat __used, int fd,
- void *data __used)
+ struct perf_header *ph, int fd, void *data __used)
{
ph->os_release = do_read_string(fd, ph);
@@ -1360,24 +1357,21 @@ static int process_osrelease(struct perf_file_section *section __used,
}
static int process_arch(struct perf_file_section *section __used,
- struct perf_header *ph, int feat __used, int fd,
- void *data __used)
+ struct perf_header *ph, int fd, void *data __used)
{
ph->arch = do_read_string(fd, ph);
return ph->arch ? 0 : -ENOMEM;
}
static int process_cpudesc(struct perf_file_section *section __used,
- struct perf_header *ph, int feat __used, int fd,
- void *data __used)
+ struct perf_header *ph, int fd, void *data __used)
{
ph->cpu_desc = do_read_string(fd, ph);
return ph->cpu_desc ? 0 : -ENOMEM;
}
static int process_nrcpus(struct perf_file_section *section __used,
- struct perf_header *ph, int feat __used, int fd,
- void *data __used)
+ struct perf_header *ph, int fd, void *data __used)
{
ssize_t ret;
u32 nr;
@@ -1404,8 +1398,7 @@ static int process_nrcpus(struct perf_file_section *section __used,
}
static int process_version(struct perf_file_section *section __used,
- struct perf_header *ph, int feat __used, int fd,
- void *data __used)
+ struct perf_header *ph, int fd, void *data __used)
{
ph->version = do_read_string(fd, ph);
return ph->version ? 0 : -ENOMEM;
@@ -1413,8 +1406,7 @@ static int process_version(struct perf_file_section *section __used,
/* Each argv would be separated by a NULL character */
static int process_cmdline(struct perf_file_section *section __used,
- struct perf_header *ph, int feat __used, int fd,
- void *data __used)
+ struct perf_header *ph, int fd, void *data __used)
{
ssize_t ret;
char *str, *tmp;
@@ -1476,8 +1468,8 @@ error:
* "NR_THREAD_SIBLINGS(M):SIBLING[0]:SIBLING[1]:...:SIBLING[M-1]\n"
*/
static int process_cpu_topology(struct perf_file_section *section __used,
- struct perf_header *ph, int feat __used,
- int fd, void *data __used)
+ struct perf_header *ph, int fd,
+ void *data __used)
{
ssize_t ret;
u32 nr, i;
@@ -1566,8 +1558,8 @@ error:
* "NODE_NUM(N-1):MEM_TOTAL:MEM_FREE:CPULIST\n"
*/
static int process_numa_topology(struct perf_file_section *section __used,
- struct perf_header *ph, int feat __used,
- int fd, void *data __used)
+ struct perf_header *ph, int fd,
+ void *data __used)
{
ssize_t ret;
u32 nr, node, i;
@@ -1656,16 +1648,14 @@ error:
}
static int process_cpuid(struct perf_file_section *section __used,
- struct perf_header *ph, int feat __used, int fd,
- void *data __used)
+ struct perf_header *ph, int fd, void *data __used)
{
ph->cpuid = do_read_string(fd, ph);
return ph->cpuid ? 0 : -ENOMEM;
}
static int process_total_mem(struct perf_file_section *section __used,
- struct perf_header *ph, int feat __used, int fd,
- void *data __used)
+ struct perf_header *ph, int fd, void *data __used)
{
uint64_t mem;
ssize_t ret;
@@ -1685,7 +1675,7 @@ struct feature_ops {
int (*write)(int fd, struct perf_header *h, struct perf_evlist *evlist);
void (*print)(struct perf_header *h, FILE *fp);
int (*process)(struct perf_file_section *section,
- struct perf_header *h, int feat, int fd, void *data);
+ struct perf_header *h, int fd, void *data);
const char *name;
bool full_only;
};
@@ -2196,7 +2186,7 @@ static int perf_file_section__process(struct perf_file_section *section,
if (!feat_ops[feat].process)
return 0;
- return feat_ops[feat].process(section, ph, feat, fd, data);
+ return feat_ops[feat].process(section, ph, fd, data);
}
static int perf_file_header__read_pipe(struct perf_pipe_file_header *header,
--
1.7.9.2
^ permalink raw reply related [flat|nested] 5+ messages in thread
end of thread, other threads:[~2012-07-21 16:47 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-07-21 16:45 [PATCH 1/5] perf header: Do not write event_desc feature Namhyung Kim
2012-07-21 16:45 ` [PATCH 2/5] perf header: add ->process callbacks to most of features Namhyung Kim
2012-07-21 16:45 ` [PATCH 3/5] perf header: Make feat_ops->print use processed result Namhyung Kim
2012-07-21 16:45 ` [PATCH 4/5] perf header: Remove unused @fd arg from ->print callback Namhyung Kim
2012-07-21 16:45 ` [PATCH 5/5] perf header: Remove unused @feat arg from ->process callback Namhyung Kim
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).