Skip to content

Commit

Permalink
perf record: Enable counters only when kernel is execing subcommand
Browse files Browse the repository at this point in the history
'perf record' starts counters before subcommand is execed, so
the statistics is not precise because it includes data of some
preparation steps. I fix it with the patch.

In addition, change the condition to fork/exec subcommand. If
there is a subcommand parameter, perf always fork/exec it. The
usage example is:

 # perf record -f -a sleep 10

So this command could collect statistics for 10 seconds
precisely. User still could stop it by CTRL+C. Without the new
capability, user could only input CTRL+C to stop it without
precise time clock.

Signed-off-by: Zhang Yanmin <yanmin_zhang@linux.intel.com>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Avi Kivity <avi@redhat.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Sheng Yang <sheng@linux.intel.com>
Cc: oerg Roedel <joro@8bytes.org>
Cc: Jes Sorensen <Jes.Sorensen@redhat.com>
Cc: Marcelo Tosatti <mtosatti@redhat.com>
Cc: Gleb Natapov <gleb@redhat.com>
Cc: <zhiteng.huang@intel.com>
Cc: Zachary Amsden <zamsden@redhat.com>
LKML-Reference: <1268922965-14774-2-git-send-email-acme@infradead.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
  • Loading branch information
Zhang, Yanmin authored and Ingo Molnar committed Mar 18, 2010
1 parent 6be2850 commit 46be604
Showing 1 changed file with 15 additions and 18 deletions.
33 changes: 15 additions & 18 deletions tools/perf/builtin-record.c
Original file line number Diff line number Diff line change
Expand Up @@ -225,7 +225,7 @@ static struct perf_header_attr *get_header_attr(struct perf_event_attr *a, int n
return h_attr;
}

static void create_counter(int counter, int cpu, pid_t pid, bool forks)
static void create_counter(int counter, int cpu, pid_t pid)
{
char *filter = filters[counter];
struct perf_event_attr *attr = attrs + counter;
Expand Down Expand Up @@ -275,10 +275,10 @@ static void create_counter(int counter, int cpu, pid_t pid, bool forks)
attr->mmap = track;
attr->comm = track;
attr->inherit = inherit;
attr->disabled = 1;

if (forks)
if (target_pid == -1 && !system_wide) {
attr->disabled = 1;
attr->enable_on_exec = 1;
}

try_again:
fd[nr_cpu][counter] = sys_perf_event_open(attr, pid, cpu, group_fd, 0);
Expand Down Expand Up @@ -380,17 +380,15 @@ static void create_counter(int counter, int cpu, pid_t pid, bool forks)
exit(-1);
}
}

ioctl(fd[nr_cpu][counter], PERF_EVENT_IOC_ENABLE);
}

static void open_counters(int cpu, pid_t pid, bool forks)
static void open_counters(int cpu, pid_t pid)
{
int counter;

group_fd = -1;
for (counter = 0; counter < nr_counters; counter++)
create_counter(counter, cpu, pid, forks);
create_counter(counter, cpu, pid);

nr_cpu++;
}
Expand Down Expand Up @@ -425,7 +423,7 @@ static int __cmd_record(int argc, const char **argv)
int err;
unsigned long waking = 0;
int child_ready_pipe[2], go_pipe[2];
const bool forks = target_pid == -1 && argc > 0;
const bool forks = argc > 0;
char buf;

page_size = sysconf(_SC_PAGE_SIZE);
Expand Down Expand Up @@ -496,13 +494,13 @@ static int __cmd_record(int argc, const char **argv)
atexit(atexit_header);

if (forks) {
pid = fork();
child_pid = fork();
if (pid < 0) {
perror("failed to fork");
exit(-1);
}

if (!pid) {
if (!child_pid) {
close(child_ready_pipe[0]);
close(go_pipe[1]);
fcntl(go_pipe[0], F_SETFD, FD_CLOEXEC);
Expand Down Expand Up @@ -531,11 +529,6 @@ static int __cmd_record(int argc, const char **argv)
exit(-1);
}

child_pid = pid;

if (!system_wide)
target_pid = pid;

close(child_ready_pipe[1]);
close(go_pipe[0]);
/*
Expand All @@ -548,13 +541,17 @@ static int __cmd_record(int argc, const char **argv)
close(child_ready_pipe[0]);
}

if (forks && target_pid == -1 && !system_wide)
pid = child_pid;
else
pid = target_pid;

if ((!system_wide && !inherit) || profile_cpu != -1) {
open_counters(profile_cpu, target_pid, forks);
open_counters(profile_cpu, pid);
} else {
nr_cpus = read_cpu_map();
for (i = 0; i < nr_cpus; i++)
open_counters(cpumap[i], target_pid, forks);
open_counters(cpumap[i], pid);
}

if (file_new) {
Expand Down

0 comments on commit 46be604

Please sign in to comment.