From: Mark Rutland Date: Wed, 22 Jun 2011 14:32:48 +0000 (+0100) Subject: ARM: 6975/1: pmu: reject duplicate PMU registrations X-Git-Tag: v3.1-rc1~258^2~1^6~14 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ae0c3751ab08d3fe039d48935e9ad2c46711b23b;p=profile%2Fivi%2Fkernel-x86-ivi.git ARM: 6975/1: pmu: reject duplicate PMU registrations Currently, the PMU reservation framework allows for multiple PMUs of the same type to register themselves. This can lead to a bug with the sequence: register_pmu(pmu1); reserve_pmu(pmu_type); register_pmu(pmu2); release_pmu(pmu1); Here, pmu1 cannot be released, and pmu2 cannot be reserved. This patch modifies register_pmu to reject registrations where a PMU is already present, preventing this problem. PMUs which can have multiple instances should not use the PMU reservation framework. Signed-off-by: Mark Rutland Acked-by: Jamie Iles Acked-by: Will Deacon Signed-off-by: Russell King --- diff --git a/arch/arm/kernel/pmu.c b/arch/arm/kernel/pmu.c index 87942b9..de6b1b0 100644 --- a/arch/arm/kernel/pmu.c +++ b/arch/arm/kernel/pmu.c @@ -34,13 +34,13 @@ static int __devinit pmu_register(struct platform_device *pdev, return -EINVAL; } - if (pmu_devices[type]) - pr_warning("registering new PMU device type %d overwrites " - "previous registration!\n", type); - else - pr_info("registered new PMU device of type %d\n", - type); + if (pmu_devices[type]) { + pr_warning("rejecting duplicate registration of PMU device " + "type %d.", type); + return -ENOSPC; + } + pr_info("registered new PMU device of type %d\n", type); pmu_devices[type] = pdev; return 0; }