[alsa-devel] [PATCH] fireworks: serialize transactions to update connections at bus reset
Takashi Iwai
tiwai at suse.de
Sat Feb 20 15:48:24 CET 2016
On Sat, 20 Feb 2016 08:48:29 +0100,
Takashi Sakamoto wrote:
>
> On Feb 20 2016 16:41, Takashi Sakamoto wrote:
> > In IEC 61883-1, at bus-reset, applications can continue isochronous
> > streaming by updating connections. In ALSA fireworks driver, the
> > operation is executed in 'update' handler for bus driver.
> >
> > The connection resources are also changed in process contexts of PCM/MIDI
> > applications. Therefore, bus-reset handling has race condition
> > against connection. Current ALSA fireworks driver has a bug for the
> > condition.
> >
> > This commit fixes the bug, by expand critical section with mutex. As a
> > result, connection updating operation in bus-reset handler and connection
> > changing operation in process context are serialized.
>
> Oops. I forgot to add 'ALSA:' prefix to the commit title. I'm sorry but
> would you please add it when merging to for-next branch?
Don't worry, applied it with the prefix.
thanks,
Takashi
>
> > Signed-off-by: Takashi Sakamoto <o-takashi at sakamocchi.jp>
> > ---
> > sound/firewire/fireworks/fireworks.c | 3 +++
> > sound/firewire/fireworks/fireworks_stream.c | 6 ++----
> > 2 files changed, 5 insertions(+), 4 deletions(-)
> >
> > diff --git a/sound/firewire/fireworks/fireworks.c b/sound/firewire/fireworks/fireworks.c
> > index d5b19bc..8f27b67 100644
> > --- a/sound/firewire/fireworks/fireworks.c
> > +++ b/sound/firewire/fireworks/fireworks.c
> > @@ -301,7 +301,10 @@ static void efw_update(struct fw_unit *unit)
> > struct snd_efw *efw = dev_get_drvdata(&unit->device);
> >
> > snd_efw_transaction_bus_reset(efw->unit);
> > +
> > + mutex_lock(&efw->mutex);
> > snd_efw_stream_update_duplex(efw);
> > + mutex_unlock(&efw->mutex);
> > }
> >
> > static void efw_remove(struct fw_unit *unit)
> > diff --git a/sound/firewire/fireworks/fireworks_stream.c b/sound/firewire/fireworks/fireworks_stream.c
> > index 968a40a..425db8d 100644
> > --- a/sound/firewire/fireworks/fireworks_stream.c
> > +++ b/sound/firewire/fireworks/fireworks_stream.c
> > @@ -313,12 +313,10 @@ void snd_efw_stream_stop_duplex(struct snd_efw *efw)
> >
> > void snd_efw_stream_update_duplex(struct snd_efw *efw)
> > {
> > - if ((cmp_connection_update(&efw->out_conn) < 0) ||
> > - (cmp_connection_update(&efw->in_conn) < 0)) {
> > - mutex_lock(&efw->mutex);
> > + if (cmp_connection_update(&efw->out_conn) < 0 ||
> > + cmp_connection_update(&efw->in_conn) < 0) {
> > stop_stream(efw, &efw->rx_stream);
> > stop_stream(efw, &efw->tx_stream);
> > - mutex_unlock(&efw->mutex);
> > } else {
> > amdtp_stream_update(&efw->rx_stream);
> > amdtp_stream_update(&efw->tx_stream);
>
> Regards
>
> Takashi Sakamoto
>
More information about the Alsa-devel
mailing list