From: David Ahern <dsahern@gmail.com>
To: acme@kernel.org
Cc: linux-kernel@vger.kernel.org, David Ahern <dsahern@gmail.com>,
Don Zickus <dzickus@redhat.com>, Joe Mario <jmario@redhat.com>,
Jiri Olsa <jolsa@redhat.com>
Subject: [PATCH 2/2] perf tool: Fix ppid for synthesized fork events
Date: Sun, 29 Mar 2015 16:30:02 -0600 [thread overview]
Message-ID: <1427668202-15422-2-git-send-email-dsahern@gmail.com> (raw)
In-Reply-To: <1427668202-15422-1-git-send-email-dsahern@gmail.com>
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 <dsahern@gmail.com>
Cc: Don Zickus <dzickus@redhat.com>
Cc: Joe Mario <jmario@redhat.com>
Cc: Jiri Olsa <jolsa@redhat.com>
---
tools/perf/util/event.c | 106 ++++++++++++++++++++++++++++--------------------
1 file changed, 63 insertions(+), 43 deletions(-)
diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c
index b49bee8a283d..648744a21410 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:") */
@@ -109,32 +113,51 @@ static pid_t perf_event__get_comm_tgid(pid_t pid, char *comm, size_t len)
if (nl)
*nl = '\0';
- 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:") */
+
+ while (*ppids && isspace(*ppids))
+ ++ppids;
+
+ nl = strchr(ppids, '\n');
+ if (nl)
+ *nl = '\0';
+
+ *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;
@@ -144,36 +167,35 @@ 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,
- union perf_event *event, pid_t pid,
- perf_event__handler_t process,
- struct machine *machine)
+static int perf_event__synthesize_comm(struct perf_tool *tool,
+ union perf_event *event, pid_t pid,
+ perf_event__handler_t process,
+ struct machine *machine,
+ pid_t *tgid, pid_t *ppid)
{
- pid_t tgid = perf_event__prepare_comm(event, pid, machine);
-
- if (tgid == -1)
- goto out;
+ if (perf_event__prepare_comm(event, pid, machine, tgid, ppid) != 0)
+ return -1;
if (process(tool, event, &synth_sample, machine) != 0)
return -1;
-out:
- return tgid;
+ return 0;
}
static int perf_event__synthesize_fork(struct perf_tool *tool,
- union perf_event *event, pid_t pid,
- pid_t tgid, perf_event__handler_t process,
+ union perf_event *event,
+ pid_t pid, pid_t tgid, pid_t ppid,
+ perf_event__handler_t process,
struct machine *machine)
{
memset(&event->fork, 0, sizeof(event->fork) + machine->id_hdr_size);
- event->fork.ppid = tgid;
- event->fork.ptid = tgid;
+ event->fork.ppid = ppid;
+ event->fork.ptid = ppid;
event->fork.pid = tgid;
event->fork.tid = pid;
event->fork.header.type = PERF_RECORD_FORK;
@@ -365,14 +387,12 @@ static int __event__synthesize_thread(union perf_event *comm_event,
char filename[PATH_MAX];
DIR *tasks;
struct dirent dirent, *next;
- pid_t tgid;
+ pid_t tgid, ppid;
/* special case: only send one comm event using passed in pid */
if (!full) {
- tgid = perf_event__synthesize_comm(tool, comm_event, pid,
- process, machine);
-
- if (tgid == -1)
+ if (perf_event__synthesize_comm(tool, comm_event, pid,
+ process, machine, &tgid, &ppid) != 0)
return -1;
return perf_event__synthesize_mmap_events(tool, mmap_event, pid, tgid,
@@ -400,12 +420,12 @@ static int __event__synthesize_thread(union perf_event *comm_event,
if (*end)
continue;
- tgid = perf_event__prepare_comm(comm_event, _pid, machine);
- if (tgid == -1)
+ if (perf_event__prepare_comm(comm_event, _pid, machine,
+ &tgid, &ppid) != 0)
return -1;
if (perf_event__synthesize_fork(tool, fork_event, _pid, tgid,
- process, machine) < 0)
+ ppid, process, machine) < 0)
return -1;
/*
* Send the prepared comm event
--
2.2.1
next prev parent reply other threads:[~2015-03-29 22:30 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-03-29 22:30 [PATCH 1/2] perf tool: Refactor comm/tgid lookup David Ahern
2015-03-29 22:30 ` David Ahern [this message]
2015-03-30 8:04 ` [PATCH 2/2] perf tool: Fix ppid for synthesized fork events Jiri Olsa
2015-03-30 15:23 ` David Ahern
2015-03-30 15:29 ` Arnaldo Carvalho de Melo
2015-03-30 18:20 ` [PATCH v2 " David Ahern
2015-03-30 19:40 ` Arnaldo Carvalho de Melo
2015-03-30 19:53 ` David Ahern
2015-03-30 20:00 ` Arnaldo Carvalho de Melo
2015-03-30 8:01 ` [PATCH 1/2] perf tool: Refactor comm/tgid lookup Jiri Olsa
2015-03-30 15:34 ` David Ahern
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=1427668202-15422-2-git-send-email-dsahern@gmail.com \
--to=dsahern@gmail.com \
--cc=acme@kernel.org \
--cc=dzickus@redhat.com \
--cc=jmario@redhat.com \
--cc=jolsa@redhat.com \
--cc=linux-kernel@vger.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.