Commit 32b3f338 authored by Alexander Sverdlin's avatar Alexander Sverdlin Committed by Greg Kroah-Hartman
Browse files

counter: interrupt-cnt: Protect enable/disable OPs with mutex



[ Upstream commit 73513126 ]

Enable/disable seems to be racy on SMP, consider the following scenario:

CPU0					CPU1

interrupt_cnt_enable_write(true)
{
	if (priv->enabled == enable)
		return 0;

	if (enable) {
		priv->enabled = true;
					interrupt_cnt_enable_write(false)
					{
						if (priv->enabled == enable)
							return 0;

						if (enable) {
							priv->enabled = true;
							enable_irq(priv->irq);
						} else {
							disable_irq(priv->irq)
							priv->enabled = false;
						}
		enable_irq(priv->irq);
	} else {
		disable_irq(priv->irq);
		priv->enabled = false;
	}

The above would result in priv->enabled == false, but IRQ left enabled.
Protect both write (above race) and read (to propagate the value on SMP)
callbacks with a mutex.

Signed-off-by: default avatarAlexander Sverdlin <alexander.sverdlin@siemens.com>
Fixes: a55ebd47 ("counter: add IRQ or GPIO based counter")
Acked-by: default avatarOleksij Rempel <o.rempel@pengutronix.de>
Link: https://lore.kernel.org/r/20250331163642.2382651-1-alexander.sverdlin@siemens.com


Signed-off-by: default avatarWilliam Breathitt Gray <wbg@kernel.org>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent 72166de0
Loading
Loading
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment