[alsa-devel] [PATCH 1/6] ALSA: seq-dummy: remove deadlock-causing events on close
Takashi Iwai
tiwai at suse.de
Mon Jan 26 13:53:28 CET 2015
At Sun, 25 Jan 2015 14:34:29 +0100,
Clemens Ladisch wrote:
>
> When the last subscriber to a "Through" port has been removed, the
> subscribed destination ports might still be active, so it would be
> wrong to send "all sounds off" and "reset controller" events to them.
> The proper place for such a shutdown would be the closing of the actual
> MIDI port (and close_substream() in rawmidi.c already can do this).
>
> This also fixes a deadlock when dummy_unuse() tries to send events to
> its own port that is already locked because it is being freed.
>
> Reported-by: Peter Billam <peter at www.pjb.com.au>
> Fixes: 1da177e4c3f4
> Cc: <stable at vger.kernel.org>
> Signed-off-by: Clemens Ladisch <clemens at ladisch.de>
Applied to for-linus branch, but I dropped the fixes tag that points
to 2.6.12-rc2, which is obviously not so useful.
thanks,
Takashi
> ---
> sound/core/seq/seq_dummy.c | 31 -------------------------------
> 1 file changed, 31 deletions(-)
>
> diff --git a/sound/core/seq/seq_dummy.c b/sound/core/seq/seq_dummy.c
> index ec667f1..5d905d9 100644
> --- a/sound/core/seq/seq_dummy.c
> +++ b/sound/core/seq/seq_dummy.c
> @@ -82,36 +82,6 @@ struct snd_seq_dummy_port {
> static int my_client = -1;
>
> /*
> - * unuse callback - send ALL_SOUNDS_OFF and RESET_CONTROLLERS events
> - * to subscribers.
> - * Note: this callback is called only after all subscribers are removed.
> - */
> -static int
> -dummy_unuse(void *private_data, struct snd_seq_port_subscribe *info)
> -{
> - struct snd_seq_dummy_port *p;
> - int i;
> - struct snd_seq_event ev;
> -
> - p = private_data;
> - memset(&ev, 0, sizeof(ev));
> - if (p->duplex)
> - ev.source.port = p->connect;
> - else
> - ev.source.port = p->port;
> - ev.dest.client = SNDRV_SEQ_ADDRESS_SUBSCRIBERS;
> - ev.type = SNDRV_SEQ_EVENT_CONTROLLER;
> - for (i = 0; i < 16; i++) {
> - ev.data.control.channel = i;
> - ev.data.control.param = MIDI_CTL_ALL_SOUNDS_OFF;
> - snd_seq_kernel_client_dispatch(p->client, &ev, 0, 0);
> - ev.data.control.param = MIDI_CTL_RESET_CONTROLLERS;
> - snd_seq_kernel_client_dispatch(p->client, &ev, 0, 0);
> - }
> - return 0;
> -}
> -
> -/*
> * event input callback - just redirect events to subscribers
> */
> static int
> @@ -175,7 +145,6 @@ create_port(int idx, int type)
> | SNDRV_SEQ_PORT_TYPE_PORT;
> memset(&pcb, 0, sizeof(pcb));
> pcb.owner = THIS_MODULE;
> - pcb.unuse = dummy_unuse;
> pcb.event_input = dummy_input;
> pcb.private_free = dummy_free;
> pcb.private_data = rec;
>
More information about the Alsa-devel
mailing list