perf/x86/intel/uncore: Simplify error rollback
authorThomas Gleixner <tglx@linutronix.de>
Mon, 22 Feb 2016 22:19:09 +0000 (22:19 +0000)
committerIngo Molnar <mingo@kernel.org>
Mon, 29 Feb 2016 08:35:13 +0000 (09:35 +0100)
No point in doing partial rollbacks. Robustify uncore_exit_type() so it does
not dereference type->pmus unconditionally and remove all the partial rollback
hackery.

Preparatory patch for proper error handling.

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
Link: http://lkml.kernel.org/r/20160222221010.751077467@linutronix.de
Signed-off-by: Ingo Molnar <mingo@kernel.org>
arch/x86/events/intel/uncore.c

index c422d52ecefa40c9af780eb17889b5bfb723381f..91facdc22d18fe439717bc9f1f1300dc2ea0b958 100644 (file)
@@ -767,10 +767,12 @@ static void __init uncore_type_exit(struct intel_uncore_type *type)
 {
        int i;
 
-       for (i = 0; i < type->num_boxes; i++)
-               free_percpu(type->pmus[i].box);
-       kfree(type->pmus);
-       type->pmus = NULL;
+       if (type->pmus) {
+               for (i = 0; i < type->num_boxes; i++)
+                       free_percpu(type->pmus[i].box);
+               kfree(type->pmus);
+               type->pmus = NULL;
+       }
        kfree(type->events_group);
        type->events_group = NULL;
 }
@@ -778,6 +780,7 @@ static void __init uncore_type_exit(struct intel_uncore_type *type)
 static void __init uncore_types_exit(struct intel_uncore_type **types)
 {
        int i;
+
        for (i = 0; types[i]; i++)
                uncore_type_exit(types[i]);
 }
@@ -806,7 +809,7 @@ static int __init uncore_type_init(struct intel_uncore_type *type)
                INIT_LIST_HEAD(&pmus[i].box_list);
                pmus[i].box = alloc_percpu(struct intel_uncore_box *);
                if (!pmus[i].box)
-                       goto fail;
+                       return -ENOMEM;
        }
 
        if (type->event_descs) {
@@ -817,7 +820,7 @@ static int __init uncore_type_init(struct intel_uncore_type *type)
                attr_group = kzalloc(sizeof(struct attribute *) * (i + 1) +
                                        sizeof(*attr_group), GFP_KERNEL);
                if (!attr_group)
-                       goto fail;
+                       return -ENOMEM;
 
                attrs = (struct attribute **)(attr_group + 1);
                attr_group->name = "events";
@@ -831,9 +834,6 @@ static int __init uncore_type_init(struct intel_uncore_type *type)
 
        type->pmu_group = &uncore_pmu_attr_group;
        return 0;
-fail:
-       uncore_type_exit(type);
-       return -ENOMEM;
 }
 
 static int __init uncore_types_init(struct intel_uncore_type **types)
@@ -843,13 +843,9 @@ static int __init uncore_types_init(struct intel_uncore_type **types)
        for (i = 0; types[i]; i++) {
                ret = uncore_type_init(types[i]);
                if (ret)
-                       goto fail;
+                       return ret;
        }
        return 0;
-fail:
-       while (--i >= 0)
-               uncore_type_exit(types[i]);
-       return ret;
 }
 
 /*
@@ -1007,17 +1003,21 @@ static int __init uncore_pci_init(void)
 
        ret = uncore_types_init(uncore_pci_uncores);
        if (ret)
-               return ret;
+               goto err;
 
        uncore_pci_driver->probe = uncore_pci_probe;
        uncore_pci_driver->remove = uncore_pci_remove;
 
        ret = pci_register_driver(uncore_pci_driver);
-       if (ret == 0)
-               pcidrv_registered = true;
-       else
-               uncore_types_exit(uncore_pci_uncores);
+       if (ret)
+               goto err;
+
+       pcidrv_registered = true;
+       return 0;
 
+err:
+       uncore_types_exit(uncore_pci_uncores);
+       uncore_pci_uncores = empty_uncore;
        return ret;
 }
 
@@ -1316,9 +1316,12 @@ static int __init uncore_cpu_init(void)
 
        ret = uncore_types_init(uncore_msr_uncores);
        if (ret)
-               return ret;
-
+               goto err;
        return 0;
+err:
+       uncore_types_exit(uncore_msr_uncores);
+       uncore_msr_uncores = empty_uncore;
+       return ret;
 }
 
 static int __init uncore_pmus_register(void)