Commit ffeda003 authored by Thomas Gleixner's avatar Thomas Gleixner Committed by Ingo Molnar

perf/x86/intel/uncore: Simplify error rollback

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: default avatarThomas Gleixner <tglx@linutronix.de>
Signed-off-by: default avatarPeter 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.deSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
parent 3ccca9ec
...@@ -767,10 +767,12 @@ static void __init uncore_type_exit(struct intel_uncore_type *type) ...@@ -767,10 +767,12 @@ static void __init uncore_type_exit(struct intel_uncore_type *type)
{ {
int i; int i;
if (type->pmus) {
for (i = 0; i < type->num_boxes; i++) for (i = 0; i < type->num_boxes; i++)
free_percpu(type->pmus[i].box); free_percpu(type->pmus[i].box);
kfree(type->pmus); kfree(type->pmus);
type->pmus = NULL; type->pmus = NULL;
}
kfree(type->events_group); kfree(type->events_group);
type->events_group = NULL; type->events_group = NULL;
} }
...@@ -778,6 +780,7 @@ static void __init uncore_type_exit(struct intel_uncore_type *type) ...@@ -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) static void __init uncore_types_exit(struct intel_uncore_type **types)
{ {
int i; int i;
for (i = 0; types[i]; i++) for (i = 0; types[i]; i++)
uncore_type_exit(types[i]); uncore_type_exit(types[i]);
} }
...@@ -806,7 +809,7 @@ static int __init uncore_type_init(struct intel_uncore_type *type) ...@@ -806,7 +809,7 @@ static int __init uncore_type_init(struct intel_uncore_type *type)
INIT_LIST_HEAD(&pmus[i].box_list); INIT_LIST_HEAD(&pmus[i].box_list);
pmus[i].box = alloc_percpu(struct intel_uncore_box *); pmus[i].box = alloc_percpu(struct intel_uncore_box *);
if (!pmus[i].box) if (!pmus[i].box)
goto fail; return -ENOMEM;
} }
if (type->event_descs) { if (type->event_descs) {
...@@ -817,7 +820,7 @@ static int __init uncore_type_init(struct intel_uncore_type *type) ...@@ -817,7 +820,7 @@ static int __init uncore_type_init(struct intel_uncore_type *type)
attr_group = kzalloc(sizeof(struct attribute *) * (i + 1) + attr_group = kzalloc(sizeof(struct attribute *) * (i + 1) +
sizeof(*attr_group), GFP_KERNEL); sizeof(*attr_group), GFP_KERNEL);
if (!attr_group) if (!attr_group)
goto fail; return -ENOMEM;
attrs = (struct attribute **)(attr_group + 1); attrs = (struct attribute **)(attr_group + 1);
attr_group->name = "events"; attr_group->name = "events";
...@@ -831,9 +834,6 @@ static int __init uncore_type_init(struct intel_uncore_type *type) ...@@ -831,9 +834,6 @@ static int __init uncore_type_init(struct intel_uncore_type *type)
type->pmu_group = &uncore_pmu_attr_group; type->pmu_group = &uncore_pmu_attr_group;
return 0; return 0;
fail:
uncore_type_exit(type);
return -ENOMEM;
} }
static int __init uncore_types_init(struct intel_uncore_type **types) 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) ...@@ -843,13 +843,9 @@ static int __init uncore_types_init(struct intel_uncore_type **types)
for (i = 0; types[i]; i++) { for (i = 0; types[i]; i++) {
ret = uncore_type_init(types[i]); ret = uncore_type_init(types[i]);
if (ret) if (ret)
goto fail; return ret;
} }
return 0; return 0;
fail:
while (--i >= 0)
uncore_type_exit(types[i]);
return ret;
} }
/* /*
...@@ -1007,17 +1003,21 @@ static int __init uncore_pci_init(void) ...@@ -1007,17 +1003,21 @@ static int __init uncore_pci_init(void)
ret = uncore_types_init(uncore_pci_uncores); ret = uncore_types_init(uncore_pci_uncores);
if (ret) if (ret)
return ret; goto err;
uncore_pci_driver->probe = uncore_pci_probe; uncore_pci_driver->probe = uncore_pci_probe;
uncore_pci_driver->remove = uncore_pci_remove; uncore_pci_driver->remove = uncore_pci_remove;
ret = pci_register_driver(uncore_pci_driver); ret = pci_register_driver(uncore_pci_driver);
if (ret == 0) if (ret)
goto err;
pcidrv_registered = true; pcidrv_registered = true;
else return 0;
uncore_types_exit(uncore_pci_uncores);
err:
uncore_types_exit(uncore_pci_uncores);
uncore_pci_uncores = empty_uncore;
return ret; return ret;
} }
...@@ -1316,9 +1316,12 @@ static int __init uncore_cpu_init(void) ...@@ -1316,9 +1316,12 @@ static int __init uncore_cpu_init(void)
ret = uncore_types_init(uncore_msr_uncores); ret = uncore_types_init(uncore_msr_uncores);
if (ret) if (ret)
return ret; goto err;
return 0; return 0;
err:
uncore_types_exit(uncore_msr_uncores);
uncore_msr_uncores = empty_uncore;
return ret;
} }
static int __init uncore_pmus_register(void) static int __init uncore_pmus_register(void)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment