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 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.