[alsa-devel] [PATCH] alsa-lib:Make snd_atomic_write_* truly atomic
Ricard Wanderlof
ricard.wanderlof at axis.com
Tue May 17 14:11:43 CEST 2016
On Fri, 13 May 2016, Takashi Iwai wrote:
> > > Yeah, that's why I stated the primary question. The atomic operation
> > > there is mostly cosmetic, not really helpful. In the whole other
> > > operation, we don't guarantee the thread safety at all. So,
> > > implementing the atomic op only in a very small part of the whole code
> > > appears like a superfluous optimization to me.
> >
> > The question is, if we decide to remove this atomic stuff, how do we
> > verify that it actually causes no problems, on all architectures, etc?
>
> It's not what one can show in 100%, as you know. And, it's the reason
> why the code is still left over years...
We have come up upon this problem in conjunction with GStreamer. It
appears that GStreamer uses one thread for the streaming and a separate
one for the device management (open/close) on the same device handle,
which triggers the problem. So it appears that GStreamer falsly is
assuming some form of thread safety here.
The atomic stuff is so specific to a couple of files, it seems as if it
was added for a specific purpose, such as this particular case. In the
other hand, looking at the git history of include/iatomic.h, it's gone
through a number of cleanups over the years, lately mostly to remove
originally buggy code, and what is remaining I guess like you say is just
what nobody dared remove.
On the other hand, as the code stands, I can't really understand how it
enforces atomicity. The read and write memory barriers just guarantee
ordering, but there's nothing to stop a context switch from occurring in
the middle of a ++ operation. wmb() and rmb() might influence timing
though so that code at least might behave differently with those
operations in place.
> IMO, we just need to make a clear statement about the thread safety of
> alsa-lib. For a single threaded op, it can't give any regression, of
> course.
Just removing the memory barriers should have absolutely no effect in the
single threaded case I would have thought, especially since there are no
I/O or other hardware related things (such as DMA descriptors) being poked
at.
/Ricard
--
Ricard Wolf Wanderlöf ricardw(at)axis.com
Axis Communications AB, Lund, Sweden www.axis.com
Phone +46 46 272 2016 Fax +46 46 13 61 30
More information about the Alsa-devel
mailing list