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: Arthur Marsh <arthur.marsh@internode.on.net> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
Родитель
b1974f965a
Коммит
dde1c652d7
|
@ -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);
|
||||
|
|
Загрузка…
Ссылка в новой задаче