Re: [RFC] x86,perf: Implement minimal P4 PMU driver v14

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Cyrill Gorcunov
Date: Thursday, March 11, 2010 - 2:15 pm

On Thu, Mar 11, 2010 at 07:39:21PM +0100, Ingo Molnar wrote:

Perhaps something like the patch below (tested with kvm)? With this patch
we will actually waste ~4/8 bytes per PMU (intel,amd,p6) since this call
hits on p4 only, so I think perhaps better to use one x86 scheduler hook
instead of empty schedule_events() in PMU, hmm?
---

x86,perf: Fix NULL deref on not assigned x86_pmu

In case of not assigned x86_pmu and software events
NULL dereference may being hit via x86_pmu::schedule_events
method.

Fix it by calling x86_pmu::schedule_events only if we
have one. Otherwise use general scheduler.

Also the former x86_schedule_events calls restored.

Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org>
---
 arch/x86/kernel/cpu/perf_event.c       |   10 +++++++---
 arch/x86/kernel/cpu/perf_event_amd.c   |    1 -
 arch/x86/kernel/cpu/perf_event_intel.c |    2 --
 arch/x86/kernel/cpu/perf_event_p6.c    |    1 -
 4 files changed, 7 insertions(+), 7 deletions(-)

Index: linux-2.6.git/arch/x86/kernel/cpu/perf_event.c
=====================================================================
--- linux-2.6.git.orig/arch/x86/kernel/cpu/perf_event.c
+++ linux-2.6.git/arch/x86/kernel/cpu/perf_event.c
@@ -604,6 +604,10 @@ static int x86_schedule_events(struct cp
 	int i, j, w, wmax, num = 0;
 	struct hw_perf_event *hwc;
 
+	/* the PMU has its own scheduler */
+	if (unlikely(x86_pmu.schedule_events))
+		return x86_pmu.schedule_events(cpuc, n, assign);
+
 	bitmap_zero(used_mask, X86_PMC_IDX_MAX);
 
 	for (i = 0; i < n; i++) {
@@ -936,7 +940,7 @@ static int x86_pmu_enable(struct perf_ev
 	if (n < 0)
 		return n;
 
-	ret = x86_pmu.schedule_events(cpuc, n, assign);
+	ret = x86_schedule_events(cpuc, n, assign);
 	if (ret)
 		return ret;
 	/*
@@ -1268,7 +1272,7 @@ int hw_perf_group_sched_in(struct perf_e
 	if (n0 < 0)
 		return n0;
 
-	ret = x86_pmu.schedule_events(cpuc, n0, assign);
+	ret = x86_schedule_events(cpuc, n0, assign);
 	if (ret)
 		return ret;
 
@@ -1521,7 +1525,7 @@ static int validate_group(struct perf_ev
 
 	fake_cpuc->n_events = n;
 
-	ret = x86_pmu.schedule_events(fake_cpuc, n, NULL);
+	ret = x86_schedule_events(fake_cpuc, n, NULL);
 
 out_free:
 	kfree(fake_cpuc);
Index: linux-2.6.git/arch/x86/kernel/cpu/perf_event_amd.c
=====================================================================
--- linux-2.6.git.orig/arch/x86/kernel/cpu/perf_event_amd.c
+++ linux-2.6.git/arch/x86/kernel/cpu/perf_event_amd.c
@@ -364,7 +364,6 @@ static __initconst struct x86_pmu amd_pm
 	.enable			= x86_pmu_enable_event,
 	.disable		= x86_pmu_disable_event,
 	.hw_config		= x86_hw_config,
-	.schedule_events	= x86_schedule_events,
 	.eventsel		= MSR_K7_EVNTSEL0,
 	.perfctr		= MSR_K7_PERFCTR0,
 	.event_map		= amd_pmu_event_map,
Index: linux-2.6.git/arch/x86/kernel/cpu/perf_event_intel.c
=====================================================================
--- linux-2.6.git.orig/arch/x86/kernel/cpu/perf_event_intel.c
+++ linux-2.6.git/arch/x86/kernel/cpu/perf_event_intel.c
@@ -750,7 +750,6 @@ static __initconst struct x86_pmu core_p
 	.enable			= x86_pmu_enable_event,
 	.disable		= x86_pmu_disable_event,
 	.hw_config		= x86_hw_config,
-	.schedule_events	= x86_schedule_events,
 	.eventsel		= MSR_ARCH_PERFMON_EVENTSEL0,
 	.perfctr		= MSR_ARCH_PERFMON_PERFCTR0,
 	.event_map		= intel_pmu_event_map,
@@ -789,7 +788,6 @@ static __initconst struct x86_pmu intel_
 	.enable			= intel_pmu_enable_event,
 	.disable		= intel_pmu_disable_event,
 	.hw_config		= x86_hw_config,
-	.schedule_events	= x86_schedule_events,
 	.eventsel		= MSR_ARCH_PERFMON_EVENTSEL0,
 	.perfctr		= MSR_ARCH_PERFMON_PERFCTR0,
 	.event_map		= intel_pmu_event_map,
Index: linux-2.6.git/arch/x86/kernel/cpu/perf_event_p6.c
=====================================================================
--- linux-2.6.git.orig/arch/x86/kernel/cpu/perf_event_p6.c
+++ linux-2.6.git/arch/x86/kernel/cpu/perf_event_p6.c
@@ -110,7 +110,6 @@ static __initconst struct x86_pmu p6_pmu
 	.enable			= p6_pmu_enable_event,
 	.disable		= p6_pmu_disable_event,
 	.hw_config		= x86_hw_config,
-	.schedule_events	= x86_schedule_events,
 	.eventsel		= MSR_P6_EVNTSEL0,
 	.perfctr		= MSR_P6_PERFCTR0,
 	.event_map		= p6_pmu_event_map,
--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[RFC] x86,perf: Implement minimal P4 PMU driver v14, Cyrill Gorcunov, (Wed Mar 10, 11:31 am)
Re: [RFC] x86,perf: Implement minimal P4 PMU driver v14, Robert Richter, (Wed Mar 10, 12:29 pm)
Re: [RFC] x86,perf: Implement minimal P4 PMU driver v14, Cyrill Gorcunov, (Wed Mar 10, 12:43 pm)
Re: [RFC] x86,perf: Implement minimal P4 PMU driver v14, Cyrill Gorcunov, (Wed Mar 10, 9:12 pm)
Re: [RFC] x86,perf: Implement minimal P4 PMU driver v14, Cyrill Gorcunov, (Thu Mar 11, 9:54 am)
Re: [RFC] x86,perf: Implement minimal P4 PMU driver v14, Ingo Molnar, (Thu Mar 11, 11:16 am)
Re: [RFC] x86,perf: Implement minimal P4 PMU driver v14, Cyrill Gorcunov, (Thu Mar 11, 11:29 am)
[tip:perf/x86] perf, x86: Implement initial P4 PMU driver, tip-bot for Cyrill G ..., (Thu Mar 11, 11:33 am)
Re: [RFC] x86,perf: Implement minimal P4 PMU driver v14, Ingo Molnar, (Thu Mar 11, 11:39 am)
Re: [RFC] x86,perf: Implement minimal P4 PMU driver v14, Cyrill Gorcunov, (Thu Mar 11, 2:15 pm)
Re: [RFC] x86,perf: Implement minimal P4 PMU driver v14, Peter Zijlstra, (Thu Mar 11, 2:24 pm)
Re: [RFC] x86,perf: Implement minimal P4 PMU driver v14, Cyrill Gorcunov, (Thu Mar 11, 2:31 pm)
Re: [RFC] x86,perf: Implement minimal P4 PMU driver v14, Peter Zijlstra, (Thu Mar 11, 2:38 pm)
Re: [RFC] x86,perf: Implement minimal P4 PMU driver v14, Cyrill Gorcunov, (Thu Mar 11, 2:41 pm)
Re: [RFC] x86,perf: Implement minimal P4 PMU driver v14, Cyrill Gorcunov, (Thu Mar 11, 2:50 pm)
[tip:perf/x86] x86, perf: Fix NULL deref on not assigned x ..., tip-bot for Cyrill G ..., (Fri Mar 12, 2:54 am)
[tip:perf/core] perf, x86: Report error code that returned ..., tip-bot for Robert R ..., (Wed Mar 17, 2:48 am)