summaryrefslogtreecommitdiff
path: root/drivers/base
diff options
context:
space:
mode:
authorCheng-Yu Lee <cylee12@realtek.com>2026-01-09 06:26:33 +0300
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2026-02-06 18:44:08 +0300
commitf1e2fe26a51eca95b41420af76d22c2e613efd5e (patch)
tree4d652061da906a5e01e91d5c35ee3b6941f8a7b9 /drivers/base
parentbddd3d10d039729b81cfb0804520c8832a701a0e (diff)
downloadlinux-f1e2fe26a51eca95b41420af76d22c2e613efd5e.tar.xz
regmap: Fix race condition in hwspinlock irqsave routine
[ Upstream commit 4b58aac989c1e3fafb1c68a733811859df388250 ] Previously, the address of the shared member '&map->spinlock_flags' was passed directly to 'hwspin_lock_timeout_irqsave'. This creates a race condition where multiple contexts contending for the lock could overwrite the shared flags variable, potentially corrupting the state for the current lock owner. Fix this by using a local stack variable 'flags' to store the IRQ state temporarily. Fixes: 8698b9364710 ("regmap: Add hardware spinlock support") Signed-off-by: Cheng-Yu Lee <cylee12@realtek.com> Co-developed-by: Yu-Chun Lin <eleanor.lin@realtek.com> Signed-off-by: Yu-Chun Lin <eleanor.lin@realtek.com> Link: https://patch.msgid.link/20260109032633.8732-1-eleanor.lin@realtek.com Signed-off-by: Mark Brown <broonie@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
Diffstat (limited to 'drivers/base')
-rw-r--r--drivers/base/regmap/regmap.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c
index bdbde64e4b21..bc89790ff0de 100644
--- a/drivers/base/regmap/regmap.c
+++ b/drivers/base/regmap/regmap.c
@@ -462,9 +462,11 @@ static void regmap_lock_hwlock_irq(void *__map)
static void regmap_lock_hwlock_irqsave(void *__map)
{
struct regmap *map = __map;
+ unsigned long flags = 0;
hwspin_lock_timeout_irqsave(map->hwlock, UINT_MAX,
- &map->spinlock_flags);
+ &flags);
+ map->spinlock_flags = flags;
}
static void regmap_unlock_hwlock(void *__map)