Commit 970e1e41 authored by Ma Ke's avatar Ma Ke Committed by Will Deacon
Browse files

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: bfc653aa ("perf: arm_cspmu: Separate Arm and vendor module")
Signed-off-by: default avatarMa Ke <make24@iscas.ac.cn>
Signed-off-by: default avatarWill Deacon <will@kernel.org>
parent 8fa08f88
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -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);