| From: Thomas Gleixner <tglx@linutronix.de> |
| Date: Mon, 22 Feb 2016 22:19:25 +0000 |
| Subject: [PATCH] perf/x86/intel/rapl: Make PMU lock raw |
| |
| Upstream commit: a208749c6426 ("perf/x86/intel/rapl: Make PMU lock raw") |
| |
| This lock is taken in hard interrupt context even on Preempt-RT. Make it raw |
| so RT does not have to patch it. |
| |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> |
| Cc: Andi Kleen <andi.kleen@intel.com> |
| Cc: Arnaldo Carvalho de Melo <acme@redhat.com> |
| Cc: Borislav Petkov <bp@alien8.de> |
| Cc: Harish Chegondi <harish.chegondi@intel.com> |
| Cc: Jacob Pan <jacob.jun.pan@linux.intel.com> |
| Cc: Jiri Olsa <jolsa@redhat.com> |
| Cc: Kan Liang <kan.liang@intel.com> |
| Cc: Linus Torvalds <torvalds@linux-foundation.org> |
| Cc: Peter Zijlstra <peterz@infradead.org> |
| Cc: Stephane Eranian <eranian@google.com> |
| Cc: Vince Weaver <vincent.weaver@maine.edu> |
| Cc: linux-kernel@vger.kernel.org |
| Cc: stable-rt@vger.kernel.org |
| Link: http://lkml.kernel.org/r/20160222221012.669411833@linutronix.de |
| Signed-off-by: Ingo Molnar <mingo@kernel.org> |
| Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> |
| --- |
| arch/x86/kernel/cpu/perf_event_intel_rapl.c | 20 ++++++++++---------- |
| 1 file changed, 10 insertions(+), 10 deletions(-) |
| |
| --- a/arch/x86/kernel/cpu/perf_event_intel_rapl.c |
| +++ b/arch/x86/kernel/cpu/perf_event_intel_rapl.c |
| @@ -117,7 +117,7 @@ static struct perf_pmu_events_attr event |
| }; |
| |
| struct rapl_pmu { |
| - spinlock_t lock; |
| + raw_spinlock_t lock; |
| int n_active; /* number of active events */ |
| struct list_head active_list; |
| struct pmu *pmu; /* pointer to rapl_pmu_class */ |
| @@ -220,13 +220,13 @@ static enum hrtimer_restart rapl_hrtimer |
| if (!pmu->n_active) |
| return HRTIMER_NORESTART; |
| |
| - spin_lock_irqsave(&pmu->lock, flags); |
| + raw_spin_lock_irqsave(&pmu->lock, flags); |
| |
| list_for_each_entry(event, &pmu->active_list, active_entry) { |
| rapl_event_update(event); |
| } |
| |
| - spin_unlock_irqrestore(&pmu->lock, flags); |
| + raw_spin_unlock_irqrestore(&pmu->lock, flags); |
| |
| hrtimer_forward_now(hrtimer, pmu->timer_interval); |
| |
| @@ -263,9 +263,9 @@ static void rapl_pmu_event_start(struct |
| struct rapl_pmu *pmu = __this_cpu_read(rapl_pmu); |
| unsigned long flags; |
| |
| - spin_lock_irqsave(&pmu->lock, flags); |
| + raw_spin_lock_irqsave(&pmu->lock, flags); |
| __rapl_pmu_event_start(pmu, event); |
| - spin_unlock_irqrestore(&pmu->lock, flags); |
| + raw_spin_unlock_irqrestore(&pmu->lock, flags); |
| } |
| |
| static void rapl_pmu_event_stop(struct perf_event *event, int mode) |
| @@ -274,7 +274,7 @@ static void rapl_pmu_event_stop(struct p |
| struct hw_perf_event *hwc = &event->hw; |
| unsigned long flags; |
| |
| - spin_lock_irqsave(&pmu->lock, flags); |
| + raw_spin_lock_irqsave(&pmu->lock, flags); |
| |
| /* mark event as deactivated and stopped */ |
| if (!(hwc->state & PERF_HES_STOPPED)) { |
| @@ -299,7 +299,7 @@ static void rapl_pmu_event_stop(struct p |
| hwc->state |= PERF_HES_UPTODATE; |
| } |
| |
| - spin_unlock_irqrestore(&pmu->lock, flags); |
| + raw_spin_unlock_irqrestore(&pmu->lock, flags); |
| } |
| |
| static int rapl_pmu_event_add(struct perf_event *event, int mode) |
| @@ -308,14 +308,14 @@ static int rapl_pmu_event_add(struct per |
| struct hw_perf_event *hwc = &event->hw; |
| unsigned long flags; |
| |
| - spin_lock_irqsave(&pmu->lock, flags); |
| + raw_spin_lock_irqsave(&pmu->lock, flags); |
| |
| hwc->state = PERF_HES_UPTODATE | PERF_HES_STOPPED; |
| |
| if (mode & PERF_EF_START) |
| __rapl_pmu_event_start(pmu, event); |
| |
| - spin_unlock_irqrestore(&pmu->lock, flags); |
| + raw_spin_unlock_irqrestore(&pmu->lock, flags); |
| |
| return 0; |
| } |
| @@ -603,7 +603,7 @@ static int rapl_cpu_prepare(int cpu) |
| pmu = kzalloc_node(sizeof(*pmu), GFP_KERNEL, cpu_to_node(cpu)); |
| if (!pmu) |
| return -1; |
| - spin_lock_init(&pmu->lock); |
| + raw_spin_lock_init(&pmu->lock); |
| |
| INIT_LIST_HEAD(&pmu->active_list); |
| |