Re: [PATCH v3 2/2] perf tool: Fix ppid for synthesized fork events

2015-03-31 Thread Don Zickus
On Mon, Mar 30, 2015 at 02:35:58PM -0600, David Ahern wrote:
> 363b785f38 added synthesized fork events and set a thread's parent id
> to itself. Since we are already processing /proc//status the ppid
> can be determined properly. Make it so.

Acked-by: Don Zickus 

> 
> Signed-off-by: David Ahern 
> Cc: Don Zickus 
> Cc: Joe Mario 
> Cc: Jiri Olsa 
> ---
> v3
> - removed isspace and newline checks; added brackets per Arnaldo's comments
> 
> v2:
> - removed changes to function signature for perf_event__synthesize_comm as
>   noted by Jiri
> 
>  tools/perf/util/event.c | 83 
> +
>  1 file changed, 50 insertions(+), 33 deletions(-)
> 
> diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c
> index 023dd3548a94..5516236df6ab 100644
> --- a/tools/perf/util/event.c
> +++ b/tools/perf/util/event.c
> @@ -51,29 +51,32 @@ static struct perf_sample synth_sample = {
>  
>  /*
>   * Assumes that the first 4095 bytes of /proc/pid/stat contains
> - * the comm and tgid.
> + * the comm, tgid and ppid.
>   */
> -static pid_t perf_event__get_comm_tgid(pid_t pid, char *comm, size_t len)
> +static int perf_event__get_comm_ids(pid_t pid, char *comm, size_t len,
> + pid_t *tgid, pid_t *ppid)
>  {
>   char filename[PATH_MAX];
>   char bf[4096];
>   int fd;
>   size_t size = 0, n;
> - pid_t tgid = -1;
> - char *nl, *name, *tgids;
> + char *nl, *name, *tgids, *ppids;
> +
> + *tgid = -1;
> + *ppid = -1;
>  
>   snprintf(filename, sizeof(filename), "/proc/%d/status", pid);
>  
>   fd = open(filename, O_RDONLY);
>   if (fd < 0) {
>   pr_debug("couldn't open %s\n", filename);
> - return 0;
> + return -1;
>   }
>  
>   n = read(fd, bf, sizeof(bf) - 1);
>   close(fd);
>   if (n <= 0) {
> - pr_warning("Couldn't get COMM and tgid for pid %d\n",
> + pr_warning("Couldn't get COMM, tigd and ppid for pid %d\n",
>  pid);
>   return -1;
>   }
> @@ -81,6 +84,7 @@ static pid_t perf_event__get_comm_tgid(pid_t pid, char 
> *comm, size_t len)
>  
>   name = strstr(bf, "Name:");
>   tgids = strstr(bf, "Tgid:");
> + ppids = strstr(bf, "PPid:");
>  
>   if (name) {
>   name += 5;  /* strlen("Name:") */
> @@ -103,32 +107,45 @@ static pid_t perf_event__get_comm_tgid(pid_t pid, char 
> *comm, size_t len)
>  
>   if (tgids) {
>   tgids += 5;  /* strlen("Tgid:") */
> - tgid = atoi(tgids);
> + *tgid = atoi(tgids);
>   } else {
>   pr_debug("Tgid: string not found for pid %d\n", pid);
>   }
>  
> - return tgid;
> + if (ppids) {
> + ppids += 5;  /* strlen("PPid:") */
> + *ppid = atoi(ppids);
> + } else {
> + pr_debug("PPid: string not found for pid %d\n", pid);
> + }
> +
> + return 0;
>  }
>  
> -static pid_t perf_event__prepare_comm(union perf_event *event, pid_t pid,
> -  struct machine *machine)
> +static int perf_event__prepare_comm(union perf_event *event, pid_t pid,
> + struct machine *machine,
> + pid_t *tgid, pid_t *ppid)
>  {
>   size_t size;
> - pid_t tgid;
> +
> + *ppid = -1;
>  
>   memset(>comm, 0, sizeof(event->comm));
>  
> - if (machine__is_host(machine))
> - tgid = perf_event__get_comm_tgid(pid, event->comm.comm,
> -  sizeof(event->comm.comm));
> - else
> - tgid = machine->pid;
> + if (machine__is_host(machine)) {
> + if (perf_event__get_comm_ids(pid, event->comm.comm,
> +  sizeof(event->comm.comm),
> +  tgid, ppid) != 0) {
> + return -1;
> + }
> + } else {
> + *tgid = machine->pid;
> + }
>  
> - if (tgid < 0)
> - goto out;
> + if (*tgid < 0)
> + return -1;
>  
> - event->comm.pid = tgid;
> + event->comm.pid = *tgid;
>   event->comm.header.type = PERF_RECORD_COMM;
>  
>   size = strlen(event->comm.comm) + 1;
> @@ -138,8 +155,8 @@ static pid_t perf_event__prepare_comm(union perf_event 
> *event, pid_t pid,
>   (sizeof(event->comm.comm) - size) +
>   machine->id_hdr_size);
>   event->comm.tid = pid;
> -out:
> - return tgid;
> +
> + return 0;
>  }
>  
>  static pid_t perf_event__synthesize_comm(struct perf_tool *tool,
> @@ -147,27 +164,27 @@ static pid_t perf_event__synthesize_comm(struct 
> perf_tool *tool,
>perf_event__handler_t process,
>struct machine *machine)
>  {
> - pid_t tgid = perf_event__prepare_comm(event, pid, 

Re: [PATCH v3 2/2] perf tool: Fix ppid for synthesized fork events

2015-03-31 Thread Jiri Olsa
On Mon, Mar 30, 2015 at 02:35:58PM -0600, David Ahern wrote:
> 363b785f38 added synthesized fork events and set a thread's parent id
> to itself. Since we are already processing /proc//status the ppid
> can be determined properly. Make it so.
> 
> Signed-off-by: David Ahern 
> Cc: Don Zickus 
> Cc: Joe Mario 
> Cc: Jiri Olsa 

Acked-by: Jiri Olsa 

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 v3 2/2] perf tool: Fix ppid for synthesized fork events

2015-03-31 Thread Jiri Olsa
On Tue, Mar 31, 2015 at 04:10:26PM +0200, Jiri Olsa wrote:
> On Mon, Mar 30, 2015 at 02:35:58PM -0600, David Ahern wrote:
> > 363b785f38 added synthesized fork events and set a thread's parent id
> > to itself. Since we are already processing /proc//status the ppid
> > can be determined properly. Make it so.
> > 
> > Signed-off-by: David Ahern 
> > Cc: Don Zickus 
> > Cc: Joe Mario 
> > Cc: Jiri Olsa 
> > ---
> > v3
> > - removed isspace and newline checks; added brackets per Arnaldo's comments
> > 
> > v2:
> > - removed changes to function signature for perf_event__synthesize_comm as
> >   noted by Jiri
> > 
> >  tools/perf/util/event.c | 83 
> > +
> >  1 file changed, 50 insertions(+), 33 deletions(-)
> > 
> > diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c
> > index 023dd3548a94..5516236df6ab 100644
> > --- a/tools/perf/util/event.c
> > +++ b/tools/perf/util/event.c
> > @@ -51,29 +51,32 @@ static struct perf_sample synth_sample = {
> >  
> >  /*
> >   * Assumes that the first 4095 bytes of /proc/pid/stat contains
> > - * the comm and tgid.
> > + * the comm, tgid and ppid.
> >   */
> > -static pid_t perf_event__get_comm_tgid(pid_t pid, char *comm, size_t len)
> > +static int perf_event__get_comm_ids(pid_t pid, char *comm, size_t len,
> > +   pid_t *tgid, pid_t *ppid)
> >  {
> > char filename[PATH_MAX];
> > char bf[4096];
> > int fd;
> > size_t size = 0, n;
> > -   pid_t tgid = -1;
> > -   char *nl, *name, *tgids;
> > +   char *nl, *name, *tgids, *ppids;
> > +
> > +   *tgid = -1;
> > +   *ppid = -1;
> >  
> > snprintf(filename, sizeof(filename), "/proc/%d/status", pid);
> >  
> > fd = open(filename, O_RDONLY);
> > if (fd < 0) {
> > pr_debug("couldn't open %s\n", filename);
> > -   return 0;
> > +   return -1;
> 
> hum, missed this one in previous version.. why did not we fail before?

sigh, it was the tgid before, now it's err..  ;-) ook

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 v3 2/2] perf tool: Fix ppid for synthesized fork events

2015-03-31 Thread Jiri Olsa
On Mon, Mar 30, 2015 at 02:35:58PM -0600, David Ahern wrote:
> 363b785f38 added synthesized fork events and set a thread's parent id
> to itself. Since we are already processing /proc//status the ppid
> can be determined properly. Make it so.
> 
> Signed-off-by: David Ahern 
> Cc: Don Zickus 
> Cc: Joe Mario 
> Cc: Jiri Olsa 
> ---
> v3
> - removed isspace and newline checks; added brackets per Arnaldo's comments
> 
> v2:
> - removed changes to function signature for perf_event__synthesize_comm as
>   noted by Jiri
> 
>  tools/perf/util/event.c | 83 
> +
>  1 file changed, 50 insertions(+), 33 deletions(-)
> 
> diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c
> index 023dd3548a94..5516236df6ab 100644
> --- a/tools/perf/util/event.c
> +++ b/tools/perf/util/event.c
> @@ -51,29 +51,32 @@ static struct perf_sample synth_sample = {
>  
>  /*
>   * Assumes that the first 4095 bytes of /proc/pid/stat contains
> - * the comm and tgid.
> + * the comm, tgid and ppid.
>   */
> -static pid_t perf_event__get_comm_tgid(pid_t pid, char *comm, size_t len)
> +static int perf_event__get_comm_ids(pid_t pid, char *comm, size_t len,
> + pid_t *tgid, pid_t *ppid)
>  {
>   char filename[PATH_MAX];
>   char bf[4096];
>   int fd;
>   size_t size = 0, n;
> - pid_t tgid = -1;
> - char *nl, *name, *tgids;
> + char *nl, *name, *tgids, *ppids;
> +
> + *tgid = -1;
> + *ppid = -1;
>  
>   snprintf(filename, sizeof(filename), "/proc/%d/status", pid);
>  
>   fd = open(filename, O_RDONLY);
>   if (fd < 0) {
>   pr_debug("couldn't open %s\n", filename);
> - return 0;
> + return -1;

hum, missed this one in previous version.. why did not we fail before?

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 v3 2/2] perf tool: Fix ppid for synthesized fork events

2015-03-31 Thread Jiri Olsa
On Tue, Mar 31, 2015 at 04:10:26PM +0200, Jiri Olsa wrote:
 On Mon, Mar 30, 2015 at 02:35:58PM -0600, David Ahern wrote:
  363b785f38 added synthesized fork events and set a thread's parent id
  to itself. Since we are already processing /proc/pid/status the ppid
  can be determined properly. Make it so.
  
  Signed-off-by: David Ahern dsah...@gmail.com
  Cc: Don Zickus dzic...@redhat.com
  Cc: Joe Mario jma...@redhat.com
  Cc: Jiri Olsa jo...@redhat.com
  ---
  v3
  - removed isspace and newline checks; added brackets per Arnaldo's comments
  
  v2:
  - removed changes to function signature for perf_event__synthesize_comm as
noted by Jiri
  
   tools/perf/util/event.c | 83 
  +
   1 file changed, 50 insertions(+), 33 deletions(-)
  
  diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c
  index 023dd3548a94..5516236df6ab 100644
  --- a/tools/perf/util/event.c
  +++ b/tools/perf/util/event.c
  @@ -51,29 +51,32 @@ static struct perf_sample synth_sample = {
   
   /*
* Assumes that the first 4095 bytes of /proc/pid/stat contains
  - * the comm and tgid.
  + * the comm, tgid and ppid.
*/
  -static pid_t perf_event__get_comm_tgid(pid_t pid, char *comm, size_t len)
  +static int perf_event__get_comm_ids(pid_t pid, char *comm, size_t len,
  +   pid_t *tgid, pid_t *ppid)
   {
  char filename[PATH_MAX];
  char bf[4096];
  int fd;
  size_t size = 0, n;
  -   pid_t tgid = -1;
  -   char *nl, *name, *tgids;
  +   char *nl, *name, *tgids, *ppids;
  +
  +   *tgid = -1;
  +   *ppid = -1;
   
  snprintf(filename, sizeof(filename), /proc/%d/status, pid);
   
  fd = open(filename, O_RDONLY);
  if (fd  0) {
  pr_debug(couldn't open %s\n, filename);
  -   return 0;
  +   return -1;
 
 hum, missed this one in previous version.. why did not we fail before?

sigh, it was the tgid before, now it's err..  ;-) ook

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 v3 2/2] perf tool: Fix ppid for synthesized fork events

2015-03-31 Thread Jiri Olsa
On Mon, Mar 30, 2015 at 02:35:58PM -0600, David Ahern wrote:
 363b785f38 added synthesized fork events and set a thread's parent id
 to itself. Since we are already processing /proc/pid/status the ppid
 can be determined properly. Make it so.
 
 Signed-off-by: David Ahern dsah...@gmail.com
 Cc: Don Zickus dzic...@redhat.com
 Cc: Joe Mario jma...@redhat.com
 Cc: Jiri Olsa jo...@redhat.com
 ---
 v3
 - removed isspace and newline checks; added brackets per Arnaldo's comments
 
 v2:
 - removed changes to function signature for perf_event__synthesize_comm as
   noted by Jiri
 
  tools/perf/util/event.c | 83 
 +
  1 file changed, 50 insertions(+), 33 deletions(-)
 
 diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c
 index 023dd3548a94..5516236df6ab 100644
 --- a/tools/perf/util/event.c
 +++ b/tools/perf/util/event.c
 @@ -51,29 +51,32 @@ static struct perf_sample synth_sample = {
  
  /*
   * Assumes that the first 4095 bytes of /proc/pid/stat contains
 - * the comm and tgid.
 + * the comm, tgid and ppid.
   */
 -static pid_t perf_event__get_comm_tgid(pid_t pid, char *comm, size_t len)
 +static int perf_event__get_comm_ids(pid_t pid, char *comm, size_t len,
 + pid_t *tgid, pid_t *ppid)
  {
   char filename[PATH_MAX];
   char bf[4096];
   int fd;
   size_t size = 0, n;
 - pid_t tgid = -1;
 - char *nl, *name, *tgids;
 + char *nl, *name, *tgids, *ppids;
 +
 + *tgid = -1;
 + *ppid = -1;
  
   snprintf(filename, sizeof(filename), /proc/%d/status, pid);
  
   fd = open(filename, O_RDONLY);
   if (fd  0) {
   pr_debug(couldn't open %s\n, filename);
 - return 0;
 + return -1;

hum, missed this one in previous version.. why did not we fail before?

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 v3 2/2] perf tool: Fix ppid for synthesized fork events

2015-03-31 Thread Jiri Olsa
On Mon, Mar 30, 2015 at 02:35:58PM -0600, David Ahern wrote:
 363b785f38 added synthesized fork events and set a thread's parent id
 to itself. Since we are already processing /proc/pid/status the ppid
 can be determined properly. Make it so.
 
 Signed-off-by: David Ahern dsah...@gmail.com
 Cc: Don Zickus dzic...@redhat.com
 Cc: Joe Mario jma...@redhat.com
 Cc: Jiri Olsa jo...@redhat.com

Acked-by: Jiri Olsa jo...@kernel.org

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 v3 2/2] perf tool: Fix ppid for synthesized fork events

2015-03-31 Thread Don Zickus
On Mon, Mar 30, 2015 at 02:35:58PM -0600, David Ahern wrote:
 363b785f38 added synthesized fork events and set a thread's parent id
 to itself. Since we are already processing /proc/pid/status the ppid
 can be determined properly. Make it so.

Acked-by: Don Zickus dzic...@redhat.com

 
 Signed-off-by: David Ahern dsah...@gmail.com
 Cc: Don Zickus dzic...@redhat.com
 Cc: Joe Mario jma...@redhat.com
 Cc: Jiri Olsa jo...@redhat.com
 ---
 v3
 - removed isspace and newline checks; added brackets per Arnaldo's comments
 
 v2:
 - removed changes to function signature for perf_event__synthesize_comm as
   noted by Jiri
 
  tools/perf/util/event.c | 83 
 +
  1 file changed, 50 insertions(+), 33 deletions(-)
 
 diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c
 index 023dd3548a94..5516236df6ab 100644
 --- a/tools/perf/util/event.c
 +++ b/tools/perf/util/event.c
 @@ -51,29 +51,32 @@ static struct perf_sample synth_sample = {
  
  /*
   * Assumes that the first 4095 bytes of /proc/pid/stat contains
 - * the comm and tgid.
 + * the comm, tgid and ppid.
   */
 -static pid_t perf_event__get_comm_tgid(pid_t pid, char *comm, size_t len)
 +static int perf_event__get_comm_ids(pid_t pid, char *comm, size_t len,
 + pid_t *tgid, pid_t *ppid)
  {
   char filename[PATH_MAX];
   char bf[4096];
   int fd;
   size_t size = 0, n;
 - pid_t tgid = -1;
 - char *nl, *name, *tgids;
 + char *nl, *name, *tgids, *ppids;
 +
 + *tgid = -1;
 + *ppid = -1;
  
   snprintf(filename, sizeof(filename), /proc/%d/status, pid);
  
   fd = open(filename, O_RDONLY);
   if (fd  0) {
   pr_debug(couldn't open %s\n, filename);
 - return 0;
 + return -1;
   }
  
   n = read(fd, bf, sizeof(bf) - 1);
   close(fd);
   if (n = 0) {
 - pr_warning(Couldn't get COMM and tgid for pid %d\n,
 + pr_warning(Couldn't get COMM, tigd and ppid for pid %d\n,
  pid);
   return -1;
   }
 @@ -81,6 +84,7 @@ static pid_t perf_event__get_comm_tgid(pid_t pid, char 
 *comm, size_t len)
  
   name = strstr(bf, Name:);
   tgids = strstr(bf, Tgid:);
 + ppids = strstr(bf, PPid:);
  
   if (name) {
   name += 5;  /* strlen(Name:) */
 @@ -103,32 +107,45 @@ static pid_t perf_event__get_comm_tgid(pid_t pid, char 
 *comm, size_t len)
  
   if (tgids) {
   tgids += 5;  /* strlen(Tgid:) */
 - tgid = atoi(tgids);
 + *tgid = atoi(tgids);
   } else {
   pr_debug(Tgid: string not found for pid %d\n, pid);
   }
  
 - return tgid;
 + if (ppids) {
 + ppids += 5;  /* strlen(PPid:) */
 + *ppid = atoi(ppids);
 + } else {
 + pr_debug(PPid: string not found for pid %d\n, pid);
 + }
 +
 + return 0;
  }
  
 -static pid_t perf_event__prepare_comm(union perf_event *event, pid_t pid,
 -  struct machine *machine)
 +static int perf_event__prepare_comm(union perf_event *event, pid_t pid,
 + struct machine *machine,
 + pid_t *tgid, pid_t *ppid)
  {
   size_t size;
 - pid_t tgid;
 +
 + *ppid = -1;
  
   memset(event-comm, 0, sizeof(event-comm));
  
 - if (machine__is_host(machine))
 - tgid = perf_event__get_comm_tgid(pid, event-comm.comm,
 -  sizeof(event-comm.comm));
 - else
 - tgid = machine-pid;
 + if (machine__is_host(machine)) {
 + if (perf_event__get_comm_ids(pid, event-comm.comm,
 +  sizeof(event-comm.comm),
 +  tgid, ppid) != 0) {
 + return -1;
 + }
 + } else {
 + *tgid = machine-pid;
 + }
  
 - if (tgid  0)
 - goto out;
 + if (*tgid  0)
 + return -1;
  
 - event-comm.pid = tgid;
 + event-comm.pid = *tgid;
   event-comm.header.type = PERF_RECORD_COMM;
  
   size = strlen(event-comm.comm) + 1;
 @@ -138,8 +155,8 @@ static pid_t perf_event__prepare_comm(union perf_event 
 *event, pid_t pid,
   (sizeof(event-comm.comm) - size) +
   machine-id_hdr_size);
   event-comm.tid = pid;
 -out:
 - return tgid;
 +
 + return 0;
  }
  
  static pid_t perf_event__synthesize_comm(struct perf_tool *tool,
 @@ -147,27 +164,27 @@ static pid_t perf_event__synthesize_comm(struct 
 perf_tool *tool,
perf_event__handler_t process,
struct machine *machine)
  {
 - pid_t tgid = perf_event__prepare_comm(event, pid, machine);
 + pid_t tgid, ppid;
  
 - if (tgid == -1)
 - goto out;
 + if 

[PATCH v3 2/2] perf tool: Fix ppid for synthesized fork events

2015-03-30 Thread David Ahern
363b785f38 added synthesized fork events and set a thread's parent id
to itself. Since we are already processing /proc//status the ppid
can be determined properly. Make it so.

Signed-off-by: David Ahern 
Cc: Don Zickus 
Cc: Joe Mario 
Cc: Jiri Olsa 
---
v3
- removed isspace and newline checks; added brackets per Arnaldo's comments

v2:
- removed changes to function signature for perf_event__synthesize_comm as
  noted by Jiri

 tools/perf/util/event.c | 83 +
 1 file changed, 50 insertions(+), 33 deletions(-)

diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c
index 023dd3548a94..5516236df6ab 100644
--- a/tools/perf/util/event.c
+++ b/tools/perf/util/event.c
@@ -51,29 +51,32 @@ static struct perf_sample synth_sample = {
 
 /*
  * Assumes that the first 4095 bytes of /proc/pid/stat contains
- * the comm and tgid.
+ * the comm, tgid and ppid.
  */
-static pid_t perf_event__get_comm_tgid(pid_t pid, char *comm, size_t len)
+static int perf_event__get_comm_ids(pid_t pid, char *comm, size_t len,
+   pid_t *tgid, pid_t *ppid)
 {
char filename[PATH_MAX];
char bf[4096];
int fd;
size_t size = 0, n;
-   pid_t tgid = -1;
-   char *nl, *name, *tgids;
+   char *nl, *name, *tgids, *ppids;
+
+   *tgid = -1;
+   *ppid = -1;
 
snprintf(filename, sizeof(filename), "/proc/%d/status", pid);
 
fd = open(filename, O_RDONLY);
if (fd < 0) {
pr_debug("couldn't open %s\n", filename);
-   return 0;
+   return -1;
}
 
n = read(fd, bf, sizeof(bf) - 1);
close(fd);
if (n <= 0) {
-   pr_warning("Couldn't get COMM and tgid for pid %d\n",
+   pr_warning("Couldn't get COMM, tigd and ppid for pid %d\n",
   pid);
return -1;
}
@@ -81,6 +84,7 @@ static pid_t perf_event__get_comm_tgid(pid_t pid, char *comm, 
size_t len)
 
name = strstr(bf, "Name:");
tgids = strstr(bf, "Tgid:");
+   ppids = strstr(bf, "PPid:");
 
if (name) {
name += 5;  /* strlen("Name:") */
@@ -103,32 +107,45 @@ static pid_t perf_event__get_comm_tgid(pid_t pid, char 
*comm, size_t len)
 
if (tgids) {
tgids += 5;  /* strlen("Tgid:") */
-   tgid = atoi(tgids);
+   *tgid = atoi(tgids);
} else {
pr_debug("Tgid: string not found for pid %d\n", pid);
}
 
-   return tgid;
+   if (ppids) {
+   ppids += 5;  /* strlen("PPid:") */
+   *ppid = atoi(ppids);
+   } else {
+   pr_debug("PPid: string not found for pid %d\n", pid);
+   }
+
+   return 0;
 }
 
-static pid_t perf_event__prepare_comm(union perf_event *event, pid_t pid,
-struct machine *machine)
+static int perf_event__prepare_comm(union perf_event *event, pid_t pid,
+   struct machine *machine,
+   pid_t *tgid, pid_t *ppid)
 {
size_t size;
-   pid_t tgid;
+
+   *ppid = -1;
 
memset(>comm, 0, sizeof(event->comm));
 
-   if (machine__is_host(machine))
-   tgid = perf_event__get_comm_tgid(pid, event->comm.comm,
-sizeof(event->comm.comm));
-   else
-   tgid = machine->pid;
+   if (machine__is_host(machine)) {
+   if (perf_event__get_comm_ids(pid, event->comm.comm,
+sizeof(event->comm.comm),
+tgid, ppid) != 0) {
+   return -1;
+   }
+   } else {
+   *tgid = machine->pid;
+   }
 
-   if (tgid < 0)
-   goto out;
+   if (*tgid < 0)
+   return -1;
 
-   event->comm.pid = tgid;
+   event->comm.pid = *tgid;
event->comm.header.type = PERF_RECORD_COMM;
 
size = strlen(event->comm.comm) + 1;
@@ -138,8 +155,8 @@ static pid_t perf_event__prepare_comm(union perf_event 
*event, pid_t pid,
(sizeof(event->comm.comm) - size) +
machine->id_hdr_size);
event->comm.tid = pid;
-out:
-   return tgid;
+
+   return 0;
 }
 
 static pid_t perf_event__synthesize_comm(struct perf_tool *tool,
@@ -147,27 +164,27 @@ static pid_t perf_event__synthesize_comm(struct perf_tool 
*tool,
 perf_event__handler_t process,
 struct machine *machine)
 {
-   pid_t tgid = perf_event__prepare_comm(event, pid, machine);
+   pid_t tgid, ppid;
 
-   if (tgid == -1)
-   goto out;
+   if (perf_event__prepare_comm(event, pid, machine, , ) != 0)
+   return -1;
 
if (process(tool, event, 

[PATCH v3 2/2] perf tool: Fix ppid for synthesized fork events

2015-03-30 Thread David Ahern
363b785f38 added synthesized fork events and set a thread's parent id
to itself. Since we are already processing /proc/pid/status the ppid
can be determined properly. Make it so.

Signed-off-by: David Ahern dsah...@gmail.com
Cc: Don Zickus dzic...@redhat.com
Cc: Joe Mario jma...@redhat.com
Cc: Jiri Olsa jo...@redhat.com
---
v3
- removed isspace and newline checks; added brackets per Arnaldo's comments

v2:
- removed changes to function signature for perf_event__synthesize_comm as
  noted by Jiri

 tools/perf/util/event.c | 83 +
 1 file changed, 50 insertions(+), 33 deletions(-)

diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c
index 023dd3548a94..5516236df6ab 100644
--- a/tools/perf/util/event.c
+++ b/tools/perf/util/event.c
@@ -51,29 +51,32 @@ static struct perf_sample synth_sample = {
 
 /*
  * Assumes that the first 4095 bytes of /proc/pid/stat contains
- * the comm and tgid.
+ * the comm, tgid and ppid.
  */
-static pid_t perf_event__get_comm_tgid(pid_t pid, char *comm, size_t len)
+static int perf_event__get_comm_ids(pid_t pid, char *comm, size_t len,
+   pid_t *tgid, pid_t *ppid)
 {
char filename[PATH_MAX];
char bf[4096];
int fd;
size_t size = 0, n;
-   pid_t tgid = -1;
-   char *nl, *name, *tgids;
+   char *nl, *name, *tgids, *ppids;
+
+   *tgid = -1;
+   *ppid = -1;
 
snprintf(filename, sizeof(filename), /proc/%d/status, pid);
 
fd = open(filename, O_RDONLY);
if (fd  0) {
pr_debug(couldn't open %s\n, filename);
-   return 0;
+   return -1;
}
 
n = read(fd, bf, sizeof(bf) - 1);
close(fd);
if (n = 0) {
-   pr_warning(Couldn't get COMM and tgid for pid %d\n,
+   pr_warning(Couldn't get COMM, tigd and ppid for pid %d\n,
   pid);
return -1;
}
@@ -81,6 +84,7 @@ static pid_t perf_event__get_comm_tgid(pid_t pid, char *comm, 
size_t len)
 
name = strstr(bf, Name:);
tgids = strstr(bf, Tgid:);
+   ppids = strstr(bf, PPid:);
 
if (name) {
name += 5;  /* strlen(Name:) */
@@ -103,32 +107,45 @@ static pid_t perf_event__get_comm_tgid(pid_t pid, char 
*comm, size_t len)
 
if (tgids) {
tgids += 5;  /* strlen(Tgid:) */
-   tgid = atoi(tgids);
+   *tgid = atoi(tgids);
} else {
pr_debug(Tgid: string not found for pid %d\n, pid);
}
 
-   return tgid;
+   if (ppids) {
+   ppids += 5;  /* strlen(PPid:) */
+   *ppid = atoi(ppids);
+   } else {
+   pr_debug(PPid: string not found for pid %d\n, pid);
+   }
+
+   return 0;
 }
 
-static pid_t perf_event__prepare_comm(union perf_event *event, pid_t pid,
-struct machine *machine)
+static int perf_event__prepare_comm(union perf_event *event, pid_t pid,
+   struct machine *machine,
+   pid_t *tgid, pid_t *ppid)
 {
size_t size;
-   pid_t tgid;
+
+   *ppid = -1;
 
memset(event-comm, 0, sizeof(event-comm));
 
-   if (machine__is_host(machine))
-   tgid = perf_event__get_comm_tgid(pid, event-comm.comm,
-sizeof(event-comm.comm));
-   else
-   tgid = machine-pid;
+   if (machine__is_host(machine)) {
+   if (perf_event__get_comm_ids(pid, event-comm.comm,
+sizeof(event-comm.comm),
+tgid, ppid) != 0) {
+   return -1;
+   }
+   } else {
+   *tgid = machine-pid;
+   }
 
-   if (tgid  0)
-   goto out;
+   if (*tgid  0)
+   return -1;
 
-   event-comm.pid = tgid;
+   event-comm.pid = *tgid;
event-comm.header.type = PERF_RECORD_COMM;
 
size = strlen(event-comm.comm) + 1;
@@ -138,8 +155,8 @@ static pid_t perf_event__prepare_comm(union perf_event 
*event, pid_t pid,
(sizeof(event-comm.comm) - size) +
machine-id_hdr_size);
event-comm.tid = pid;
-out:
-   return tgid;
+
+   return 0;
 }
 
 static pid_t perf_event__synthesize_comm(struct perf_tool *tool,
@@ -147,27 +164,27 @@ static pid_t perf_event__synthesize_comm(struct perf_tool 
*tool,
 perf_event__handler_t process,
 struct machine *machine)
 {
-   pid_t tgid = perf_event__prepare_comm(event, pid, machine);
+   pid_t tgid, ppid;
 
-   if (tgid == -1)
-   goto out;
+   if (perf_event__prepare_comm(event, pid, machine, tgid, ppid) != 0)
+   return -1;