All of lore.kernel.org
 help / color / mirror / Atom feed
From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Jiri Olsa <jolsa@kernel.org>
Cc: lkml <linux-kernel@vger.kernel.org>,
	Adrian Hunter <adrian.hunter@intel.com>,
	Andi Kleen <ak@linux.intel.com>, David Ahern <dsahern@gmail.com>,
	Ingo Molnar <mingo@kernel.org>,
	Namhyung Kim <namhyung@kernel.org>,
	Peter Zijlstra <a.p.zijlstra@chello.nl>,
	Stephane Eranian <eranian@google.com>
Subject: Re: [PATCH 04/30] perf tools: Add comm string into struct thread_map
Date: Mon, 15 Jun 2015 16:17:07 -0300	[thread overview]
Message-ID: <20150615191707.GD5845@kernel.org> (raw)
In-Reply-To: <1434269985-521-5-git-send-email-jolsa@kernel.org>

Em Sun, Jun 14, 2015 at 10:19:19AM +0200, Jiri Olsa escreveu:
> Adding support to hold comm name together with pids in
> 'struct thread_map'. It will be useful for --per-task
> option to display task pid together with task name.
> 
> Getting the task name from /proc/$pid/comm.

Humm, so you want to extend the thread_map, that was just for pids, to
have some more info about the thread, if that is the case, why not
synthesize the whole thread, and have a pointer to 'struct thread', that
is the representation for a thread in perf instead of creating a new,
partial thing like 'thread_map_data'?

You wouldn't have to use the existing synthesizing code if that seems to
overkill, i.e. instead of having 'pid_t' as the array element in a
thread_map, you would have 'struct thread', i.e. the whole shebang, but
would just set what you need now, i.e. thread->pid and thread->comm, but
later could do the rest instead of recreating it in that thread_map_data
:-)

I.e. besides --per-task, don't you want --per-pid, --per-thread, or
other stuff that will use other thread characteristics?

That or rename that 'thread_map_data' to something like mini_thread,
...}.

Got carried away, but that was the reaction to that vague name
'thread_map_data' 8-)


Anyway, applied the first two, looking at the rest...


- Arnaldo
 
