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@xxxxxxxxxxxxx> > > --- > > 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 > _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx http://mailman.alsa-project.org/mailman/listinfo/alsa-devel