From: Ma Ke Date: Wed, 22 Oct 2025 11:53:25 +0000 (+0800) Subject: perf: arm_cspmu: fix error handling in arm_cspmu_impl_unregister() X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=970e1e41805f0bd49dc234330a9390f4708d097d;p=thirdparty%2Fkernel%2Flinux.git perf: arm_cspmu: fix error handling in arm_cspmu_impl_unregister() driver_find_device() calls get_device() to increment the reference count once a matching device is found. device_release_driver() releases the driver, but it does not decrease the reference count that was incremented by driver_find_device(). At the end of the loop, there is no put_device() to balance the reference count. To avoid reference count leakage, add put_device() to decrease the reference count. Found by code review. Cc: stable@vger.kernel.org Fixes: bfc653aa89cb ("perf: arm_cspmu: Separate Arm and vendor module") Signed-off-by: Ma Ke Signed-off-by: Will Deacon --- diff --git a/drivers/perf/arm_cspmu/arm_cspmu.c b/drivers/perf/arm_cspmu/arm_cspmu.c index 33ad2cab5c160..34430b68f6025 100644 --- a/drivers/perf/arm_cspmu/arm_cspmu.c +++ b/drivers/perf/arm_cspmu/arm_cspmu.c @@ -1407,8 +1407,10 @@ void arm_cspmu_impl_unregister(const struct arm_cspmu_impl_match *impl_match) /* Unbind the driver from all matching backend devices. */ while ((dev = driver_find_device(&arm_cspmu_driver.driver, NULL, - match, arm_cspmu_match_device))) + match, arm_cspmu_match_device))) { device_release_driver(dev); + put_device(dev); + } mutex_lock(&arm_cspmu_lock);