perf_counter: x86: Fix PMU resource leak
authorPeter Zijlstra <a.p.zijlstra@chello.nl>
Wed, 9 Sep 2009 08:04:47 +0000 (10:04 +0200)
committerIngo Molnar <mingo@elte.hu>
Sun, 20 Sep 2009 17:53:57 +0000 (19:53 +0200)
Dave noticed that we leak the PMU resource reservations when we
fail the hardware counter init.

Reported-by: David Miller <davem@davemloft.net>
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Acked-by: David Miller <davem@davemloft.net>
LKML-Reference: <1252483487.7746.164.camel@twins>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
arch/x86/kernel/cpu/perf_counter.c

index dbdf712fae9ec52f5a75c4a2b50fb6d272ca6f43..a6c8b27553cd4023be8bda88c1a6d6e44e3d6460 100644 (file)
@@ -924,6 +924,8 @@ static int __hw_perf_counter_init(struct perf_counter *counter)
        if (err)
                return err;
 
+       counter->destroy = hw_perf_counter_destroy;
+
        /*
         * Generate PMC IRQs:
         * (keep 'enabled' bit clear for now)
@@ -953,8 +955,6 @@ static int __hw_perf_counter_init(struct perf_counter *counter)
                        return -EOPNOTSUPP;
        }
 
-       counter->destroy = hw_perf_counter_destroy;
-
        /*
         * Raw event type provide the config in the event structure
         */
@@ -2107,8 +2107,11 @@ const struct pmu *hw_perf_counter_init(struct perf_counter *counter)
        int err;
 
        err = __hw_perf_counter_init(counter);
-       if (err)
+       if (err) {
+               if (counter->destroy)
+                       counter->destroy(counter);
                return ERR_PTR(err);
+       }
 
        return &pmu;
 }