ALSA: emux: Fix mutex deadlock in OSS emulation
authorTakashi Iwai <tiwai@suse.de>
Tue, 28 Apr 2015 15:11:44 +0000 (17:11 +0200)
committerSasha Levin <sasha.levin@oracle.com>
Sun, 17 May 2015 23:12:36 +0000 (19:12 -0400)
commit33b9b8ceb1cb2474c33dce3f366ffc947faf035c
tree5f668524a80ba97dc676c92feb59ea5580bf4043
parent1e568ab9b2d5d97516999e8f3e89fdd330fe2d8c
ALSA: emux: Fix mutex deadlock in OSS emulation

[ Upstream commit 1c94e65c668f44d2c69ae7e7fc268ab3268fba3e ]

The OSS emulation in synth-emux helper has a potential AB/BA deadlock
at the simultaneous closing and opening:

  close ->
    snd_seq_release() ->
      sne_seq_free_client() ->
        snd_seq_delete_all_ports(): takes client->ports_mutex ->
  port_delete() ->
    snd_emux_unuse(): takes emux->register_mutex

  open ->
    snd_seq_oss_open() ->
      snd_emux_open_seq_oss(): takes emux->register_mutex ->
        snd_seq_event_port_attach() ->
  snd_seq_create_port(): takes client->ports_mutex

This patch addresses the deadlock by reducing the rance taking
emux->register_mutex in snd_emux_open_seq_oss().  The lock is needed
for the refcount handling, so move it locally.  The calls in
emux_seq.c are already with the mutex, thus they are replaced with the
version without mutex lock/unlock.

Cc: <stable@vger.kernel.org>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Sasha Levin <sasha.levin@oracle.com>
sound/synth/emux/emux_oss.c
sound/synth/emux/emux_seq.c