[alsa-devel] [PATCH] OMAP: McBSP: Do not use extensive spin locks for dma_op_mode
Eero Nurkkala
ext-eero.nurkkala at nokia.com
Wed Oct 28 07:53:34 CET 2009
On Wed, 2009-10-28 at 06:52 +0100, Ujfalusi Peter (Nokia-D/Tampere)
wrote:
> On Tuesday 27 October 2009 16:00:00 ext Jarkko Nikula wrote:
> > On Tue, 27 Oct 2009 13:07:23 +0200
> >
> > Eero Nurkkala <ext-eero.nurkkala at nokia.com> wrote:
> > > Otherwise, that spinlocking is highly unnecessary and things are
> > > far better without than with it. The only case it could be useful
> > > is in SMPs, but OMAPs are not such quite yet - and when they
> > > are, things will need to be re-though anyway.
> >
> > Following commit is suggesting that mcbsp code *must* be SMP safe
> > already now:
> >
> > commit a5b92cc348299c20be215b9f4b50853ecfbf3864
> > Author: Syed Rafiuddin <rafiuddin.syed at ti.com>
> > Date: Tue Jul 28 18:57:10 2009 +0530
> >
> > ARM: OMAP4: Add McBSP support
>
> Yeah, but I think this locking issue has nothing to do with SMP safe or not.
> On playback start in omap_mcbsp_request the mcbsp->free is cleared.
> Further modification to the dma_op_mode in dma_op_mode_store is not allowed if
> the mcbsp port is in use, thus the dma_op_mode is protected against change while
> the port is in use (ensuring that the mode is same in omap34xx_mcbsp_request and
> omap_mcbsp_get_dma_op_mode functions). This alone makes the use of spinlock
> around the dma_op_mode unnecessary.
>
Yeah, maybe I took the SMP safeness into play without looking any code,
my bad =) I was remembering a different version of this McBSP thing, now
that I looked into it, it looked different.
Right, I reviewed the code, and it was first looking really bad at
sound/soc/omap/omap-mcbsp.c, where it calls omap_mcbsp_get_dma_op_mode()
from different places. However, it's not an issue because in:
arch/arm/plat-omap/mcbsp.c : dma_op_mode_store(),
the dma_op_mode is written only if the mcbsp is unoccupied. So it is SMP
safe.
..and a single read is always atomic, so this is buggy code:
301 spin_lock_irq(&mcbsp->lock);
302 dma_op_mode = mcbsp->dma_op_mode;
303 spin_unlock_irq(&mcbsp->lock);
304
305 return dma_op_mode;
The spinlocks are unnecessary. In the above example, you get the same
with just "return mcbsp->dma_op_mode;"
-> Peter's patch is a good cleanup.
More information about the Alsa-devel
mailing list