[PATCH AUTOSEL for 4.4 001/162] ALSA: timer: Wrap with spinlock for queue access

2018-04-08 Thread Sasha Levin
From: Takashi Iwai 

[ Upstream commit d7f910bfedd863d13ea320030fe98e42d0938ed5 ]

For accessing the snd_timer_user queue indices, we take tu->qlock.
But it's forgotten in a couple of places.

The one in snd_timer_user_params() should be safe without the
spinlock as the timer is already stopped.  But it's better for
consistency.

The one in poll is just a read-out, so it's not inevitably needed, but
it'd be good to make the result consistent, too.

Tested-by: Alexander Potapenko 
Signed-off-by: Takashi Iwai 
Signed-off-by: Sasha Levin 
---
 sound/core/timer.c | 4 
 1 file changed, 4 insertions(+)

diff --git a/sound/core/timer.c b/sound/core/timer.c
index 48eaccba82a3..fd622aa0bb93 100644
--- a/sound/core/timer.c
+++ b/sound/core/timer.c
@@ -1771,6 +1771,7 @@ static int snd_timer_user_params(struct file *file,
}
}
}
+   spin_lock_irq(>qlock);
tu->qhead = tu->qtail = tu->qused = 0;
if (tu->timeri->flags & SNDRV_TIMER_IFLG_EARLY_EVENT) {
if (tu->tread) {
@@ -1791,6 +1792,7 @@ static int snd_timer_user_params(struct file *file,
}
tu->filter = params.filter;
tu->ticks = params.ticks;
+   spin_unlock_irq(>qlock);
err = 0;
  _end:
if (copy_to_user(_params, , sizeof(params)))
@@ -2029,10 +2031,12 @@ static unsigned int snd_timer_user_poll(struct file 
*file, poll_table * wait)
 poll_wait(file, >qchange_sleep, wait);
 
mask = 0;
+   spin_lock_irq(>qlock);
if (tu->qused)
mask |= POLLIN | POLLRDNORM;
if (tu->disconnected)
mask |= POLLERR;
+   spin_unlock_irq(>qlock);
 
return mask;
 }
-- 
2.15.1


[PATCH AUTOSEL for 4.4 001/162] ALSA: timer: Wrap with spinlock for queue access

2018-04-08 Thread Sasha Levin
From: Takashi Iwai 

[ Upstream commit d7f910bfedd863d13ea320030fe98e42d0938ed5 ]

For accessing the snd_timer_user queue indices, we take tu->qlock.
But it's forgotten in a couple of places.

The one in snd_timer_user_params() should be safe without the
spinlock as the timer is already stopped.  But it's better for
consistency.

The one in poll is just a read-out, so it's not inevitably needed, but
it'd be good to make the result consistent, too.

Tested-by: Alexander Potapenko 
Signed-off-by: Takashi Iwai 
Signed-off-by: Sasha Levin 
---
 sound/core/timer.c | 4 
 1 file changed, 4 insertions(+)

diff --git a/sound/core/timer.c b/sound/core/timer.c
index 48eaccba82a3..fd622aa0bb93 100644
--- a/sound/core/timer.c
+++ b/sound/core/timer.c
@@ -1771,6 +1771,7 @@ static int snd_timer_user_params(struct file *file,
}
}
}
+   spin_lock_irq(>qlock);
tu->qhead = tu->qtail = tu->qused = 0;
if (tu->timeri->flags & SNDRV_TIMER_IFLG_EARLY_EVENT) {
if (tu->tread) {
@@ -1791,6 +1792,7 @@ static int snd_timer_user_params(struct file *file,
}
tu->filter = params.filter;
tu->ticks = params.ticks;
+   spin_unlock_irq(>qlock);
err = 0;
  _end:
if (copy_to_user(_params, , sizeof(params)))
@@ -2029,10 +2031,12 @@ static unsigned int snd_timer_user_poll(struct file 
*file, poll_table * wait)
 poll_wait(file, >qchange_sleep, wait);
 
mask = 0;
+   spin_lock_irq(>qlock);
if (tu->qused)
mask |= POLLIN | POLLRDNORM;
if (tu->disconnected)
mask |= POLLERR;
+   spin_unlock_irq(>qlock);
 
return mask;
 }
-- 
2.15.1