]> git.karo-electronics.de Git - mv-sheeva.git/commitdiff
oprofile, ARM: Use oprofile_arch_exit() to cleanup on failure
authorRobert Richter <robert.richter@amd.com>
Wed, 29 Sep 2010 13:42:30 +0000 (15:42 +0200)
committerRobert Richter <robert.richter@amd.com>
Mon, 11 Oct 2010 17:34:04 +0000 (19:34 +0200)
There is duplicate cleanup code in the init and exit functions. Now,
oprofile_arch_exit() is also used if oprofile_arch_init() fails.

Acked-by: Will Deacon <will.deacon@arm.com>
Signed-off-by: Robert Richter <robert.richter@amd.com>
drivers/oprofile/oprofile_perf.c

index a34137f2e26c1d40985c2f4bb14de27eea5ab761..b17235a24a4db285d5b5f65c5796f4e3b11ee019 100644 (file)
@@ -245,10 +245,33 @@ static int __init init_driverfs(void) { return 0; }
 #define exit_driverfs() do { } while (0)
 #endif /* CONFIG_PM */
 
+void oprofile_perf_exit(void)
+{
+       int cpu, id;
+       struct perf_event *event;
+
+       for_each_possible_cpu(cpu) {
+               for (id = 0; id < num_counters; ++id) {
+                       event = perf_events[cpu][id];
+                       if (event)
+                               perf_event_release_kernel(event);
+               }
+
+               kfree(perf_events[cpu]);
+       }
+
+       kfree(counter_config);
+       exit_driverfs();
+}
+
 int __init oprofile_perf_init(struct oprofile_operations *ops)
 {
        int cpu, ret = 0;
 
+       ret = init_driverfs();
+       if (ret)
+               return ret;
+
        memset(&perf_events, 0, sizeof(perf_events));
 
        num_counters = perf_num_counters();
@@ -265,13 +288,10 @@ int __init oprofile_perf_init(struct oprofile_operations *ops)
                pr_info("oprofile: failed to allocate %d "
                                "counters\n", num_counters);
                ret = -ENOMEM;
+               num_counters = 0;
                goto out;
        }
 
-       ret = init_driverfs();
-       if (ret)
-               goto out;
-
        for_each_possible_cpu(cpu) {
                perf_events[cpu] = kcalloc(num_counters,
                                sizeof(struct perf_event *), GFP_KERNEL);
@@ -296,30 +316,8 @@ int __init oprofile_perf_init(struct oprofile_operations *ops)
                pr_info("oprofile: using %s\n", ops->cpu_type);
 
 out:
-       if (ret) {
-               for_each_possible_cpu(cpu)
-                       kfree(perf_events[cpu]);
-               kfree(counter_config);
-       }
+       if (ret)
+               oprofile_perf_exit();
 
        return ret;
 }
-
-void __exit oprofile_perf_exit(void)
-{
-       int cpu, id;
-       struct perf_event *event;
-
-       for_each_possible_cpu(cpu) {
-               for (id = 0; id < num_counters; ++id) {
-                       event = perf_events[cpu][id];
-                       if (event)
-                               perf_event_release_kernel(event);
-               }
-
-               kfree(perf_events[cpu]);
-       }
-
-       kfree(counter_config);
-       exit_driverfs();
-}