Blob Blame History Raw
From a7588c896b05444929ecb3d0115481988720abf6 Mon Sep 17 00:00:00 2001
From: Takashi Iwai <tiwai@suse.de>
Date: Wed, 27 Mar 2019 16:56:08 +0100
Subject: [PATCH] ALSA: timer: Check ack_list emptiness instead of bit flag
Git-commit: a7588c896b05444929ecb3d0115481988720abf6
Patch-mainline: v5.2-rc1
References: bsc#1051510

For checking the pending timer instance that is still left on the
timer object that is being closed, we set/clear a bit flag
SNDRV_TIMER_IFLG_CALLBACK around the call of callbacks.  This can be
simplified by replace with the list_empty() call for ti->ack_list.
This covers the existence more comprehensively and safely.

A gratis bonus is that we can get rid of SNDRV_TIMER_IFLG_CALLBACK bit
flag definition as well.

Signed-off-by: Takashi Iwai <tiwai@suse.de>

---
 include/sound/timer.h |  1 -
 sound/core/timer.c    | 10 ++++------
 2 files changed, 4 insertions(+), 7 deletions(-)

diff --git a/include/sound/timer.h b/include/sound/timer.h
index 7ae226ab6990..bcfee20ea226 100644
--- a/include/sound/timer.h
+++ b/include/sound/timer.h
@@ -43,7 +43,6 @@
 #define SNDRV_TIMER_IFLG_START	  0x00000004
 #define SNDRV_TIMER_IFLG_AUTO	  0x00000008	/* auto restart */
 #define SNDRV_TIMER_IFLG_FAST	  0x00000010	/* fast callback (do not use tasklet) */
-#define SNDRV_TIMER_IFLG_CALLBACK 0x00000020	/* timer callback is active */
 #define SNDRV_TIMER_IFLG_EXCLUSIVE 0x00000040	/* exclusive owner - no more instances */
 #define SNDRV_TIMER_IFLG_EARLY_EVENT 0x00000080	/* write early event to the poll queue */
 
diff --git a/sound/core/timer.c b/sound/core/timer.c
index 107d8ebeeb2e..e343de0e4f9e 100644
--- a/sound/core/timer.c
+++ b/sound/core/timer.c
@@ -366,7 +366,7 @@ static int snd_timer_close_locked(struct snd_timer_instance *timeri)
 		timer->num_instances--;
 		/* wait, until the active callback is finished */
 		spin_lock_irq(&timer->lock);
-		while (timeri->flags & SNDRV_TIMER_IFLG_CALLBACK) {
+		while (!list_empty(&timeri->ack_list)) {
 			spin_unlock_irq(&timer->lock);
 			udelay(10);
 			spin_lock_irq(&timer->lock);
@@ -731,19 +731,17 @@ static void snd_timer_process_callbacks(struct snd_timer *timer,
 		ti = list_first_entry(head, struct snd_timer_instance,
 				      ack_list);
 
-		/* remove from ack_list and make empty */
-		list_del_init(&ti->ack_list);
-
 		ticks = ti->pticks;
 		ti->pticks = 0;
 		resolution = ti->resolution;
 
-		ti->flags |= SNDRV_TIMER_IFLG_CALLBACK;
 		spin_unlock(&timer->lock);
 		if (ti->callback)
 			ti->callback(ti, resolution, ticks);
 		spin_lock(&timer->lock);
-		ti->flags &= ~SNDRV_TIMER_IFLG_CALLBACK;
+
+		/* remove from ack_list and make empty */
+		list_del_init(&ti->ack_list);
 	}
 }
 
-- 
2.16.4