瀏覽代碼

s390/perf: Improve PMU selection for PERF_COUNT_HW_CPU_CYCLES events

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>
Hendrik Brueckner 11 年之前
父節點
當前提交
55baa2f831
共有 1 個文件被更改,包括 22 次插入4 次删除
  1. 22 4
      arch/s390/kernel/perf_cpum_sf.c

+ 22 - 4
arch/s390/kernel/perf_cpum_sf.c

@@ -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)))