[alsa-devel] [PATCH] ASoC: sst_platform: Fix lock acquring

Lu Guanqun guanqun.lu at intel.com
Fri Apr 8 09:40:42 CEST 2011


On Fri, Apr 08, 2011 at 03:38:48PM +0800, Lu Guanqun wrote:
> Fix the possible dead lock shown below:
> 
> spin_lock
> sst_get_stream_status
> sst_period_elapsed
> intel_sst_interrupt
> handle_IRQ_event
> handle_fasteoi_irq
> do_IRQ
> common_interrupt
> spin_lock
> sst_set_stream_status
> sst_platform_pcm_trigger
> 
> Signed-off-by: Lu Guanqun <guanqun.lu at intel.com>

This patch is based on Mark Brown's for-2.6.40 branch. It should be
applied cleanly.

Thanks.

> ---
>  sound/soc/mid-x86/sst_platform.c |   10 ++++++----
>  1 files changed, 6 insertions(+), 4 deletions(-)
> 
> diff --git a/sound/soc/mid-x86/sst_platform.c b/sound/soc/mid-x86/sst_platform.c
> index 9ba9414..d827edb 100644
> --- a/sound/soc/mid-x86/sst_platform.c
> +++ b/sound/soc/mid-x86/sst_platform.c
> @@ -116,18 +116,20 @@ struct snd_soc_dai_driver sst_platform_dai[] = {
>  static inline void sst_set_stream_status(struct sst_runtime_stream *stream,
>  					int state)
>  {
> -	spin_lock(&stream->status_lock);
> +	unsigned long flags;
> +	spin_lock_irqsave(&stream->status_lock, flags);
>  	stream->stream_status = state;
> -	spin_unlock(&stream->status_lock);
> +	spin_unlock_irqrestore(&stream->status_lock, flags);
>  }
>  
>  static inline int sst_get_stream_status(struct sst_runtime_stream *stream)
>  {
>  	int state;
> +	unsigned long flags;
>  
> -	spin_lock(&stream->status_lock);
> +	spin_lock_irqsave(&stream->status_lock, flags);
>  	state = stream->stream_status;
> -	spin_unlock(&stream->status_lock);
> +	spin_unlock_irqrestore(&stream->status_lock, flags);
>  	return state;
>  }
>  
> 
> _______________________________________________
> Alsa-devel mailing list
> Alsa-devel at alsa-project.org
> http://mailman.alsa-project.org/mailman/listinfo/alsa-devel

-- 
guanqun


More information about the Alsa-devel mailing list