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: 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>
This commit is contained in:
parent
3ccca9eca6
commit
ffeda00380
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user