Skip to content

Commit

Permalink
regmap: maple: Drop the RCU read lock while syncing registers
Browse files Browse the repository at this point in the history
Unfortunately the maple tree requires us to explicitly lock it so we need
to take the RCU read lock while iterating. When syncing this means that we
end up trying to write out register values while holding the RCU read lock
which triggers lockdep issues since that is an atomic context but most
buses can't be used in atomic context. Pause the iteration and drop the
lock for each register we check to avoid this.

Reported-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Tested-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
Link: https://lore.kernel.org/r/20230523-regcache-maple-sync-lock-v1-1-530e4d68dfab@kernel.org
Signed-off-by: Mark Brown <broonie@kernel.org>
  • Loading branch information
Mark Brown committed May 24, 2023
1 parent 95856d1 commit 0cc6578
Showing 1 changed file with 4 additions and 1 deletion.
5 changes: 4 additions & 1 deletion drivers/base/regmap/regcache-maple.c
Original file line number Diff line number Diff line change
Expand Up @@ -203,15 +203,18 @@ static int regcache_maple_sync(struct regmap *map, unsigned int min,

mas_for_each(&mas, entry, max) {
for (r = max(mas.index, lmin); r <= min(mas.last, lmax); r++) {
mas_pause(&mas);
rcu_read_unlock();
ret = regcache_sync_val(map, r, entry[r - mas.index]);
if (ret != 0)
goto out;
rcu_read_lock();
}
}

out:
rcu_read_unlock();

out:
map->cache_bypass = false;

return ret;
Expand Down

0 comments on commit 0cc6578

Please sign in to comment.