perf tools: Fix counter sample frequency breakage
Commit 42e59d7d19
switched to a default sample frequency of
1KHz, which overrides any user supplied count, causing sched, top
and timechart to miss events due to their discrete events
being flagged PERF_SAMPLE_PERIOD.
Override default sample frequency when the user profides a
period count, and make both record and top honor that user
supplied option.
Signed-off-by: Mike Galbraith <efault@gmx.de>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arjan van de Ven <arjan@infradead.org>
LKML-Reference: <1255326963.15107.2.camel@marge.simson.net>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
committed by
Ingo Molnar
parent
fe9081cc9b
commit
7e4ff9e3e8
@@ -26,7 +26,7 @@
|
|||||||
|
|
||||||
static int fd[MAX_NR_CPUS][MAX_COUNTERS];
|
static int fd[MAX_NR_CPUS][MAX_COUNTERS];
|
||||||
|
|
||||||
static long default_interval = 100000;
|
static long default_interval = 0;
|
||||||
|
|
||||||
static int nr_cpus = 0;
|
static int nr_cpus = 0;
|
||||||
static unsigned int page_size;
|
static unsigned int page_size;
|
||||||
@@ -730,6 +730,18 @@ int cmd_record(int argc, const char **argv, const char *prefix __used)
|
|||||||
attrs[0].config = PERF_COUNT_HW_CPU_CYCLES;
|
attrs[0].config = PERF_COUNT_HW_CPU_CYCLES;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* User specified count overrides default frequency.
|
||||||
|
*/
|
||||||
|
if (default_interval)
|
||||||
|
freq = 0;
|
||||||
|
else if (freq) {
|
||||||
|
default_interval = freq;
|
||||||
|
} else {
|
||||||
|
fprintf(stderr, "frequency and count are zero, aborting\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
for (counter = 0; counter < nr_counters; counter++) {
|
for (counter = 0; counter < nr_counters; counter++) {
|
||||||
if (attrs[counter].sample_period)
|
if (attrs[counter].sample_period)
|
||||||
continue;
|
continue;
|
||||||
|
@@ -57,7 +57,7 @@ static int fd[MAX_NR_CPUS][MAX_COUNTERS];
|
|||||||
|
|
||||||
static int system_wide = 0;
|
static int system_wide = 0;
|
||||||
|
|
||||||
static int default_interval = 100000;
|
static int default_interval = 0;
|
||||||
|
|
||||||
static int count_filter = 5;
|
static int count_filter = 5;
|
||||||
static int print_entries = 15;
|
static int print_entries = 15;
|
||||||
@@ -975,7 +975,13 @@ static void start_counter(int i, int counter)
|
|||||||
attr = attrs + counter;
|
attr = attrs + counter;
|
||||||
|
|
||||||
attr->sample_type = PERF_SAMPLE_IP | PERF_SAMPLE_TID;
|
attr->sample_type = PERF_SAMPLE_IP | PERF_SAMPLE_TID;
|
||||||
attr->freq = freq;
|
|
||||||
|
if (freq) {
|
||||||
|
attr->sample_type |= PERF_SAMPLE_PERIOD;
|
||||||
|
attr->freq = 1;
|
||||||
|
attr->sample_freq = freq;
|
||||||
|
}
|
||||||
|
|
||||||
attr->inherit = (cpu < 0) && inherit;
|
attr->inherit = (cpu < 0) && inherit;
|
||||||
|
|
||||||
try_again:
|
try_again:
|
||||||
@@ -1130,11 +1136,6 @@ int cmd_top(int argc, const char **argv, const char *prefix __used)
|
|||||||
if (argc)
|
if (argc)
|
||||||
usage_with_options(top_usage, options);
|
usage_with_options(top_usage, options);
|
||||||
|
|
||||||
if (freq) {
|
|
||||||
default_interval = freq;
|
|
||||||
freq = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* CPU and PID are mutually exclusive */
|
/* CPU and PID are mutually exclusive */
|
||||||
if (target_pid != -1 && profile_cpu != -1) {
|
if (target_pid != -1 && profile_cpu != -1) {
|
||||||
printf("WARNING: PID switch overriding CPU\n");
|
printf("WARNING: PID switch overriding CPU\n");
|
||||||
@@ -1151,6 +1152,19 @@ int cmd_top(int argc, const char **argv, const char *prefix __used)
|
|||||||
parse_symbols();
|
parse_symbols();
|
||||||
parse_source(sym_filter_entry);
|
parse_source(sym_filter_entry);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* User specified count overrides default frequency.
|
||||||
|
*/
|
||||||
|
if (default_interval)
|
||||||
|
freq = 0;
|
||||||
|
else if (freq) {
|
||||||
|
default_interval = freq;
|
||||||
|
} else {
|
||||||
|
fprintf(stderr, "frequency and count are zero, aborting\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Fill in the ones not specifically initialized via -c:
|
* Fill in the ones not specifically initialized via -c:
|
||||||
*/
|
*/
|
||||||
|
Reference in New Issue
Block a user