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: bfc653aa89 ("perf: arm_cspmu: Separate Arm and vendor module")
Signed-off-by: Ma Ke <make24@iscas.ac.cn>
Signed-off-by: Will Deacon <will@kernel.org>
This commit is contained in:
Ma Ke 2025-10-22 19:53:25 +08:00 committed by Will Deacon
parent 8fa08f8835
commit 970e1e4180
1 changed files with 3 additions and 1 deletions

View File

@ -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);