Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dde1c652 authored by Takashi Iwai's avatar Takashi Iwai
Browse files

ALSA: pcm: Fix false lockdep warnings



As PCM core handles the multiple linked streams in parallel, lockdep
gets confused (partly because of weak annotations) and spews the
false-positive warnings.  This hasn't been a problem for long time but
the latest PCM lock path update seems to have woken up a sleeping
dog.

Here is an attempt to paper over this issue: pass the lock subclass
just calculated from the depth in snd_pcm_action_group().  Also, a
(possibly) wrong lock subclass set in snd_pcm_action_lock_mutex() is
dropped, too.

Reported-and-tested-by: default avatarArthur Marsh <arthur.marsh@internode.on.net>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent b1974f96
Loading
Loading
Loading
Loading
+5 −7
Original line number Diff line number Diff line
@@ -781,16 +781,15 @@ static int snd_pcm_action_group(struct action_ops *ops,
{
	struct snd_pcm_substream *s = NULL;
	struct snd_pcm_substream *s1;
	int res = 0;
	int res = 0, depth = 1;

	snd_pcm_group_for_each_entry(s, substream) {
		if (do_lock && s != substream) {
			if (s->pcm->nonatomic)
				mutex_lock_nested(&s->self_group.mutex,
						  SINGLE_DEPTH_NESTING);
				mutex_lock_nested(&s->self_group.mutex, depth);
			else
				spin_lock_nested(&s->self_group.lock,
						 SINGLE_DEPTH_NESTING);
				spin_lock_nested(&s->self_group.lock, depth);
			depth++;
		}
		res = ops->pre_action(s, state);
		if (res < 0)
@@ -906,8 +905,7 @@ static int snd_pcm_action_lock_mutex(struct action_ops *ops,
	down_read(&snd_pcm_link_rwsem);
	if (snd_pcm_stream_linked(substream)) {
		mutex_lock(&substream->group->mutex);
		mutex_lock_nested(&substream->self_group.mutex,
				  SINGLE_DEPTH_NESTING);
		mutex_lock(&substream->self_group.mutex);
		res = snd_pcm_action_group(ops, substream, state, 1);
		mutex_unlock(&substream->self_group.mutex);
		mutex_unlock(&substream->group->mutex);