RE: [PATCH RFC 02/10] perf,tools: Support new sort type --socket

2015-08-27 Thread Liang, Kan

> 
> 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

2015-08-27 Thread Jiri Olsa
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

2015-08-27 Thread Jiri Olsa
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

2015-08-27 Thread Liang, Kan

 
 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

2015-08-24 Thread Jiri Olsa
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

2015-08-24 Thread Liang, Kan


> 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

2015-08-24 Thread Jiri Olsa
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

2015-08-24 Thread Liang, Kan
> 
> 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

2015-08-24 Thread Jiri Olsa
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

2015-08-24 Thread Liang, Kan
 
 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

2015-08-24 Thread Liang, Kan


 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

2015-08-24 Thread Jiri Olsa
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

2015-08-23 Thread Jiri Olsa
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

2015-08-23 Thread Jiri Olsa
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

2015-08-21 Thread Liang, Kan


> 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

2015-08-21 Thread Liang, Kan


 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

2015-08-20 Thread Jiri Olsa
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

2015-08-20 Thread Jiri Olsa
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/