perf tools: Fix counter sample frequency breakage
authorMike Galbraith <efault@gmx.de>
Mon, 12 Oct 2009 05:56:03 +0000 (07:56 +0200)
committerIngo Molnar <mingo@elte.hu>
Mon, 12 Oct 2009 07:10:55 +0000 (09:10 +0200)
Commit 42e59d7d19dc4b4 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>
tools/perf/builtin-record.c
tools/perf/builtin-top.c

index 59af03d..4e3a374 100644 (file)
@@ -26,7 +26,7 @@
 
 static int                     fd[MAX_NR_CPUS][MAX_COUNTERS];
 
-static long                    default_interval                = 100000;
+static long                    default_interval                =      0;
 
 static int                     nr_cpus                         =      0;
 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;
        }
 
+       /*
+        * 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++) {
                if (attrs[counter].sample_period)
                        continue;
index d978dc9..c0f69e8 100644 (file)
@@ -57,7 +57,7 @@ static int                    fd[MAX_NR_CPUS][MAX_COUNTERS];
 
 static int                     system_wide                     =      0;
 
-static int                     default_interval                = 100000;
+static int                     default_interval                =      0;
 
 static int                     count_filter                    =      5;
 static int                     print_entries                   =     15;
@@ -975,7 +975,13 @@ static void start_counter(int i, int counter)
        attr = attrs + counter;
 
        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;
 
 try_again:
@@ -1130,11 +1136,6 @@ int cmd_top(int argc, const char **argv, const char *prefix __used)
        if (argc)
                usage_with_options(top_usage, options);
 
-       if (freq) {
-               default_interval = freq;
-               freq = 1;
-       }
-
        /* CPU and PID are mutually exclusive */
        if (target_pid != -1 && profile_cpu != -1) {
                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_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:
         */