diff options
| -rw-r--r-- | sound/core/pcm_native.c | 25 | 
1 files changed, 15 insertions, 10 deletions
| diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c index 1eab940fa2e5..68bee40c9ada 100644 --- a/sound/core/pcm_native.c +++ b/sound/core/pcm_native.c @@ -84,19 +84,24 @@ void snd_pcm_group_init(struct snd_pcm_group *group)  }  /* define group lock helpers */ -#define DEFINE_PCM_GROUP_LOCK(action, mutex_action) \ +#define DEFINE_PCM_GROUP_LOCK(action, bh_lock, bh_unlock, mutex_action) \  static void snd_pcm_group_ ## action(struct snd_pcm_group *group, bool nonatomic) \  { \ -	if (nonatomic) \ +	if (nonatomic) { \  		mutex_ ## mutex_action(&group->mutex); \ -	else \ -		spin_ ## action(&group->lock); \ -} - -DEFINE_PCM_GROUP_LOCK(lock, lock); -DEFINE_PCM_GROUP_LOCK(unlock, unlock); -DEFINE_PCM_GROUP_LOCK(lock_irq, lock); -DEFINE_PCM_GROUP_LOCK(unlock_irq, unlock); +	} else { \ +		if (IS_ENABLED(CONFIG_PREEMPT_RT) && bh_lock)   \ +			local_bh_disable();			\ +		spin_ ## action(&group->lock);			\ +		if (IS_ENABLED(CONFIG_PREEMPT_RT) && bh_unlock) \ +			local_bh_enable();                      \ +	}							\ +} + +DEFINE_PCM_GROUP_LOCK(lock, false, false, lock); +DEFINE_PCM_GROUP_LOCK(unlock, false, false, unlock); +DEFINE_PCM_GROUP_LOCK(lock_irq, true, false, lock); +DEFINE_PCM_GROUP_LOCK(unlock_irq, false, true, unlock);  /**   * snd_pcm_stream_lock - Lock the PCM stream | 
