* [PATCH] regmap: Drop map lock during cache init and exit
@ 2026-09-25 10:43 Michael Reeves via B4 Relay
2026-09-25 12:22 ` Mark Brown
0 siblings, 1 reply; 2+ messages in thread
From: Michael Reeves via B4 Relay @ 2026-09-25 10:43 UTC (permalink / raw)
To: Mark Brown
Cc: Greg Kroah-Hartman, Rafael J. Wysocki, Danilo Krummrich,
linux-kernel, driver-core, asahi, Michael Reeves
From: Michael Reeves <michael.reeves077@gmail.com>
On systems with CONFIG_PROVE_RAW_LOCK_NESTING enabled, Apple GPIO probe
triggers an "Invalid wait context" lockdep warning.
The driver uses a regmap with a raw spinlock and REGCACHE_FLAT. During
regcache_init(), regcache_flat_init() allocates memory while holding the
raw spinlock. The memory allocator can acquire a non-raw spinlock, which
causes an invalid raw-to-non-raw lock nesting error. The abbreviated call
chain is:
apple_gpio_pinctrl_probe
regcache_init
regcache_flat_init
__kmalloc_noprof
__pcs_replace_empty_main
refill_objects
_raw_spin_lock_irqsave
GFP_ATOMIC does not make this lock nesting valid.
Holding the map lock during cache allocation and exit is not needed:
- Cache allocation occurs before the regmap is published.
- Cache destruction occurs only after all users stop access.
- regmap_reinit_cache() requires callers to prevent concurrent access.
Commit fd4ebc07b4df ("regmap: Hold the regmap lock when allocating and
freeing the cache") added the lock for Maple tree lockdep validation.
The current Maple tree backend uses internal locking, and cache
population is now separate from cache allocation.
Remove map locking from the cache init and exit callbacks. Keep map
locking for cache population and normal register access.
Fixes: fd4ebc07b4df ("regmap: Hold the regmap lock when allocating and freeing the cache")
Signed-off-by: Michael Reeves <michael.reeves077@gmail.com>
---
Tested on Apple M3 MacBook Air (T8122):
- All 4 GPIO controllers probe successfully with lockdep enabled.
- The "Invalid wait context" warning no longer occurs.
- All 549 regmap KUnit tests pass (38 test groups).
---
drivers/base/regmap/regcache.c | 6 ------
1 file changed, 6 deletions(-)
diff --git a/drivers/base/regmap/regcache.c b/drivers/base/regmap/regcache.c
index 0d58d900a..b137ded7f 100644
--- a/drivers/base/regmap/regcache.c
+++ b/drivers/base/regmap/regcache.c
@@ -225,9 +225,7 @@ int regcache_init(struct regmap *map, const struct regmap_config *config)
if (map->cache_ops->init) {
dev_dbg(map->dev, "Initializing %s cache\n",
map->cache_ops->name);
- map->lock(map->lock_arg);
ret = map->cache_ops->init(map);
- map->unlock(map->lock_arg);
if (ret)
goto err_free_reg_defaults;
}
@@ -259,9 +257,7 @@ int regcache_init(struct regmap *map, const struct regmap_config *config)
err_exit:
if (map->cache_ops->exit) {
dev_dbg(map->dev, "Destroying %s cache\n", map->cache_ops->name);
- map->lock(map->lock_arg);
map->cache_ops->exit(map);
- map->unlock(map->lock_arg);
}
err_free_reg_defaults:
kfree(map->reg_defaults);
@@ -281,9 +277,7 @@ void regcache_exit(struct regmap *map)
if (map->cache_ops->exit) {
dev_dbg(map->dev, "Destroying %s cache\n",
map->cache_ops->name);
- map->lock(map->lock_arg);
map->cache_ops->exit(map);
- map->unlock(map->lock_arg);
}
kfree(map->reg_defaults);
---
base-commit: 5dd1818b15d98d4a20806cd00b1b40320b06004f
change-id: 20260925-regcache-lifecycle-submit-74f366be0fbc
Best regards,
--
Michael Reeves <michael.reeves077@gmail.com>
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH] regmap: Drop map lock during cache init and exit
2026-09-25 10:43 [PATCH] regmap: Drop map lock during cache init and exit Michael Reeves via B4 Relay
@ 2026-09-25 12:22 ` Mark Brown
0 siblings, 0 replies; 2+ messages in thread
From: Mark Brown @ 2026-09-25 12:22 UTC (permalink / raw)
To: michael.reeves077
Cc: Greg Kroah-Hartman, Rafael J. Wysocki, Danilo Krummrich,
linux-kernel, driver-core, asahi
[-- Attachment #1: Type: text/plain, Size: 799 bytes --]
On Fri, Sep 25, 2026 at 08:43:22PM +1000, Michael Reeves via B4 Relay wrote:
> Commit fd4ebc07b4df ("regmap: Hold the regmap lock when allocating and
> freeing the cache") added the lock for Maple tree lockdep validation.
> The current Maple tree backend uses internal locking, and cache
> population is now separate from cache allocation.
Do you have a reference for what you're referencing here? The issue is
precisely that the maple tree does it's own locking with a spinlock, if
we ever use the maple tree from a hardirq context the use of the
spinlock in hardirq context will be tracked and then on removal we'll
get a locking inversion warning when we try to free it. The maple tree
locking is entirely unneeded and forces us to jump through these hoops
but there's no way to turn it off.
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2026-09-25 12:22 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-09-25 10:43 [PATCH] regmap: Drop map lock during cache init and exit Michael Reeves via B4 Relay
2026-09-25 12:22 ` Mark Brown
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®