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 v3 2/2] perf tool: Fix ppid for synthesized fork events
Date: Mon, 30 Mar 2015 14:35:58 -0600 [thread overview]
Message-ID: <1427747758-18510-2-git-send-email-dsahern@gmail.com> (raw)
In-Reply-To: <1427747758-18510-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>
---
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;
if (process(tool, event, &synth_sample, machine) != 0)
return -1;
-out:
return tgid;
}
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;
@@ -359,7 +376,7 @@ 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) {
@@ -394,12 +411,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-30 20:36 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-03-30 20:35 [PATCH v2 1/2] perf tool: Refactor comm/tgid lookup David Ahern
2015-03-30 20:35 ` David Ahern [this message]
2015-03-31 14:10 ` [PATCH v3 2/2] perf tool: Fix ppid for synthesized fork events Jiri Olsa
2015-03-31 14:17 ` Jiri Olsa
2015-03-31 14:35 ` Jiri Olsa
2015-03-31 16:23 ` Don Zickus
2015-04-02 12:23 ` [tip:perf/core] perf tools: " tip-bot for David Ahern
2015-03-31 14:35 ` [PATCH v2 1/2] perf tool: Refactor comm/tgid lookup Jiri Olsa
2015-03-31 15:55 ` Arnaldo Carvalho de Melo
2015-03-31 16:22 ` Don Zickus
2015-04-02 12:23 ` [tip:perf/core] perf tools: " tip-bot for 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=1427747758-18510-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.