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