From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753855AbcB2LFF (ORCPT ); Mon, 29 Feb 2016 06:05:05 -0500 Received: from torg.zytor.com ([198.137.202.12]:53276 "EHLO terminus.zytor.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752507AbcB2LE7 (ORCPT ); Mon, 29 Feb 2016 06:04:59 -0500 Date: Mon, 29 Feb 2016 03:03:58 -0800 From: tip-bot for Thomas Gleixner Message-ID: Cc: kan.liang@intel.com, hpa@zytor.com, linux-kernel@vger.kernel.org, jacob.jun.pan@linux.intel.com, tglx@linutronix.de, torvalds@linux-foundation.org, mingo@kernel.org, jolsa@redhat.com, acme@redhat.com, harish.chegondi@intel.com, bp@alien8.de, peterz@infradead.org, eranian@google.com, vincent.weaver@maine.edu, andi.kleen@intel.com Reply-To: bp@alien8.de, harish.chegondi@intel.com, acme@redhat.com, jolsa@redhat.com, vincent.weaver@maine.edu, andi.kleen@intel.com, eranian@google.com, peterz@infradead.org, linux-kernel@vger.kernel.org, jacob.jun.pan@linux.intel.com, hpa@zytor.com, kan.liang@intel.com, mingo@kernel.org, torvalds@linux-foundation.org, tglx@linutronix.de In-Reply-To: <20160222221010.751077467@linutronix.de> References: <20160222221010.751077467@linutronix.de> To: linux-tip-commits@vger.kernel.org Subject: [tip:perf/core] perf/x86/intel/uncore: Simplify error rollback Git-Commit-ID: ffeda003803213a8d0babefdd6a95fe424884c14 X-Mailer: tip-git-log-daemon Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 Content-Disposition: inline Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Commit-ID: ffeda003803213a8d0babefdd6a95fe424884c14 Gitweb: http://git.kernel.org/tip/ffeda003803213a8d0babefdd6a95fe424884c14 Author: Thomas Gleixner AuthorDate: Mon, 22 Feb 2016 22:19:09 +0000 Committer: Ingo Molnar CommitDate: Mon, 29 Feb 2016 09:35:13 +0100 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 Signed-off-by: Peter Zijlstra (Intel) Cc: Andi Kleen Cc: Arnaldo Carvalho de Melo Cc: Borislav Petkov Cc: Harish Chegondi Cc: Jacob Pan Cc: Jiri Olsa Cc: Kan Liang Cc: Linus Torvalds Cc: Peter Zijlstra Cc: Stephane Eranian Cc: Vince Weaver Cc: linux-kernel@vger.kernel.org Link: http://lkml.kernel.org/r/20160222221010.751077467@linutronix.de Signed-off-by: Ingo Molnar --- arch/x86/events/intel/uncore.c | 45 ++++++++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/arch/x86/events/intel/uncore.c b/arch/x86/events/intel/uncore.c index c422d52e..91facdc 100644 --- a/arch/x86/events/intel/uncore.c +++ b/arch/x86/events/intel/uncore.c @@ -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)