On Thu, Nov 01, 2018 at 06:04:01PM +0800, Wei Wang wrote:
Add x86_perf_mask_perf_counters to reserve counters from the host perfNAK. This completely undermines the whole purpose of event scheduling.
subsystem. The masked counters will not be assigned to any host perf
events. This can be used by the hypervisor to reserve perf counters for
a guest to use.
This function is currently supported on Intel CPUs only, but put in x86
perf core because the counter assignment is implemented here and we need
to re-enable the pmu which is defined in the x86 perf core in the case
that a counter to be masked happens to be used by the host.
Signed-off-by: Wei Wang <wei.w.wang@xxxxxxxxx>
Cc: Peter Zijlstra <peterz@xxxxxxxxxxxxx>
Cc: Andi Kleen <ak@xxxxxxxxxxxxxxx>
Cc: Paolo Bonzini <pbonzini@xxxxxxxxxx>
---
arch/x86/events/core.c | 37 +++++++++++++++++++++++++++++++++++++
arch/x86/include/asm/perf_event.h | 1 +
2 files changed, 38 insertions(+)
diff --git a/arch/x86/events/core.c b/arch/x86/events/core.c
index 106911b..e73135a 100644
--- a/arch/x86/events/core.c
+++ b/arch/x86/events/core.c
@@ -716,6 +716,7 @@ struct perf_sched {
static void perf_sched_init(struct perf_sched *sched, struct event_constraint **constraints,
int num, int wmin, int wmax, int gpmax)
{
+ struct cpu_hw_events *cpuc = this_cpu_ptr(&cpu_hw_events);
int idx;
memset(sched, 0, sizeof(*sched));
@@ -723,6 +724,9 @@ static void perf_sched_init(struct perf_sched *sched, struct event_constraint **
sched->max_weight = wmax;
sched->max_gp = gpmax;
sched->constraints = constraints;
+#ifdef CONFIG_CPU_SUP_INTEL
+ sched->state.used[0] = cpuc->intel_ctrl_guest_mask;
+#endif