perf, x86: Fix LBR enable/disable vs cpuc->enabled
[safe/jmp/linux-2.6] / arch / x86 / kernel / cpu / perf_event_intel_lbr.c
index dcec765..0145f99 100644 (file)
@@ -69,7 +69,7 @@ static void intel_pmu_lbr_enable(struct perf_event *event)
        if (!x86_pmu.lbr_nr)
                return;
 
-       WARN_ON(cpuc->enabled);
+       WARN_ON_ONCE(cpuc->enabled);
 
        /*
         * Reset the LBR stack if this is the first LBR user or
@@ -93,9 +93,10 @@ static void intel_pmu_lbr_disable(struct perf_event *event)
                return;
 
        cpuc->lbr_users--;
-
        BUG_ON(cpuc->lbr_users < 0);
-       WARN_ON(cpuc->enabled);
+
+       if (cpuc->enabled && !cpuc->lbr_users)
+               __intel_pmu_lbr_disable();
 }
 
 static void intel_pmu_lbr_enable_all(void)