OSDN Git Service

s390/perf: Improve PMU selection for PERF_COUNT_HW_CPU_CYCLES events
authorHendrik Brueckner <brueckner@linux.vnet.ibm.com>
Thu, 12 Dec 2013 15:47:00 +0000 (16:47 +0100)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Mon, 16 Dec 2013 13:37:52 +0000 (14:37 +0100)
The cpum_cf (counter facility) PMU does not support sampling events.
With cpum_sf (sampling facility), a PMU for sampling CPU cycles is
available.

Make cpum_sf the "default" PMU for PERF_COUNT_HW_CPU_CYCLES sampling
events but use the more precise cpum_cf PMU for non-sampling events.

Signed-off-by: Hendrik Brueckner <brueckner@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
arch/s390/kernel/perf_cpum_sf.c

index 141eca0..52bf36e 100644 (file)
@@ -468,11 +468,29 @@ static int cpumsf_pmu_event_init(struct perf_event *event)
 {
        int err;
 
-       if (event->attr.type != PERF_TYPE_RAW)
-               return -ENOENT;
-
-       if (event->attr.config != PERF_EVENT_CPUM_SF)
+       /* No support for taken branch sampling */
+       if (has_branch_stack(event))
+               return -EOPNOTSUPP;
+
+       switch (event->attr.type) {
+       case PERF_TYPE_RAW:
+               if (event->attr.config != PERF_EVENT_CPUM_SF)
+                       return -ENOENT;
+               break;
+       case PERF_TYPE_HARDWARE:
+               /* Support sampling of CPU cycles in addition to the
+                * counter facility.  However, the counter facility
+                * is more precise and, hence, restrict this PMU to
+                * sampling events only.
+                */
+               if (event->attr.config != PERF_COUNT_HW_CPU_CYCLES)
+                       return -ENOENT;
+               if (!is_sampling_event(event))
+                       return -ENOENT;
+               break;
+       default:
                return -ENOENT;
+       }
 
        if (event->cpu >= nr_cpumask_bits ||
            (event->cpu >= 0 && !cpu_online(event->cpu)))