* [PATCH 1/1] perf,tools: store cpu->socket and cpu->core in perf_session_env @ 2015-08-27 11:25 kan.liang 2015-08-28 14:45 ` Jiri Olsa 0 siblings, 1 reply; 3+ messages in thread From: kan.liang @ 2015-08-27 11:25 UTC (permalink / raw) To: acme, jolsa; +Cc: ak, linux-kernel, Kan Liang From: Kan Liang <kan.liang@intel.com> This patch parse cpu_topology from perf.data, and store cpu's socket id and core id information in perf_session_env. Signed-off-by: Kan Liang <kan.liang@intel.com> --- tools/perf/util/header.c | 27 ++++++++++++++++++++++++++- tools/perf/util/header.h | 6 ++++++ tools/perf/util/session.c | 1 + 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c index 179b2bd..9308340 100644 --- a/tools/perf/util/header.c +++ b/tools/perf/util/header.c @@ -1590,10 +1590,17 @@ static int process_cpu_topology(struct perf_file_section *section __maybe_unused u32 nr, i; char *str; struct strbuf sb; + int cpu_nr = ph->env.nr_cpus_online; + struct cpu_map *map; + int j; + + ph->env.cpu = calloc(cpu_nr, sizeof(*ph->env.cpu)); + if (!ph->env.cpu) + return -1; ret = readn(fd, &nr, sizeof(nr)); if (ret != sizeof(nr)) - return -1; + goto free_cpu; if (ph->needs_swap) nr = bswap_32(nr); @@ -1608,6 +1615,14 @@ static int process_cpu_topology(struct perf_file_section *section __maybe_unused /* include a NULL character at the end */ strbuf_add(&sb, str, strlen(str) + 1); + + map = cpu_map__new(str); + if (!map) + goto error; + for (j = 0; j < map->nr; j++) { + ph->env.cpu[map->map[j]].socket_id = i; + } + cpu_map__put(map); free(str); } ph->env.sibling_cores = strbuf_detach(&sb, NULL); @@ -1628,6 +1643,14 @@ static int process_cpu_topology(struct perf_file_section *section __maybe_unused /* include a NULL character at the end */ strbuf_add(&sb, str, strlen(str) + 1); + + map = cpu_map__new(str); + if (!map) + goto error; + for (j = 0; j < map->nr; j++) { + ph->env.cpu[map->map[j]].core_id = i; + } + cpu_map__put(map); free(str); } ph->env.sibling_threads = strbuf_detach(&sb, NULL); @@ -1635,6 +1658,8 @@ static int process_cpu_topology(struct perf_file_section *section __maybe_unused error: strbuf_release(&sb); +free_cpu: + free(ph->env.cpu); return -1; } diff --git a/tools/perf/util/header.h b/tools/perf/util/header.h index 9b53b65..8b8c4fc 100644 --- a/tools/perf/util/header.h +++ b/tools/perf/util/header.h @@ -66,6 +66,11 @@ struct perf_header; int perf_file_header__read(struct perf_file_header *header, struct perf_header *ph, int fd); +struct cpu_topology_map { + int socket_id; + int core_id; +}; + struct perf_session_env { char *hostname; char *os_release; @@ -89,6 +94,7 @@ struct perf_session_env { char *sibling_threads; char *numa_nodes; char *pmu_mappings; + struct cpu_topology_map *cpu; }; struct perf_header { diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index 18722e7..51b4d5a 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c @@ -185,6 +185,7 @@ static void perf_session_env__exit(struct perf_session_env *env) zfree(&env->sibling_threads); zfree(&env->numa_nodes); zfree(&env->pmu_mappings); + zfree(&env->cpu); } void perf_session__delete(struct perf_session *session) -- 1.8.3.1 ^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH 1/1] perf,tools: store cpu->socket and cpu->core in perf_session_env 2015-08-27 11:25 [PATCH 1/1] perf,tools: store cpu->socket and cpu->core in perf_session_env kan.liang @ 2015-08-28 14:45 ` Jiri Olsa 2015-08-28 15:43 ` Liang, Kan 0 siblings, 1 reply; 3+ messages in thread From: Jiri Olsa @ 2015-08-28 14:45 UTC (permalink / raw) To: kan.liang; +Cc: acme, jolsa, ak, linux-kernel On Thu, Aug 27, 2015 at 07:25:35AM -0400, kan.liang@intel.com wrote: > From: Kan Liang <kan.liang@intel.com> > > This patch parse cpu_topology from perf.data, and store cpu's socket id > and core id information in perf_session_env. > > Signed-off-by: Kan Liang <kan.liang@intel.com> > --- hum, I've made simple test to try this out (it's attached), and got different results than what I see in the sysfs: [root@ibm-x3650m4-01 cpu]# for i in `seq 0 23`; do core=`cat cpu$i/topology/core_id`; socket=`cat cpu$i/topology/physical_package_id`; echo "CPU $i, core $core, socket $socket"; done CPU 0, core 0, socket 0 CPU 1, core 1, socket 0 CPU 2, core 2, socket 0 CPU 3, core 3, socket 0 CPU 4, core 4, socket 0 CPU 5, core 5, socket 0 CPU 6, core 0, socket 1 CPU 7, core 1, socket 1 CPU 8, core 2, socket 1 CPU 9, core 3, socket 1 CPU 10, core 4, socket 1 CPU 11, core 5, socket 1 CPU 12, core 0, socket 0 CPU 13, core 1, socket 0 CPU 14, core 2, socket 0 CPU 15, core 3, socket 0 CPU 16, core 4, socket 0 CPU 17, core 5, socket 0 CPU 18, core 0, socket 1 CPU 19, core 1, socket 1 CPU 20, core 2, socket 1 CPU 21, core 3, socket 1 CPU 22, core 4, socket 1 CPU 23, core 5, socket 1 [jolsa@ibm-x3650m4-01 perf]$ ./perf test topo 39: Test topology in session :krava /tmp/perf-test-GOODG6 WARNING: The /tmp/perf-test-GOODG6 file's data size field is 0 which is unexpected. Was the 'perf record' command properly terminated? CPU 0, core 0, socket 0 CPU 1, core 1, socket 0 CPU 2, core 2, socket 0 CPU 3, core 3, socket 0 CPU 4, core 4, socket 0 CPU 5, core 5, socket 0 CPU 6, core 6, socket 1 CPU 7, core 7, socket 1 CPU 8, core 8, socket 1 CPU 9, core 9, socket 1 CPU 10, core 10, socket 1 CPU 11, core 11, socket 1 CPU 12, core 0, socket 0 CPU 13, core 1, socket 0 CPU 14, core 2, socket 0 CPU 15, core 3, socket 0 CPU 16, core 4, socket 0 CPU 17, core 5, socket 0 CPU 18, core 6, socket 1 CPU 19, core 7, socket 1 CPU 20, core 8, socket 1 CPU 21, core 9, socket 1 CPU 22, core 10, socket 1 CPU 23, core 11, socket 1 Ok the core id keeps on incrementing for the new socket which is wrong also I think this patch should come with test like this jirka --- tools/perf/tests/Build | 1 + tools/perf/tests/builtin-test.c | 4 +++ tools/perf/tests/tests.h | 1 + tools/perf/tests/topology.c | 68 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 74 insertions(+) create mode 100644 tools/perf/tests/topology.c diff --git a/tools/perf/tests/Build b/tools/perf/tests/Build index c1518bdd0f1b..208bbdf4d623 100644 --- a/tools/perf/tests/Build +++ b/tools/perf/tests/Build @@ -33,6 +33,7 @@ perf-y += parse-no-sample-id-all.o perf-y += kmod-path.o perf-y += thread-map.o perf-y += llvm.o +perf-y += topology.o perf-$(CONFIG_X86) += perf-time-to-tsc.o diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-test.c index 136cd934be66..6650f2652739 100644 --- a/tools/perf/tests/builtin-test.c +++ b/tools/perf/tests/builtin-test.c @@ -179,6 +179,10 @@ static struct test { .func = test__llvm, }, { + .desc = "Test topology in session", + .func = test_session_topology, + }, + { .func = NULL, }, }; diff --git a/tools/perf/tests/tests.h b/tools/perf/tests/tests.h index bf113a247987..95654d7b5810 100644 --- a/tools/perf/tests/tests.h +++ b/tools/perf/tests/tests.h @@ -63,6 +63,7 @@ int test__fdarray__add(void); int test__kmod_path__parse(void); int test__thread_map(void); int test__llvm(void); +int test_session_topology(void); #if defined(__x86_64__) || defined(__i386__) || defined(__arm__) || defined(__aarch64__) #ifdef HAVE_DWARF_UNWIND_SUPPORT diff --git a/tools/perf/tests/topology.c b/tools/perf/tests/topology.c new file mode 100644 index 000000000000..2485dbe670da --- /dev/null +++ b/tools/perf/tests/topology.c @@ -0,0 +1,68 @@ +#include <string.h> +#include <stdlib.h> +#include <stdio.h> +#include "tests.h" +#include "util.h" +#include "session.h" +#include "evlist.h" +#include "debug.h" + +#define TEMPL "/tmp/perf-test-XXXXXX" + +static int get_temp(char *path) +{ + int fd; + + strcpy(path, TEMPL); + + fd = mkstemp(path); + if (fd < 0) { + perror("mkstemp failed"); + return -1; + } + + close(fd); + return 0; +} + +int test_session_topology(void) +{ + struct perf_session *session; + char path[PATH_MAX]; + struct perf_data_file file = { + .path = path, + .mode = PERF_DATA_MODE_WRITE, + }; + int i; + + TEST_ASSERT_VAL("can't get templ file", !get_temp(path)); + + fprintf(stderr, "krava %s\n", path); + + session = perf_session__new(&file, false, NULL); + TEST_ASSERT_VAL("can't get session", session); + + session->evlist = perf_evlist__new_default(); + TEST_ASSERT_VAL("can't get evlist", session->evlist); + + perf_header__set_feat(&session->header, HEADER_CPU_TOPOLOGY); + perf_header__set_feat(&session->header, HEADER_NRCPUS); + + TEST_ASSERT_VAL("failed to write header", + !perf_session__write_header(session, session->evlist, file.fd, true)); + + perf_session__delete(session); + + file.mode = PERF_DATA_MODE_READ; + session = perf_session__new(&file, false, NULL); + TEST_ASSERT_VAL("can't get session", session); + + for (i = 0; i < session->header.env.nr_cpus_online; i++) { + fprintf(stderr, "CPU %d, core %d, socket %d\n", i, + session->header.env.cpu[i].core_id, + session->header.env.cpu[i].socket_id); + } + + perf_session__delete(session); + return 0; +} -- 2.4.3 ^ permalink raw reply [flat|nested] 3+ messages in thread
* RE: [PATCH 1/1] perf,tools: store cpu->socket and cpu->core in perf_session_env 2015-08-28 14:45 ` Jiri Olsa @ 2015-08-28 15:43 ` Liang, Kan 0 siblings, 0 replies; 3+ messages in thread From: Liang, Kan @ 2015-08-28 15:43 UTC (permalink / raw) To: Jiri Olsa; +Cc: acme, jolsa, ak, linux-kernel > On Thu, Aug 27, 2015 at 07:25:35AM -0400, kan.liang@intel.com wrote: > > From: Kan Liang <kan.liang@intel.com> > > > > This patch parse cpu_topology from perf.data, and store cpu's socket > > id and core id information in perf_session_env. > > > > Signed-off-by: Kan Liang <kan.liang@intel.com> > > --- > > hum, I've made simple test to try this out (it's attached), and got different > results than what I see in the sysfs: > > [root@ibm-x3650m4-01 cpu]# for i in `seq 0 23`; do core=`cat > cpu$i/topology/core_id`; socket=`cat cpu$i/topology/physical_package_id`; > echo "CPU $i, core $core, socket $socket"; done CPU 0, core 0, socket 0 > CPU 1, core 1, socket 0 CPU 2, core 2, socket 0 CPU 3, core 3, socket 0 CPU 4, > core 4, socket 0 CPU 5, core 5, socket 0 CPU 6, core 0, socket 1 CPU 7, core 1, > socket 1 CPU 8, core 2, socket 1 CPU 9, core 3, socket 1 CPU 10, core 4, > socket 1 CPU 11, core 5, socket 1 CPU 12, core 0, socket 0 CPU 13, core 1, > socket 0 CPU 14, core 2, socket 0 CPU 15, core 3, socket 0 CPU 16, core 4, > socket 0 CPU 17, core 5, socket 0 CPU 18, core 0, socket 1 CPU 19, core 1, > socket 1 CPU 20, core 2, socket 1 CPU 21, core 3, socket 1 CPU 22, core 4, > socket 1 CPU 23, core 5, socket 1 > > > [jolsa@ibm-x3650m4-01 perf]$ ./perf test topo > 39: Test topology in session :krava /tmp/perf-test- > GOODG6 > WARNING: The /tmp/perf-test-GOODG6 file's data size field is 0 which is > unexpected. > Was the 'perf record' command properly terminated? > CPU 0, core 0, socket 0 > CPU 1, core 1, socket 0 > CPU 2, core 2, socket 0 > CPU 3, core 3, socket 0 > CPU 4, core 4, socket 0 > CPU 5, core 5, socket 0 > CPU 6, core 6, socket 1 > CPU 7, core 7, socket 1 > CPU 8, core 8, socket 1 > CPU 9, core 9, socket 1 > CPU 10, core 10, socket 1 > CPU 11, core 11, socket 1 > CPU 12, core 0, socket 0 > CPU 13, core 1, socket 0 > CPU 14, core 2, socket 0 > CPU 15, core 3, socket 0 > CPU 16, core 4, socket 0 > CPU 17, core 5, socket 0 > CPU 18, core 6, socket 1 > CPU 19, core 7, socket 1 > CPU 20, core 8, socket 1 > CPU 21, core 9, socket 1 > CPU 22, core 10, socket 1 > CPU 23, core 11, socket 1 > Ok > > the core id keeps on incrementing for the new socket which is wrong also I Right. I assumed the core id and socket id all keeps on increasing. If it's wrong, I guess we have to store core_id and socket_id in perf.data. I will implement a new version for that. > think this patch should come with test like this > Will include it to next version. Thanks, Kan > jirka > > > --- > tools/perf/tests/Build | 1 + > tools/perf/tests/builtin-test.c | 4 +++ > tools/perf/tests/tests.h | 1 + > tools/perf/tests/topology.c | 68 > +++++++++++++++++++++++++++++++++++++++++ > 4 files changed, 74 insertions(+) > create mode 100644 tools/perf/tests/topology.c > > diff --git a/tools/perf/tests/Build b/tools/perf/tests/Build index > c1518bdd0f1b..208bbdf4d623 100644 > --- a/tools/perf/tests/Build > +++ b/tools/perf/tests/Build > @@ -33,6 +33,7 @@ perf-y += parse-no-sample-id-all.o perf-y += kmod- > path.o perf-y += thread-map.o perf-y += llvm.o > +perf-y += topology.o > > perf-$(CONFIG_X86) += perf-time-to-tsc.o > > diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-test.c > index 136cd934be66..6650f2652739 100644 > --- a/tools/perf/tests/builtin-test.c > +++ b/tools/perf/tests/builtin-test.c > @@ -179,6 +179,10 @@ static struct test { > .func = test__llvm, > }, > { > + .desc = "Test topology in session", > + .func = test_session_topology, > + }, > + { > .func = NULL, > }, > }; > diff --git a/tools/perf/tests/tests.h b/tools/perf/tests/tests.h index > bf113a247987..95654d7b5810 100644 > --- a/tools/perf/tests/tests.h > +++ b/tools/perf/tests/tests.h > @@ -63,6 +63,7 @@ int test__fdarray__add(void); int > test__kmod_path__parse(void); int test__thread_map(void); int > test__llvm(void); > +int test_session_topology(void); > > #if defined(__x86_64__) || defined(__i386__) || defined(__arm__) || > defined(__aarch64__) #ifdef HAVE_DWARF_UNWIND_SUPPORT diff --git > a/tools/perf/tests/topology.c b/tools/perf/tests/topology.c new file mode > 100644 index 000000000000..2485dbe670da > --- /dev/null > +++ b/tools/perf/tests/topology.c > @@ -0,0 +1,68 @@ > +#include <string.h> > +#include <stdlib.h> > +#include <stdio.h> > +#include "tests.h" > +#include "util.h" > +#include "session.h" > +#include "evlist.h" > +#include "debug.h" > + > +#define TEMPL "/tmp/perf-test-XXXXXX" > + > +static int get_temp(char *path) > +{ > + int fd; > + > + strcpy(path, TEMPL); > + > + fd = mkstemp(path); > + if (fd < 0) { > + perror("mkstemp failed"); > + return -1; > + } > + > + close(fd); > + return 0; > +} > + > +int test_session_topology(void) > +{ > + struct perf_session *session; > + char path[PATH_MAX]; > + struct perf_data_file file = { > + .path = path, > + .mode = PERF_DATA_MODE_WRITE, > + }; > + int i; > + > + TEST_ASSERT_VAL("can't get templ file", !get_temp(path)); > + > + fprintf(stderr, "krava %s\n", path); > + > + session = perf_session__new(&file, false, NULL); > + TEST_ASSERT_VAL("can't get session", session); > + > + session->evlist = perf_evlist__new_default(); > + TEST_ASSERT_VAL("can't get evlist", session->evlist); > + > + perf_header__set_feat(&session->header, > HEADER_CPU_TOPOLOGY); > + perf_header__set_feat(&session->header, HEADER_NRCPUS); > + > + TEST_ASSERT_VAL("failed to write header", > + !perf_session__write_header(session, session- > >evlist, file.fd, > +true)); > + > + perf_session__delete(session); > + > + file.mode = PERF_DATA_MODE_READ; > + session = perf_session__new(&file, false, NULL); > + TEST_ASSERT_VAL("can't get session", session); > + > + for (i = 0; i < session->header.env.nr_cpus_online; i++) { > + fprintf(stderr, "CPU %d, core %d, socket %d\n", i, > + session->header.env.cpu[i].core_id, > + session->header.env.cpu[i].socket_id); > + } > + > + perf_session__delete(session); > + return 0; > +} > -- > 2.4.3 ^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2015-08-28 15:43 UTC | newest] Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2015-08-27 11:25 [PATCH 1/1] perf,tools: store cpu->socket and cpu->core in perf_session_env kan.liang 2015-08-28 14:45 ` Jiri Olsa 2015-08-28 15:43 ` Liang, Kan
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®