]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - arch/sh/kernel/perf_event.c
perf: Per PMU disable
[mv-sheeva.git] / arch / sh / kernel / perf_event.c
index 8cb206597e0cad28bbabf62f54cf6e2f93ef9f4d..4bbe19058a58f3eabddcb04950a3884c65252440 100644 (file)
@@ -230,11 +230,14 @@ static int sh_pmu_enable(struct perf_event *event)
        struct cpu_hw_events *cpuc = &__get_cpu_var(cpu_hw_events);
        struct hw_perf_event *hwc = &event->hw;
        int idx = hwc->idx;
+       int ret = -EAGAIN;
+
+       perf_pmu_disable(event->pmu);
 
        if (test_and_set_bit(idx, cpuc->used_mask)) {
                idx = find_first_zero_bit(cpuc->used_mask, sh_pmu->num_events);
                if (idx == sh_pmu->num_events)
-                       return -EAGAIN;
+                       goto out;
 
                set_bit(idx, cpuc->used_mask);
                hwc->idx = idx;
@@ -248,8 +251,10 @@ static int sh_pmu_enable(struct perf_event *event)
        sh_pmu->enable(hwc, idx);
 
        perf_event_update_userpage(event);
-
-       return 0;
+       ret = 0;
+out:
+       perf_pmu_enable(event->pmu);
+       return ret;
 }
 
 static void sh_pmu_read(struct perf_event *event)
@@ -280,7 +285,25 @@ static int sh_pmu_event_init(struct perf_event *event)
        return err;
 }
 
+static void sh_pmu_pmu_enable(struct pmu *pmu)
+{
+       if (!sh_pmu_initialized())
+               return;
+
+       sh_pmu->enable_all();
+}
+
+static void sh_pmu_pmu_disable(struct pmu *pmu)
+{
+       if (!sh_pmu_initialized())
+               return;
+
+       sh_pmu->disable_all();
+}
+
 static struct pmu pmu = {
+       .pmu_enable     = sh_pmu_pmu_enable,
+       .pmu_disable    = sh_pmu_pmu_disable,
        .event_init     = sh_pmu_event_init,
        .enable         = sh_pmu_enable,
        .disable        = sh_pmu_disable,
@@ -311,22 +334,6 @@ sh_pmu_notifier(struct notifier_block *self, unsigned long action, void *hcpu)
        return NOTIFY_OK;
 }
 
-void hw_perf_enable(void)
-{
-       if (!sh_pmu_initialized())
-               return;
-
-       sh_pmu->enable_all();
-}
-
-void hw_perf_disable(void)
-{
-       if (!sh_pmu_initialized())
-               return;
-
-       sh_pmu->disable_all();
-}
-
 int __cpuinit register_sh_pmu(struct sh_pmu *pmu)
 {
        if (sh_pmu)