From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Ingo Molnar <mingo@kernel.org>
Cc: linux-kernel@vger.kernel.org,
Arnaldo Carvalho de Melo <acme@redhat.com>,
Adrian Hunter <adrian.hunter@intel.com>,
Borislav Petkov <bp@suse.de>, David Ahern <dsahern@gmail.com>,
Don Zickus <dzickus@redhat.com>,
Frederic Weisbecker <fweisbec@gmail.com>,
Jiri Olsa <jolsa@redhat.com>, Namhyung Kim <namhyung@kernel.org>,
Stephane Eranian <eranian@google.com>
Subject: [PATCH 04/20] perf tools: Fix FORK after COMM when synthesizing records for pre-existing threads
Date: Tue, 3 Mar 2015 00:25:53 -0300 [thread overview]
Message-ID: <1425353169-21436-5-git-send-email-acme@kernel.org> (raw)
In-Reply-To: <1425353169-21436-1-git-send-email-acme@kernel.org>
From: Arnaldo Carvalho de Melo <acme@redhat.com>
In this commit:
commit 363b785f3805a2632eb09a8b430842461c21a640
Author: Don Zickus <dzickus@redhat.com>
Date: Fri Mar 14 10:43:44 2014 -0400
perf tools: Speed up thread map generation
We ended up emitting PERF_RECORD_FORK events after their corresponding
PERF_RECORD_COMM, so the code below will remove the "existing thread"
and then recreates it, unnecessarily:
[root@ssdandy ~]# perf probe -x ~/bin/perf -L machine__process_fork_event
<machine__process_fork_event@/home/acme/git/linux/tools/perf/util/machine.c:0>
0 int machine__process_fork_event(struct machine *machine, union perf_event *event,
struct perf_sample *sample)
2 {
3 struct thread *thread = machine__find_thread(machine,
event->fork.pid,
event->fork.tid);
6 struct thread *parent = machine__findnew_thread(machine,
event->fork.ppid,
event->fork.ptid);
/* if a thread currently exists for the thread id remove it */
if (thread != NULL)
12 machine__remove_thread(machine, thread);
14 thread = machine__findnew_thread(machine, event->fork.pid,
event->fork.tid);
16 if (dump_trace)
17 perf_event__fprintf_task(event, stdout);
19 if (thread == NULL || parent == NULL ||
20 thread__fork(thread, parent, sample->time) < 0) {
21 dump_printf("problem processing PERF_RECORD_FORK, skipping event.\n");
22 return -1;
}
25 return 0;
26 }
[root@ssdandy ~]# perf probe -x ~/bin/perf fork_after_comm=machine__process_fork_event:12
Added new event:
probe_perf:fork_after_comm (on machine__process_fork_event:12 in /home/acme/bin/perf)
You can now use it in all perf tools, such as:
perf record -e probe_perf:fork_after_comm -aR sleep 1
[root@ssdandy ~]#
[root@ssdandy ~]# perf record -g -e probe_perf:* trace -o /tmp/bla
^C[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.021 MB perf.data (30 samples) ]
Terminated
[root@ssdandy ~]#
[root@ssdandy ~]# perf report --no-children --show-total-period --stdio
# To display the perf.data header info, please use --header/--header-only options.
#
# Samples: 30 of event 'probe_perf:fork_after_comm'
# Event count (approx.): 30
#
# Overhead Period Command Shared Object Symbol
# ........ ............ ....... ............. ...............................
#
100.00% 30 trace trace [.] machine__process_fork_event
|
---machine__process_fork_event
__event__synthesize_thread.part.2
perf_event__synthesize_threads
cmd_trace
main
__libc_start_main
[root@ssdandy ~]#
And Looking at 'perf report -D' output we see it:
0 0 0x8698 [0x30]: PERF_RECORD_COMM: auditd:703/707
0 0 0x86c8 [0x38]: PERF_RECORD_FORK(703:707):(703:703)
Fix it by more closely mimicking how the kernel generates those records
when a new fork happens, i.e. first a PERF_RECORD_FORK, then a
PERF_RECORD_COMM.
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Borislav Petkov <bp@suse.de>
Cc: David Ahern <dsahern@gmail.com>
Cc: Don Zickus <dzickus@redhat.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-h0emvymi2t3mw8dlqd6d6z73@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/util/event.c | 34 ++++++++++++++++++++++++----------
1 file changed, 24 insertions(+), 10 deletions(-)
diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c
index 9e806d855b04..d5efa5092ce6 100644
--- a/tools/perf/util/event.c
+++ b/tools/perf/util/event.c
@@ -95,9 +95,7 @@ static pid_t perf_event__get_comm_tgid(pid_t pid, char *comm, size_t len)
return tgid;
}
-static pid_t perf_event__synthesize_comm(struct perf_tool *tool,
- union perf_event *event, pid_t pid,
- perf_event__handler_t process,
+static pid_t perf_event__prepare_comm(union perf_event *event, pid_t pid,
struct machine *machine)
{
size_t size;
@@ -124,6 +122,19 @@ static pid_t perf_event__synthesize_comm(struct perf_tool *tool,
(sizeof(event->comm.comm) - size) +
machine->id_hdr_size);
event->comm.tid = pid;
+out:
+ return tgid;
+}
+
+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)
+{
+ pid_t tgid = perf_event__prepare_comm(event, pid, machine);
+
+ if (tgid == -1)
+ goto out;
if (process(tool, event, &synth_sample, machine) != 0)
return -1;
@@ -139,7 +150,6 @@ static int perf_event__synthesize_fork(struct perf_tool *tool,
{
memset(&event->fork, 0, sizeof(event->fork) + machine->id_hdr_size);
- /* this is really a clone event but we use fork to synthesize it */
event->fork.ppid = tgid;
event->fork.ptid = tgid;
event->fork.pid = tgid;
@@ -368,19 +378,23 @@ static int __event__synthesize_thread(union perf_event *comm_event,
if (*end)
continue;
- tgid = perf_event__synthesize_comm(tool, comm_event, _pid,
- process, machine);
+ tgid = perf_event__prepare_comm(comm_event, _pid, machine);
if (tgid == -1)
return -1;
+ if (perf_event__synthesize_fork(tool, fork_event, _pid, tgid,
+ process, machine) < 0)
+ return -1;
+ /*
+ * Send the prepared comm event
+ */
+ if (process(tool, comm_event, &synth_sample, machine) != 0)
+ return -1;
+
if (_pid == pid) {
/* process the parent's maps too */
rc = perf_event__synthesize_mmap_events(tool, mmap_event, pid, tgid,
process, machine, mmap_data);
- } else {
- /* only fork the tid's map, to save time */
- rc = perf_event__synthesize_fork(tool, fork_event, _pid, tgid,
- process, machine);
}
if (rc)
--
1.9.3
next prev parent reply other threads:[~2015-03-03 3:26 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-03-03 3:25 [GIT PULL 00/20] perf/core improvements and fixes Arnaldo Carvalho de Melo
2015-03-03 3:25 ` [PATCH 01/20] perf tools: Only include tsc file for x86 Arnaldo Carvalho de Melo
2015-03-03 3:25 ` [PATCH 02/20] perf tools: Compare JOBS to 0 after grep Arnaldo Carvalho de Melo
2015-03-03 3:25 ` [PATCH 03/20] perf stat: Report unsupported events properly Arnaldo Carvalho de Melo
2015-03-03 3:25 ` Arnaldo Carvalho de Melo [this message]
2015-03-03 3:25 ` [PATCH 05/20] perf tools: Fix build error on ARCH=i386/x86_64/sparc64 Arnaldo Carvalho de Melo
2015-03-03 3:25 ` [PATCH 06/20] perf record: Get rid of -l option from Documentation Arnaldo Carvalho de Melo
2015-03-03 3:25 ` [PATCH 07/20] perf record: Document --group option Arnaldo Carvalho de Melo
2015-03-03 3:25 ` [PATCH 08/20] perf tools: Add PERF-FEATURES to the .gitignore file Arnaldo Carvalho de Melo
2015-03-03 3:25 ` [PATCH 09/20] perf tools: Remove annoying extra message from the features build Arnaldo Carvalho de Melo
2015-03-03 3:25 ` [PATCH 10/20] perf tools: Improve Python feature detection messages Arnaldo Carvalho de Melo
2015-03-03 3:26 ` [PATCH 11/20] perf tools: Improve libperl detection message Arnaldo Carvalho de Melo
2015-03-03 3:26 ` [PATCH 12/20] perf tools: Improve libbfd " Arnaldo Carvalho de Melo
2015-03-03 3:26 ` [PATCH 13/20] perf tools: Improve feature test debuggability Arnaldo Carvalho de Melo
2015-03-03 3:26 ` [PATCH 14/20] perf tools: Improve 'libbabel' feature check failure message Arnaldo Carvalho de Melo
2015-03-03 3:26 ` [PATCH 15/20] perf probe: Warn if given uprobe event accesses memory on older kernel Arnaldo Carvalho de Melo
2015-03-03 3:26 ` [PATCH 16/20] perf probe: Remove bias offset to find probe point by address Arnaldo Carvalho de Melo
2015-03-03 3:26 ` [PATCH 17/20] perf tools: Initialize cpu set in pthread_attr_setaffinity_np feature test Arnaldo Carvalho de Melo
2015-03-03 3:26 ` [PATCH 18/20] Revert "perf: Remove the extra validity check on nr_pages" Arnaldo Carvalho de Melo
2015-03-03 3:26 ` [PATCH 19/20] perf tools: Reference count struct thread Arnaldo Carvalho de Melo
2015-03-03 13:42 ` Namhyung Kim
2015-03-03 13:57 ` Arnaldo Carvalho de Melo
2015-03-03 3:26 ` [PATCH 20/20] perf sched: No need to keep the session around Arnaldo Carvalho de Melo
2015-03-03 6:20 ` [GIT PULL 00/20] perf/core improvements and fixes Ingo Molnar
2015-03-10 10:03 ` Ingo Molnar
2015-03-10 14:03 ` Arnaldo Carvalho de Melo
2015-03-10 14:37 ` Ingo Molnar
2015-03-23 22:18 ` [RFC] propagating symtab load errors. was: " Arnaldo Carvalho de Melo
2015-03-24 13:16 ` Jiri Olsa
2015-03-24 15:05 ` Arnaldo Carvalho de Melo
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=1425353169-21436-5-git-send-email-acme@kernel.org \
--to=acme@kernel.org \
--cc=acme@redhat.com \
--cc=adrian.hunter@intel.com \
--cc=bp@suse.de \
--cc=dsahern@gmail.com \
--cc=dzickus@redhat.com \
--cc=eranian@google.com \
--cc=fweisbec@gmail.com \
--cc=jolsa@redhat.com \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).