linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] regmap: maple: Drop the RCU read lock while syncing registers
@ 2023-05-23 22:18 Mark Brown
  2023-05-23 22:24 ` Pierre-Louis Bossart
  2023-05-24 11:58 ` Mark Brown
  0 siblings, 2 replies; 3+ messages in thread
From: Mark Brown @ 2023-05-23 22:18 UTC (permalink / raw)
  To: Pierre-Louis Bossart; +Cc: linux-kernel, alsa-devel, Mark Brown

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>
Signed-off-by: Mark Brown <broonie@kernel.org>
---
 drivers/base/regmap/regcache-maple.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/base/regmap/regcache-maple.c b/drivers/base/regmap/regcache-maple.c
index 9b1b559107ef..c2e3a0f6c218 100644
--- a/drivers/base/regmap/regcache-maple.c
+++ b/drivers/base/regmap/regcache-maple.c
@@ -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;

---
base-commit: 44c026a73be8038f03dbdeef028b642880cf1511
change-id: 20230523-regcache-maple-sync-lock-57ea356dc60b

Best regards,
-- 
Mark Brown <broonie@kernel.org>


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] regmap: maple: Drop the RCU read lock while syncing registers
  2023-05-23 22:18 [PATCH] regmap: maple: Drop the RCU read lock while syncing registers Mark Brown
@ 2023-05-23 22:24 ` Pierre-Louis Bossart
  2023-05-24 11:58 ` Mark Brown
  1 sibling, 0 replies; 3+ messages in thread
From: Pierre-Louis Bossart @ 2023-05-23 22:24 UTC (permalink / raw)
  To: Mark Brown; +Cc: linux-kernel, alsa-devel



On 5/23/23 17:18, Mark Brown wrote:
> 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>

Closes: https://github.com/thesofproject/linux/issues/4371
Tested-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>

> Signed-off-by: Mark Brown <broonie@kernel.org>
> ---
>  drivers/base/regmap/regcache-maple.c | 5 ++++-
>  1 file changed, 4 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/base/regmap/regcache-maple.c b/drivers/base/regmap/regcache-maple.c
> index 9b1b559107ef..c2e3a0f6c218 100644
> --- a/drivers/base/regmap/regcache-maple.c
> +++ b/drivers/base/regmap/regcache-maple.c
> @@ -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;
> 
> ---
> base-commit: 44c026a73be8038f03dbdeef028b642880cf1511
> change-id: 20230523-regcache-maple-sync-lock-57ea356dc60b
> 
> Best regards,

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] regmap: maple: Drop the RCU read lock while syncing registers
  2023-05-23 22:18 [PATCH] regmap: maple: Drop the RCU read lock while syncing registers Mark Brown
  2023-05-23 22:24 ` Pierre-Louis Bossart
@ 2023-05-24 11:58 ` Mark Brown
  1 sibling, 0 replies; 3+ messages in thread
From: Mark Brown @ 2023-05-24 11:58 UTC (permalink / raw)
  To: Pierre-Louis Bossart, Mark Brown; +Cc: linux-kernel, alsa-devel

On Tue, 23 May 2023 23:18:19 +0100, Mark Brown wrote:
> 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.
> 
> [...]

Applied to

   https://git.kernel.org/pub/scm/linux/kernel/git/broonie/regmap.git for-next

Thanks!

[1/1] regmap: maple: Drop the RCU read lock while syncing registers
      commit: 0cc6578048e0980d254aee345130cced4912f723

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2023-05-24 11:58 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-05-23 22:18 [PATCH] regmap: maple: Drop the RCU read lock while syncing registers Mark Brown
2023-05-23 22:24 ` Pierre-Louis Bossart
2023-05-24 11:58 ` Mark Brown

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).