RE: [PATCH RFC 02/10] perf,tools: Support new sort type --socket
> > On Mon, Aug 24, 2015 at 09:30:21PM +0200, Jiri Olsa wrote: > > On Mon, Aug 24, 2015 at 04:47:12PM +, Liang, Kan wrote: > > > > > > > > > > On Mon, Aug 24, 2015 at 02:22:08PM +, Liang, Kan wrote: > > > > > > > > > > > > On Fri, Aug 21, 2015 at 08:25:24PM +, Liang, Kan wrote: > > > > > > > > > > > > SNIP > > > > > > > > > > > > > > > > > > > > > > we need global topology information in perf.data and use > > > > > > > > the mapping from there, we can't use current server info > > > > > > > > > > > > > > > > we currently store core_siblings_list and > > > > > > > > thread_siblings_list, in topology FEATURE, which is > > > > > > > > probably not enough > > > > > > > > > > > > > > > > > > > > > > core_siblings_list includes the cpu list in the same socket. > > > > > > > thread_siblings_list includes the cpu list in the same core. > > > > > > > numa_nodes includes the cpu list for each node. > > > > > > > > > > > > > > It looks we have enough data from topology FEATURE. > > > > > > > > > > > > hum, haven't hecked deeply.. how will you get core id for cpu? > > > > > > > > > > > > > > > > from thread_siblings_list. > > > > > I just noticed that svg_build_topology_map did the similar > > > > > thing to get topology map for timechart from perf header. > > > > > > > > could you please provide both functions then cpu -> core, cpu -> > > > > socket > > > > > > > > > > Do you mean something like this? > > > Store cpu->socket and cpu->core in perf_session_env. > > > > yep, seems ok > > any chance you could send out this one? I'd need to use it in my other stuff > Ok I will send out this patch as a separate patch first. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH RFC 02/10] perf,tools: Support new sort type --socket
On Mon, Aug 24, 2015 at 09:30:21PM +0200, Jiri Olsa wrote: > On Mon, Aug 24, 2015 at 04:47:12PM +, Liang, Kan wrote: > > > > > > > On Mon, Aug 24, 2015 at 02:22:08PM +, Liang, Kan wrote: > > > > > > > > > > On Fri, Aug 21, 2015 at 08:25:24PM +, Liang, Kan wrote: > > > > > > > > > > SNIP > > > > > > > > > > > > > > > > > > > we need global topology information in perf.data and use the > > > > > > > mapping from there, we can't use current server info > > > > > > > > > > > > > > we currently store core_siblings_list and thread_siblings_list, > > > > > > > in topology FEATURE, which is probably not enough > > > > > > > > > > > > > > > > > > > core_siblings_list includes the cpu list in the same socket. > > > > > > thread_siblings_list includes the cpu list in the same core. > > > > > > numa_nodes includes the cpu list for each node. > > > > > > > > > > > > It looks we have enough data from topology FEATURE. > > > > > > > > > > hum, haven't hecked deeply.. how will you get core id for cpu? > > > > > > > > > > > > > from thread_siblings_list. > > > > I just noticed that svg_build_topology_map did the similar thing to > > > > get topology map for timechart from perf header. > > > > > > could you please provide both functions then cpu -> core, cpu -> socket > > > > > > > Do you mean something like this? > > Store cpu->socket and cpu->core in perf_session_env. > > yep, seems ok any chance you could send out this one? I'd need to use it in my other stuff thanks, jirka -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH RFC 02/10] perf,tools: Support new sort type --socket
On Mon, Aug 24, 2015 at 09:30:21PM +0200, Jiri Olsa wrote: On Mon, Aug 24, 2015 at 04:47:12PM +, Liang, Kan wrote: On Mon, Aug 24, 2015 at 02:22:08PM +, Liang, Kan wrote: On Fri, Aug 21, 2015 at 08:25:24PM +, Liang, Kan wrote: SNIP we need global topology information in perf.data and use the mapping from there, we can't use current server info we currently store core_siblings_list and thread_siblings_list, in topology FEATURE, which is probably not enough core_siblings_list includes the cpu list in the same socket. thread_siblings_list includes the cpu list in the same core. numa_nodes includes the cpu list for each node. It looks we have enough data from topology FEATURE. hum, haven't hecked deeply.. how will you get core id for cpu? from thread_siblings_list. I just noticed that svg_build_topology_map did the similar thing to get topology map for timechart from perf header. could you please provide both functions then cpu - core, cpu - socket Do you mean something like this? Store cpu-socket and cpu-core in perf_session_env. yep, seems ok any chance you could send out this one? I'd need to use it in my other stuff thanks, jirka -- To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
RE: [PATCH RFC 02/10] perf,tools: Support new sort type --socket
On Mon, Aug 24, 2015 at 09:30:21PM +0200, Jiri Olsa wrote: On Mon, Aug 24, 2015 at 04:47:12PM +, Liang, Kan wrote: On Mon, Aug 24, 2015 at 02:22:08PM +, Liang, Kan wrote: On Fri, Aug 21, 2015 at 08:25:24PM +, Liang, Kan wrote: SNIP we need global topology information in perf.data and use the mapping from there, we can't use current server info we currently store core_siblings_list and thread_siblings_list, in topology FEATURE, which is probably not enough core_siblings_list includes the cpu list in the same socket. thread_siblings_list includes the cpu list in the same core. numa_nodes includes the cpu list for each node. It looks we have enough data from topology FEATURE. hum, haven't hecked deeply.. how will you get core id for cpu? from thread_siblings_list. I just noticed that svg_build_topology_map did the similar thing to get topology map for timechart from perf header. could you please provide both functions then cpu - core, cpu - socket Do you mean something like this? Store cpu-socket and cpu-core in perf_session_env. yep, seems ok any chance you could send out this one? I'd need to use it in my other stuff Ok I will send out this patch as a separate patch first. -- To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH RFC 02/10] perf,tools: Support new sort type --socket
On Mon, Aug 24, 2015 at 04:47:12PM +, Liang, Kan wrote: > > > > On Mon, Aug 24, 2015 at 02:22:08PM +, Liang, Kan wrote: > > > > > > > > On Fri, Aug 21, 2015 at 08:25:24PM +, Liang, Kan wrote: > > > > > > > > SNIP > > > > > > > > > > > > > > > > we need global topology information in perf.data and use the > > > > > > mapping from there, we can't use current server info > > > > > > > > > > > > we currently store core_siblings_list and thread_siblings_list, > > > > > > in topology FEATURE, which is probably not enough > > > > > > > > > > > > > > > > core_siblings_list includes the cpu list in the same socket. > > > > > thread_siblings_list includes the cpu list in the same core. > > > > > numa_nodes includes the cpu list for each node. > > > > > > > > > > It looks we have enough data from topology FEATURE. > > > > > > > > hum, haven't hecked deeply.. how will you get core id for cpu? > > > > > > > > > > from thread_siblings_list. > > > I just noticed that svg_build_topology_map did the similar thing to > > > get topology map for timechart from perf header. > > > > could you please provide both functions then cpu -> core, cpu -> socket > > > > Do you mean something like this? > Store cpu->socket and cpu->core in perf_session_env. yep, seems ok thanks, jirka > > diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c > index 179b2bd..a01c603 100644 > --- a/tools/perf/util/header.c > +++ b/tools/perf/util/header.c > @@ -1590,10 +1596,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, , sizeof(nr)); > if (ret != sizeof(nr)) > - return -1; > + goto free_cpu; > > if (ph->needs_swap) > nr = bswap_32(nr); > @@ -1608,6 +1621,14 @@ static int process_cpu_topology(struct > perf_file_section *section __maybe_unused > > /* include a NULL character at the end */ > strbuf_add(, 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(, NULL); > @@ -1628,6 +1649,14 @@ static int process_cpu_topology(struct > perf_file_section *section __maybe_unused > > /* include a NULL character at the end */ > strbuf_add(, 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(, NULL); > @@ -1635,6 +1664,8 @@ static int process_cpu_topology(struct > perf_file_section *section __maybe_unused > > error: > strbuf_release(); > +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(>sibling_threads); > zfree(>numa_nodes); > zfree(>pmu_mappings); > + zfree(>cpu); > } > > void perf_session__delete(struct perf_session *session) > -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
RE: [PATCH RFC 02/10] perf,tools: Support new sort type --socket
> On Mon, Aug 24, 2015 at 02:22:08PM +, Liang, Kan wrote: > > > > > > On Fri, Aug 21, 2015 at 08:25:24PM +, Liang, Kan wrote: > > > > > > SNIP > > > > > > > > > > > > > we need global topology information in perf.data and use the > > > > > mapping from there, we can't use current server info > > > > > > > > > > we currently store core_siblings_list and thread_siblings_list, > > > > > in topology FEATURE, which is probably not enough > > > > > > > > > > > > > core_siblings_list includes the cpu list in the same socket. > > > > thread_siblings_list includes the cpu list in the same core. > > > > numa_nodes includes the cpu list for each node. > > > > > > > > It looks we have enough data from topology FEATURE. > > > > > > hum, haven't hecked deeply.. how will you get core id for cpu? > > > > > > > from thread_siblings_list. > > I just noticed that svg_build_topology_map did the similar thing to > > get topology map for timechart from perf header. > > could you please provide both functions then cpu -> core, cpu -> socket > Do you mean something like this? Store cpu->socket and cpu->core in perf_session_env. diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c index 179b2bd..a01c603 100644 --- a/tools/perf/util/header.c +++ b/tools/perf/util/header.c @@ -1590,10 +1596,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, , sizeof(nr)); if (ret != sizeof(nr)) - return -1; + goto free_cpu; if (ph->needs_swap) nr = bswap_32(nr); @@ -1608,6 +1621,14 @@ static int process_cpu_topology(struct perf_file_section *section __maybe_unused /* include a NULL character at the end */ strbuf_add(, 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(, NULL); @@ -1628,6 +1649,14 @@ static int process_cpu_topology(struct perf_file_section *section __maybe_unused /* include a NULL character at the end */ strbuf_add(, 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(, NULL); @@ -1635,6 +1664,8 @@ static int process_cpu_topology(struct perf_file_section *section __maybe_unused error: strbuf_release(); +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(>sibling_threads); zfree(>numa_nodes); zfree(>pmu_mappings); + zfree(>cpu); } void perf_session__delete(struct perf_session *session) -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH RFC 02/10] perf,tools: Support new sort type --socket
On Mon, Aug 24, 2015 at 02:22:08PM +, Liang, Kan wrote: > > > > On Fri, Aug 21, 2015 at 08:25:24PM +, Liang, Kan wrote: > > > > SNIP > > > > > > > > > > we need global topology information in perf.data and use the mapping > > > > from there, we can't use current server info > > > > > > > > we currently store core_siblings_list and thread_siblings_list, in > > > > topology FEATURE, which is probably not enough > > > > > > > > > > core_siblings_list includes the cpu list in the same socket. > > > thread_siblings_list includes the cpu list in the same core. > > > numa_nodes includes the cpu list for each node. > > > > > > It looks we have enough data from topology FEATURE. > > > > hum, haven't hecked deeply.. how will you get core id for cpu? > > > > from thread_siblings_list. > I just noticed that svg_build_topology_map did the similar thing to > get topology map for timechart from perf header. could you please provide both functions then cpu -> core, cpu -> socket thanks, jirka -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
RE: [PATCH RFC 02/10] perf,tools: Support new sort type --socket
> > On Fri, Aug 21, 2015 at 08:25:24PM +, Liang, Kan wrote: > > SNIP > > > > > > > we need global topology information in perf.data and use the mapping > > > from there, we can't use current server info > > > > > > we currently store core_siblings_list and thread_siblings_list, in > > > topology FEATURE, which is probably not enough > > > > > > > core_siblings_list includes the cpu list in the same socket. > > thread_siblings_list includes the cpu list in the same core. > > numa_nodes includes the cpu list for each node. > > > > It looks we have enough data from topology FEATURE. > > hum, haven't hecked deeply.. how will you get core id for cpu? > from thread_siblings_list. I just noticed that svg_build_topology_map did the similar thing to get topology map for timechart from perf header. > > > > What do you think about the function as below? > > It gets the socket id from env. > > some sort of caching would be nice, I guess we could store those cpumap > objects within perf_session_env Yes it will be stored in perf_session_env. Thanks, Kan -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH RFC 02/10] perf,tools: Support new sort type --socket
On Mon, Aug 24, 2015 at 02:22:08PM +, Liang, Kan wrote: On Fri, Aug 21, 2015 at 08:25:24PM +, Liang, Kan wrote: SNIP we need global topology information in perf.data and use the mapping from there, we can't use current server info we currently store core_siblings_list and thread_siblings_list, in topology FEATURE, which is probably not enough core_siblings_list includes the cpu list in the same socket. thread_siblings_list includes the cpu list in the same core. numa_nodes includes the cpu list for each node. It looks we have enough data from topology FEATURE. hum, haven't hecked deeply.. how will you get core id for cpu? from thread_siblings_list. I just noticed that svg_build_topology_map did the similar thing to get topology map for timechart from perf header. could you please provide both functions then cpu - core, cpu - socket thanks, jirka -- To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
RE: [PATCH RFC 02/10] perf,tools: Support new sort type --socket
On Fri, Aug 21, 2015 at 08:25:24PM +, Liang, Kan wrote: SNIP we need global topology information in perf.data and use the mapping from there, we can't use current server info we currently store core_siblings_list and thread_siblings_list, in topology FEATURE, which is probably not enough core_siblings_list includes the cpu list in the same socket. thread_siblings_list includes the cpu list in the same core. numa_nodes includes the cpu list for each node. It looks we have enough data from topology FEATURE. hum, haven't hecked deeply.. how will you get core id for cpu? from thread_siblings_list. I just noticed that svg_build_topology_map did the similar thing to get topology map for timechart from perf header. What do you think about the function as below? It gets the socket id from env. some sort of caching would be nice, I guess we could store those cpumap objects within perf_session_env Yes it will be stored in perf_session_env. Thanks, Kan -- To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
RE: [PATCH RFC 02/10] perf,tools: Support new sort type --socket
On Mon, Aug 24, 2015 at 02:22:08PM +, Liang, Kan wrote: On Fri, Aug 21, 2015 at 08:25:24PM +, Liang, Kan wrote: SNIP we need global topology information in perf.data and use the mapping from there, we can't use current server info we currently store core_siblings_list and thread_siblings_list, in topology FEATURE, which is probably not enough core_siblings_list includes the cpu list in the same socket. thread_siblings_list includes the cpu list in the same core. numa_nodes includes the cpu list for each node. It looks we have enough data from topology FEATURE. hum, haven't hecked deeply.. how will you get core id for cpu? from thread_siblings_list. I just noticed that svg_build_topology_map did the similar thing to get topology map for timechart from perf header. could you please provide both functions then cpu - core, cpu - socket Do you mean something like this? Store cpu-socket and cpu-core in perf_session_env. diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c index 179b2bd..a01c603 100644 --- a/tools/perf/util/header.c +++ b/tools/perf/util/header.c @@ -1590,10 +1596,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 +1621,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 +1649,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 +1664,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) -- To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH RFC 02/10] perf,tools: Support new sort type --socket
On Mon, Aug 24, 2015 at 04:47:12PM +, Liang, Kan wrote: On Mon, Aug 24, 2015 at 02:22:08PM +, Liang, Kan wrote: On Fri, Aug 21, 2015 at 08:25:24PM +, Liang, Kan wrote: SNIP we need global topology information in perf.data and use the mapping from there, we can't use current server info we currently store core_siblings_list and thread_siblings_list, in topology FEATURE, which is probably not enough core_siblings_list includes the cpu list in the same socket. thread_siblings_list includes the cpu list in the same core. numa_nodes includes the cpu list for each node. It looks we have enough data from topology FEATURE. hum, haven't hecked deeply.. how will you get core id for cpu? from thread_siblings_list. I just noticed that svg_build_topology_map did the similar thing to get topology map for timechart from perf header. could you please provide both functions then cpu - core, cpu - socket Do you mean something like this? Store cpu-socket and cpu-core in perf_session_env. yep, seems ok thanks, jirka diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c index 179b2bd..a01c603 100644 --- a/tools/perf/util/header.c +++ b/tools/perf/util/header.c @@ -1590,10 +1596,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 +1621,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 +1649,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 +1664,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) -- To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH RFC 02/10] perf,tools: Support new sort type --socket
On Fri, Aug 21, 2015 at 08:25:24PM +, Liang, Kan wrote: SNIP > > > > we need global topology information in perf.data and use the mapping > > from there, we can't use current server info > > > > we currently store core_siblings_list and thread_siblings_list, in topology > > FEATURE, which is probably not enough > > > > core_siblings_list includes the cpu list in the same socket. > thread_siblings_list includes the cpu list in the same core. > numa_nodes includes the cpu list for each node. > > It looks we have enough data from topology FEATURE. hum, haven't hecked deeply.. how will you get core id for cpu? > > What do you think about the function as below? > It gets the socket id from env. some sort of caching would be nice, I guess we could store those cpumap objects within perf_session_env jirka > > +int > +perf_env_get_socket(struct perf_session_env *env, int cpu) > +{ > + int socket_nr, cpu_nr, i, j; > + struct cpu_map *socket_map = NULL; > + char *str; > + > + if (env == NULL) > + return -1; > + > + socket_nr = env->nr_sibling_cores; > + str = env->sibling_cores; > + > + for (i = 0; i < socket_nr; i++) { > + socket_map = cpu_map__new(str); > + str += strlen(str) + 1; > + if (!socket_map) > + continue; > + cpu_nr = socket_map->nr; > + for (j = 0; j < cpu_nr; j++) { > + if (cpu == socket_map->map[j]) { > + free(socket_map); > + return i; > + } > + } > + free(socket_map); > + } > + > + return -1; > +} > > Thanks, > Kan > > > I think we need new feature that stores topology info and new interface > > that will provide all useful mappings: > > idx -> cpu > > cpu -> core > > cpu -> socket > > cpu -> node > > > > in another patchset I used new CPUMAP event: > > https://git.kernel.org/cgit/linux/kernel/git/jolsa/perf.git/commit/?h=perf/ > > stat_script_3=37b7b8449aa23acdfe9dec5a7a371e91c5323da5 > > > > we might need both ways (new FEATURE and event) to support pipe > > reports > > > > jirka -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH RFC 02/10] perf,tools: Support new sort type --socket
On Fri, Aug 21, 2015 at 08:25:24PM +, Liang, Kan wrote: SNIP we need global topology information in perf.data and use the mapping from there, we can't use current server info we currently store core_siblings_list and thread_siblings_list, in topology FEATURE, which is probably not enough core_siblings_list includes the cpu list in the same socket. thread_siblings_list includes the cpu list in the same core. numa_nodes includes the cpu list for each node. It looks we have enough data from topology FEATURE. hum, haven't hecked deeply.. how will you get core id for cpu? What do you think about the function as below? It gets the socket id from env. some sort of caching would be nice, I guess we could store those cpumap objects within perf_session_env jirka +int +perf_env_get_socket(struct perf_session_env *env, int cpu) +{ + int socket_nr, cpu_nr, i, j; + struct cpu_map *socket_map = NULL; + char *str; + + if (env == NULL) + return -1; + + socket_nr = env-nr_sibling_cores; + str = env-sibling_cores; + + for (i = 0; i socket_nr; i++) { + socket_map = cpu_map__new(str); + str += strlen(str) + 1; + if (!socket_map) + continue; + cpu_nr = socket_map-nr; + for (j = 0; j cpu_nr; j++) { + if (cpu == socket_map-map[j]) { + free(socket_map); + return i; + } + } + free(socket_map); + } + + return -1; +} Thanks, Kan I think we need new feature that stores topology info and new interface that will provide all useful mappings: idx - cpu cpu - core cpu - socket cpu - node in another patchset I used new CPUMAP event: https://git.kernel.org/cgit/linux/kernel/git/jolsa/perf.git/commit/?h=perf/ stat_script_3id=37b7b8449aa23acdfe9dec5a7a371e91c5323da5 we might need both ways (new FEATURE and event) to support pipe reports jirka -- To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
RE: [PATCH RFC 02/10] perf,tools: Support new sort type --socket
> On Tue, Aug 18, 2015 at 05:25:38AM -0400, kan.li...@intel.com wrote: > > From: Kan Liang > > > > This patch enable perf report to sort by socket > > > > SNIP > > > diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c index > > 7e38716..245e254 100644 > > --- a/tools/perf/util/sort.c > > +++ b/tools/perf/util/sort.c > > @@ -421,6 +421,33 @@ struct sort_entry sort_cpu = { > > .se_width_idx = HISTC_CPU, > > }; > > > > +/* --sort socket */ > > + > > +static int64_t > > +sort__socket_cmp(struct hist_entry *left, struct hist_entry *right) { > > + int r_socket, l_socket; > > + > > + r_socket = cpu__get_socket(right->cpu); > > + l_socket = cpu__get_socket(left->cpu); > > + return r_socket - l_socket; > > we need global topology information in perf.data and use the mapping > from there, we can't use current server info > > we currently store core_siblings_list and thread_siblings_list, in topology > FEATURE, which is probably not enough > core_siblings_list includes the cpu list in the same socket. thread_siblings_list includes the cpu list in the same core. numa_nodes includes the cpu list for each node. It looks we have enough data from topology FEATURE. What do you think about the function as below? It gets the socket id from env. +int +perf_env_get_socket(struct perf_session_env *env, int cpu) +{ + int socket_nr, cpu_nr, i, j; + struct cpu_map *socket_map = NULL; + char *str; + + if (env == NULL) + return -1; + + socket_nr = env->nr_sibling_cores; + str = env->sibling_cores; + + for (i = 0; i < socket_nr; i++) { + socket_map = cpu_map__new(str); + str += strlen(str) + 1; + if (!socket_map) + continue; + cpu_nr = socket_map->nr; + for (j = 0; j < cpu_nr; j++) { + if (cpu == socket_map->map[j]) { + free(socket_map); + return i; + } + } + free(socket_map); + } + + return -1; +} Thanks, Kan > I think we need new feature that stores topology info and new interface > that will provide all useful mappings: > idx -> cpu > cpu -> core > cpu -> socket > cpu -> node > > in another patchset I used new CPUMAP event: > https://git.kernel.org/cgit/linux/kernel/git/jolsa/perf.git/commit/?h=perf/ > stat_script_3=37b7b8449aa23acdfe9dec5a7a371e91c5323da5 > > we might need both ways (new FEATURE and event) to support pipe > reports > > jirka -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
RE: [PATCH RFC 02/10] perf,tools: Support new sort type --socket
On Tue, Aug 18, 2015 at 05:25:38AM -0400, kan.li...@intel.com wrote: From: Kan Liang kan.li...@intel.com This patch enable perf report to sort by socket SNIP diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c index 7e38716..245e254 100644 --- a/tools/perf/util/sort.c +++ b/tools/perf/util/sort.c @@ -421,6 +421,33 @@ struct sort_entry sort_cpu = { .se_width_idx = HISTC_CPU, }; +/* --sort socket */ + +static int64_t +sort__socket_cmp(struct hist_entry *left, struct hist_entry *right) { + int r_socket, l_socket; + + r_socket = cpu__get_socket(right-cpu); + l_socket = cpu__get_socket(left-cpu); + return r_socket - l_socket; we need global topology information in perf.data and use the mapping from there, we can't use current server info we currently store core_siblings_list and thread_siblings_list, in topology FEATURE, which is probably not enough core_siblings_list includes the cpu list in the same socket. thread_siblings_list includes the cpu list in the same core. numa_nodes includes the cpu list for each node. It looks we have enough data from topology FEATURE. What do you think about the function as below? It gets the socket id from env. +int +perf_env_get_socket(struct perf_session_env *env, int cpu) +{ + int socket_nr, cpu_nr, i, j; + struct cpu_map *socket_map = NULL; + char *str; + + if (env == NULL) + return -1; + + socket_nr = env-nr_sibling_cores; + str = env-sibling_cores; + + for (i = 0; i socket_nr; i++) { + socket_map = cpu_map__new(str); + str += strlen(str) + 1; + if (!socket_map) + continue; + cpu_nr = socket_map-nr; + for (j = 0; j cpu_nr; j++) { + if (cpu == socket_map-map[j]) { + free(socket_map); + return i; + } + } + free(socket_map); + } + + return -1; +} Thanks, Kan I think we need new feature that stores topology info and new interface that will provide all useful mappings: idx - cpu cpu - core cpu - socket cpu - node in another patchset I used new CPUMAP event: https://git.kernel.org/cgit/linux/kernel/git/jolsa/perf.git/commit/?h=perf/ stat_script_3id=37b7b8449aa23acdfe9dec5a7a371e91c5323da5 we might need both ways (new FEATURE and event) to support pipe reports jirka -- To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH RFC 02/10] perf,tools: Support new sort type --socket
On Tue, Aug 18, 2015 at 05:25:38AM -0400, kan.li...@intel.com wrote: > From: Kan Liang > > This patch enable perf report to sort by socket > SNIP > diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c > index 7e38716..245e254 100644 > --- a/tools/perf/util/sort.c > +++ b/tools/perf/util/sort.c > @@ -421,6 +421,33 @@ struct sort_entry sort_cpu = { > .se_width_idx = HISTC_CPU, > }; > > +/* --sort socket */ > + > +static int64_t > +sort__socket_cmp(struct hist_entry *left, struct hist_entry *right) > +{ > + int r_socket, l_socket; > + > + r_socket = cpu__get_socket(right->cpu); > + l_socket = cpu__get_socket(left->cpu); > + return r_socket - l_socket; we need global topology information in perf.data and use the mapping from there, we can't use current server info we currently store core_siblings_list and thread_siblings_list, in topology FEATURE, which is probably not enough I think we need new feature that stores topology info and new interface that will provide all useful mappings: idx -> cpu cpu -> core cpu -> socket cpu -> node in another patchset I used new CPUMAP event: https://git.kernel.org/cgit/linux/kernel/git/jolsa/perf.git/commit/?h=perf/stat_script_3=37b7b8449aa23acdfe9dec5a7a371e91c5323da5 we might need both ways (new FEATURE and event) to support pipe reports jirka -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH RFC 02/10] perf,tools: Support new sort type --socket
On Tue, Aug 18, 2015 at 05:25:38AM -0400, kan.li...@intel.com wrote: From: Kan Liang kan.li...@intel.com This patch enable perf report to sort by socket SNIP diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c index 7e38716..245e254 100644 --- a/tools/perf/util/sort.c +++ b/tools/perf/util/sort.c @@ -421,6 +421,33 @@ struct sort_entry sort_cpu = { .se_width_idx = HISTC_CPU, }; +/* --sort socket */ + +static int64_t +sort__socket_cmp(struct hist_entry *left, struct hist_entry *right) +{ + int r_socket, l_socket; + + r_socket = cpu__get_socket(right-cpu); + l_socket = cpu__get_socket(left-cpu); + return r_socket - l_socket; we need global topology information in perf.data and use the mapping from there, we can't use current server info we currently store core_siblings_list and thread_siblings_list, in topology FEATURE, which is probably not enough I think we need new feature that stores topology info and new interface that will provide all useful mappings: idx - cpu cpu - core cpu - socket cpu - node in another patchset I used new CPUMAP event: https://git.kernel.org/cgit/linux/kernel/git/jolsa/perf.git/commit/?h=perf/stat_script_3id=37b7b8449aa23acdfe9dec5a7a371e91c5323da5 we might need both ways (new FEATURE and event) to support pipe reports jirka -- To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[PATCH RFC 02/10] perf,tools: Support new sort type --socket
From: Kan Liang This patch enable perf report to sort by socket $ perf report --stdio --sort socket,comm,dso,symbol # To display the perf.data header info, please use --header/--header-only options. # # # Total Lost Samples: 0 # # Samples: 686 of event 'cycles' # Event count (approx.): 349215462 # # Overhead SOCKET CommandShared Object Symbol # .. . . # 97.05% 000 test test [.] plusB_c 0.98% 000 test test [.] plusA_c 0.93% 001 perf [kernel.vmlinux] [k] smp_call_function_single 0.19% 001 perf [kernel.vmlinux] [k] page_fault 0.19% 001 swapper[kernel.vmlinux] [k] pm_qos_request 0.16% 000 test [kernel.vmlinux] [k] add_mm_counter_fast Signed-off-by: Kan Liang --- tools/perf/Documentation/perf-report.txt | 3 ++- tools/perf/util/cpumap.c | 21 ++--- tools/perf/util/cpumap.h | 1 + tools/perf/util/hist.h | 1 + tools/perf/util/sort.c | 28 tools/perf/util/sort.h | 1 + 6 files changed, 47 insertions(+), 8 deletions(-) diff --git a/tools/perf/Documentation/perf-report.txt b/tools/perf/Documentation/perf-report.txt index a18ba75..ca76b0d 100644 --- a/tools/perf/Documentation/perf-report.txt +++ b/tools/perf/Documentation/perf-report.txt @@ -68,7 +68,7 @@ OPTIONS --sort=:: Sort histogram entries by given key(s) - multiple keys can be specified in CSV format. Following sort keys are available: - pid, comm, dso, symbol, parent, cpu, srcline, weight, local_weight. + pid, comm, dso, symbol, parent, cpu, socket, srcline, weight, local_weight. Each key has following meaning: @@ -79,6 +79,7 @@ OPTIONS - parent: name of function matched to the parent regex filter. Unmatched entries are displayed as "[other]". - cpu: cpu number the task ran at the time of sample + - socket: socket number the task ran at the time of sample - srcline: filename and line number executed at the time of sample. The DWARF debugging info must be provided. - srcfile: file name of the source file of the same. Requires dwarf diff --git a/tools/perf/util/cpumap.c b/tools/perf/util/cpumap.c index 3667e21..7f25e6c 100644 --- a/tools/perf/util/cpumap.c +++ b/tools/perf/util/cpumap.c @@ -225,17 +225,12 @@ void cpu_map__put(struct cpu_map *map) cpu_map__delete(map); } -int cpu_map__get_socket(struct cpu_map *map, int idx) +int cpu__get_socket(int cpu) { FILE *fp; const char *mnt; char path[PATH_MAX]; - int cpu, ret; - - if (idx > map->nr) - return -1; - - cpu = map->map[idx]; + int ret; mnt = sysfs__mountpoint(); if (!mnt) @@ -253,6 +248,18 @@ int cpu_map__get_socket(struct cpu_map *map, int idx) return ret == 1 ? cpu : -1; } +int cpu_map__get_socket(struct cpu_map *map, int idx) +{ + int cpu; + + if (idx > map->nr) + return -1; + + cpu = map->map[idx]; + + return cpu__get_socket(cpu); +} + static int cmp_ids(const void *a, const void *b) { return *(int *)a - *(int *)b; diff --git a/tools/perf/util/cpumap.h b/tools/perf/util/cpumap.h index 0af9cec..effb56e 100644 --- a/tools/perf/util/cpumap.h +++ b/tools/perf/util/cpumap.h @@ -18,6 +18,7 @@ struct cpu_map *cpu_map__new(const char *cpu_list); struct cpu_map *cpu_map__dummy_new(void); struct cpu_map *cpu_map__read(FILE *file); size_t cpu_map__fprintf(struct cpu_map *map, FILE *fp); +int cpu__get_socket(int cpu); int cpu_map__get_socket(struct cpu_map *map, int idx); int cpu_map__get_core(struct cpu_map *map, int idx); int cpu_map__build_socket_map(struct cpu_map *cpus, struct cpu_map **sockp); diff --git a/tools/perf/util/hist.h b/tools/perf/util/hist.h index bc528d5..af80fb5 100644 --- a/tools/perf/util/hist.h +++ b/tools/perf/util/hist.h @@ -29,6 +29,7 @@ enum hist_column { HISTC_COMM, HISTC_PARENT, HISTC_CPU, + HISTC_SOCKET, HISTC_SRCLINE, HISTC_SRCFILE, HISTC_MISPREDICT, diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c index 7e38716..245e254 100644 --- a/tools/perf/util/sort.c +++ b/tools/perf/util/sort.c @@ -421,6 +421,33 @@ struct sort_entry sort_cpu = { .se_width_idx = HISTC_CPU, }; +/* --sort socket */ + +static int64_t +sort__socket_cmp(struct hist_entry *left, struct hist_entry *right) +{ + int r_socket, l_socket; + + r_socket = cpu__get_socket(right->cpu); + l_socket = cpu__get_socket(left->cpu); + return r_socket - l_socket; +} + +static int hist_entry__socket_snprintf(struct hist_entry *he, char *bf, + size_t size, unsigned int width) +{ +
[PATCH RFC 02/10] perf,tools: Support new sort type --socket
From: Kan Liang kan.li...@intel.com This patch enable perf report to sort by socket $ perf report --stdio --sort socket,comm,dso,symbol # To display the perf.data header info, please use --header/--header-only options. # # # Total Lost Samples: 0 # # Samples: 686 of event 'cycles' # Event count (approx.): 349215462 # # Overhead SOCKET CommandShared Object Symbol # .. . . # 97.05% 000 test test [.] plusB_c 0.98% 000 test test [.] plusA_c 0.93% 001 perf [kernel.vmlinux] [k] smp_call_function_single 0.19% 001 perf [kernel.vmlinux] [k] page_fault 0.19% 001 swapper[kernel.vmlinux] [k] pm_qos_request 0.16% 000 test [kernel.vmlinux] [k] add_mm_counter_fast Signed-off-by: Kan Liang kan.li...@intel.com --- tools/perf/Documentation/perf-report.txt | 3 ++- tools/perf/util/cpumap.c | 21 ++--- tools/perf/util/cpumap.h | 1 + tools/perf/util/hist.h | 1 + tools/perf/util/sort.c | 28 tools/perf/util/sort.h | 1 + 6 files changed, 47 insertions(+), 8 deletions(-) diff --git a/tools/perf/Documentation/perf-report.txt b/tools/perf/Documentation/perf-report.txt index a18ba75..ca76b0d 100644 --- a/tools/perf/Documentation/perf-report.txt +++ b/tools/perf/Documentation/perf-report.txt @@ -68,7 +68,7 @@ OPTIONS --sort=:: Sort histogram entries by given key(s) - multiple keys can be specified in CSV format. Following sort keys are available: - pid, comm, dso, symbol, parent, cpu, srcline, weight, local_weight. + pid, comm, dso, symbol, parent, cpu, socket, srcline, weight, local_weight. Each key has following meaning: @@ -79,6 +79,7 @@ OPTIONS - parent: name of function matched to the parent regex filter. Unmatched entries are displayed as [other]. - cpu: cpu number the task ran at the time of sample + - socket: socket number the task ran at the time of sample - srcline: filename and line number executed at the time of sample. The DWARF debugging info must be provided. - srcfile: file name of the source file of the same. Requires dwarf diff --git a/tools/perf/util/cpumap.c b/tools/perf/util/cpumap.c index 3667e21..7f25e6c 100644 --- a/tools/perf/util/cpumap.c +++ b/tools/perf/util/cpumap.c @@ -225,17 +225,12 @@ void cpu_map__put(struct cpu_map *map) cpu_map__delete(map); } -int cpu_map__get_socket(struct cpu_map *map, int idx) +int cpu__get_socket(int cpu) { FILE *fp; const char *mnt; char path[PATH_MAX]; - int cpu, ret; - - if (idx map-nr) - return -1; - - cpu = map-map[idx]; + int ret; mnt = sysfs__mountpoint(); if (!mnt) @@ -253,6 +248,18 @@ int cpu_map__get_socket(struct cpu_map *map, int idx) return ret == 1 ? cpu : -1; } +int cpu_map__get_socket(struct cpu_map *map, int idx) +{ + int cpu; + + if (idx map-nr) + return -1; + + cpu = map-map[idx]; + + return cpu__get_socket(cpu); +} + static int cmp_ids(const void *a, const void *b) { return *(int *)a - *(int *)b; diff --git a/tools/perf/util/cpumap.h b/tools/perf/util/cpumap.h index 0af9cec..effb56e 100644 --- a/tools/perf/util/cpumap.h +++ b/tools/perf/util/cpumap.h @@ -18,6 +18,7 @@ struct cpu_map *cpu_map__new(const char *cpu_list); struct cpu_map *cpu_map__dummy_new(void); struct cpu_map *cpu_map__read(FILE *file); size_t cpu_map__fprintf(struct cpu_map *map, FILE *fp); +int cpu__get_socket(int cpu); int cpu_map__get_socket(struct cpu_map *map, int idx); int cpu_map__get_core(struct cpu_map *map, int idx); int cpu_map__build_socket_map(struct cpu_map *cpus, struct cpu_map **sockp); diff --git a/tools/perf/util/hist.h b/tools/perf/util/hist.h index bc528d5..af80fb5 100644 --- a/tools/perf/util/hist.h +++ b/tools/perf/util/hist.h @@ -29,6 +29,7 @@ enum hist_column { HISTC_COMM, HISTC_PARENT, HISTC_CPU, + HISTC_SOCKET, HISTC_SRCLINE, HISTC_SRCFILE, HISTC_MISPREDICT, diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c index 7e38716..245e254 100644 --- a/tools/perf/util/sort.c +++ b/tools/perf/util/sort.c @@ -421,6 +421,33 @@ struct sort_entry sort_cpu = { .se_width_idx = HISTC_CPU, }; +/* --sort socket */ + +static int64_t +sort__socket_cmp(struct hist_entry *left, struct hist_entry *right) +{ + int r_socket, l_socket; + + r_socket = cpu__get_socket(right-cpu); + l_socket = cpu__get_socket(left-cpu); + return r_socket - l_socket; +} + +static int hist_entry__socket_snprintf(struct hist_entry *he, char *bf, + size_t size,