> Link: http://lkml.kernel.org/n/tip-pf6bgmbujukce0sgliuhj2f4@git.kernel.org
> Signed-off-by: Jiri Olsa <jolsa@kernel.org>
> ---
>  tools/perf/util/python-ext-sources |  1 +
>  tools/perf/util/thread_map.c       | 63 +++++++++++++++++++++++++++++++++++---
>  tools/perf/util/thread_map.h       |  2 ++
>  3 files changed, 62 insertions(+), 4 deletions(-)
> 
> diff --git a/tools/perf/util/python-ext-sources b/tools/perf/util/python-ext-sources
> index 4d28624a1eca..55ba8968a263 100644
> --- a/tools/perf/util/python-ext-sources
> +++ b/tools/perf/util/python-ext-sources
> @@ -19,3 +19,4 @@ util/rblist.c
>  util/strlist.c
>  util/trace-event.c
>  ../../lib/rbtree.c
> +util/string.c
> diff --git a/tools/perf/util/thread_map.c b/tools/perf/util/thread_map.c
> index 7f03f9facfdd..f7a49a693d27 100644
> --- a/tools/perf/util/thread_map.c
> +++ b/tools/perf/util/thread_map.c
> @@ -8,8 +8,10 @@
>  #include <unistd.h>
>  #include "strlist.h"
>  #include <string.h>
> +#include <api/fs/fs.h>
>  #include "thread_map.h"
>  #include "util.h"
> +#include "debug.h"
>  
>  /* Skip "." and ".." directories */
>  static int filter(const struct dirent *dir)
> @@ -29,6 +31,44 @@ static struct thread_map *thread_map__realloc(struct thread_map *map, int nr)
>  
>  #define thread_map__alloc(__nr) thread_map__realloc(NULL, __nr)
>  
> +static int get_comm(char **comm, pid_t pid)
> +{
> +	char *path;
> +	size_t size;
> +	int err;
> +
> +	if (asprintf(&path, "%s/%d/comm", procfs__mountpoint(), pid) == -1)
> +		return -ENOMEM;
> +
> +	err = filename__read_str(path, comm, &size);
> +	if (!err)
> +		rtrim(*comm);
> +
> +	free(path);
> +	return err;
> +}
> +
> +static void comm_init(struct thread_map *map, int i)
> +{
> +	struct thread_map_data *data = &map->map[i];
> +
> +	/*
> +	 * The comm name is like extra bonus ;-),
> +	 * so just warn if we fail for any reason.
> +	 */
> +	data->comm = NULL;
> +
> +	/* dummy pid comm initialization */
> +	if (data->pid == -1) {
> +		data->comm = strdup("dummy");
> +		return;
> +	}
> +
> +	/* try to get pid's comm string */
> +	if (get_comm(&data->comm, data->pid))
> +		pr_warning("Couldn't resolve comm name for pid %d\n", data->pid);
> +}
> +
>  struct thread_map *thread_map__new_by_pid(pid_t pid)
>  {
>  	struct thread_map *threads;
> @@ -44,8 +84,10 @@ struct thread_map *thread_map__new_by_pid(pid_t pid)
>  
>  	threads = thread_map__alloc(items);
>  	if (threads != NULL) {
> -		for (i = 0; i < items; i++)
> +		for (i = 0; i < items; i++) {
>  			thread_map__pid(threads, i) = atoi(namelist[i]->d_name);
> +			comm_init(threads, i);
> +		}
>  		threads->nr = items;
>  	}
>  
> @@ -63,6 +105,7 @@ struct thread_map *thread_map__new_by_tid(pid_t tid)
>  	if (threads != NULL) {
>  		thread_map__pid(threads, 0) = tid;
>  		threads->nr		    = 1;
> +		comm_init(threads, 0);
>  	}
>  
>  	return threads;
> @@ -123,8 +166,10 @@ struct thread_map *thread_map__new_by_uid(uid_t uid)
>  			threads = tmp;
>  		}
>  
> -		for (i = 0; i < items; i++)
> +		for (i = 0; i < items; i++) {
>  			thread_map__pid(threads, threads->nr + i) = atoi(namelist[i]->d_name);
> +			comm_init(threads, threads->nr + i);
> +		}
>  
>  		for (i = 0; i < items; i++)
>  			zfree(&namelist[i]);
> @@ -200,8 +245,9 @@ static struct thread_map *thread_map__new_by_pid_str(const char *pid_str)
>  
>  		threads = nt;
>  
> -		for (i = 0; i < items; i++) {
> -			thread_map__pid(threads, j++) = atoi(namelist[i]->d_name);
> +		for (i = 0; i < items; i++, j++) {
> +			thread_map__pid(threads, j) = atoi(namelist[i]->d_name);
> +			comm_init(threads, j);
>  			zfree(&namelist[i]);
>  		}
>  		threads->nr = total_tasks;
> @@ -229,6 +275,7 @@ struct thread_map *thread_map__new_dummy(void)
>  	if (threads != NULL) {
>  		thread_map__pid(threads, 0) = -1;
>  		threads->nr		    = 1;
> +		comm_init(threads, 0);
>  	}
>  	return threads;
>  }
> @@ -269,6 +316,7 @@ static struct thread_map *thread_map__new_by_tid_str(const char *tid_str)
>  		threads = nt;
>  		thread_map__pid(threads, ntasks - 1) = tid;
>  		threads->nr			     = ntasks;
> +		comm_init(threads, ntasks - 1);
>  	}
>  out:
>  	return threads;
> @@ -292,6 +340,13 @@ struct thread_map *thread_map__new_str(const char *pid, const char *tid,
>  
>  void thread_map__delete(struct thread_map *threads)
>  {
> +	int i;
> +
> +	if (threads) {
> +		for (i = 0; i < threads->nr; i++)
> +			free(thread_map__comm(threads, i));
> +	}
> +
>  	free(threads);
>  }
>  
> diff --git a/tools/perf/util/thread_map.h b/tools/perf/util/thread_map.h
> index 9377850c7b71..6933f9d316d9 100644
> --- a/tools/perf/util/thread_map.h
> +++ b/tools/perf/util/thread_map.h
> @@ -6,6 +6,7 @@
>  
>  struct thread_map_data {
>  	pid_t    pid;
> +	char	*comm;
>  };
>  
>  struct thread_map {
> @@ -14,6 +15,7 @@ struct thread_map {
>  };
>  
>  #define thread_map__pid(__m, __t)  __m->map[__t].pid
> +#define thread_map__comm(__m, __t) __m->map[__t].comm
>  
>  struct thread_map *thread_map__new_dummy(void);
>  struct thread_map *thread_map__new_by_pid(pid_t pid);
> -- 
> 1.9.3

  reply	other threads:[~2015-06-15 19:17 UTC|newest]

Thread overview: 45+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-06-14  8:19 [PATCHv2 00/30] perf stat: Introduce --per-task option Jiri Olsa
2015-06-14  8:19 ` [PATCH 01/30] perf tools: Introduce xyarray__reset function Jiri Olsa
2015-06-18  8:13   ` [tip:perf/core] " tip-bot for Jiri Olsa
2015-06-14  8:19 ` [PATCH 02/30] perf tools: Add thread_map__(alloc|realloc) helpers Jiri Olsa
2015-06-18  8:14   ` [tip:perf/core] " tip-bot for Jiri Olsa
2015-06-14  8:19 ` [PATCH 03/30] perf tools: Change thread_map::map into struct Jiri Olsa
2015-06-15 19:04   ` Arnaldo Carvalho de Melo
2015-06-15 21:33     ` Jiri Olsa
2015-06-14  8:19 ` [PATCH 04/30] perf tools: Add comm string into struct thread_map Jiri Olsa
2015-06-15 19:17   ` Arnaldo Carvalho de Melo [this message]
2015-06-15 21:55     ` Jiri Olsa
2015-06-14  8:19 ` [PATCH 05/30] perf tests: Add thread_map object tests Jiri Olsa
2015-06-14  8:19 ` [PATCH 06/30] perf tools: Add reference counting for cpu_map object Jiri Olsa
2015-06-14  8:19 ` [PATCH 07/30] perf tools: Add reference counting for thread_map object Jiri Olsa
2015-06-15 19:25   ` Arnaldo Carvalho de Melo
2015-06-15 21:28     ` Jiri Olsa
2015-06-14  8:19 ` [PATCH 08/30] perf tools: Propagate cpu maps through the evlist Jiri Olsa
2015-06-15 19:34   ` Arnaldo Carvalho de Melo
2015-06-15 21:29     ` Jiri Olsa
2015-06-14  8:19 ` [PATCH 09/30] perf tools: Propagate thread " Jiri Olsa
2015-06-14  8:19 ` [PATCH 10/30] perf tools: Make perf_evsel__(nr_)cpus generic Jiri Olsa
2015-06-14  8:19 ` [PATCH 11/30] perf tools: Move perf_evsel__(alloc|free|reset)_counts into stat object Jiri Olsa
2015-06-15 20:13   ` Arnaldo Carvalho de Melo
2015-06-18  8:14   ` [tip:perf/core] perf tools: Move perf_evsel__(alloc|free|reset) _counts " tip-bot for Jiri Olsa
2015-06-14  8:19 ` [PATCH 12/30] perf stat: Introduce perf_counts__(alloc|free|reset) functions Jiri Olsa
2015-06-15 20:16   ` Arnaldo Carvalho de Melo
2015-06-18  8:14   ` [tip:perf/core] perf stat: Introduce perf_counts__( new|delete|reset) functions tip-bot for Jiri Olsa
2015-06-14  8:19 ` [PATCH 13/30] perf stat: Introduce perf_counts function Jiri Olsa
2015-06-14  8:19 ` [PATCH 14/30] perf stat: Use xyarray for cpu evsel counts Jiri Olsa
2015-06-14  8:19 ` [PATCH 15/30] perf stat: Make stats work over the thread dimension Jiri Olsa
2015-06-14  8:19 ` [PATCH 16/30] perf stat: Rename struct perf_counts::cpu member to values Jiri Olsa
2015-06-14  8:19 ` [PATCH 17/30] perf stat: Move perf_evsel__(alloc|free|reset)_stat_priv into stat object Jiri Olsa
2015-06-14  8:19 ` [PATCH 18/30] perf stat: Move perf_evsel__(alloc|free)_prev_raw_counts " Jiri Olsa
2015-06-14  8:19 ` [PATCH 19/30] perf stat: Move perf_evlist__(alloc|free)_stats into evlist object Jiri Olsa
2015-06-14  8:19 ` [PATCH 20/30] perf stat: Introduce perf_evsel__alloc_stats function Jiri Olsa
2015-06-14  8:19 ` [PATCH 21/30] perf stat: Introduce perf_evsel__read function Jiri Olsa
2015-06-14  8:19 ` [PATCH 22/30] perf stat: Introduce read_counters function Jiri Olsa
2015-06-14  8:19 ` [PATCH 23/30] perf stat: Separate counters reading and processing Jiri Olsa
2015-06-14  8:19 ` [PATCH 24/30] perf stat: Move zero_per_pkg into counter process code Jiri Olsa
2015-06-14  8:19 ` [PATCH 25/30] perf stat: Move perf_stat initialization " Jiri Olsa
2015-06-14  8:19 ` [PATCH 26/30] perf stat: Remove perf_evsel__read_cb function Jiri Olsa
2015-06-14  8:19 ` [PATCH 27/30] perf stat: Rename print_interval to process_interval Jiri Olsa
2015-06-14  8:19 ` [PATCH 28/30] perf stat: Using init_stats instead of memset Jiri Olsa
2015-06-14  8:19 ` [PATCH 29/30] perf stat: Introduce print_counters function Jiri Olsa
2015-06-14  8:19 ` [PATCH 30/30] perf stat: Introduce --per-task option Jiri Olsa

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20150615191707.GD5845@kernel.org \
    --to=acme@kernel.org \
    --cc=a.p.zijlstra@chello.nl \
    --cc=adrian.hunter@intel.com \
    --cc=ak@linux.intel.com \
    --cc=dsahern@gmail.com \
    --cc=eranian@google.com \
    --cc=jolsa@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=namhyung@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.