Patch "ASoC: rsnd: ssi: fix race condition in rsnd_ssi_pointer_update" has been added to the 4.14-stable tree
Subsystems (4)
This is a note to let you know that I've just added the patch titled
ASoC: rsnd: ssi: fix race condition in rsnd_ssi_pointer_update
to the 4.14-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
asoc-rsnd-ssi-fix-race-condition-in-rsnd_ssi_pointer_update.patch
and it can be found in the queue-4.14 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From foo@baz Fri Feb 23 11:45:09 CET 2018
From: Jiada Wang <[email protected]>
Date: Thu, 7 Dec 2017 22:15:38 -0800
Subject: ASoC: rsnd: ssi: fix race condition in rsnd_ssi_pointer_update
From: Jiada Wang <[email protected]>
[ Upstream commit 33f801366bdf3f8b67dfe325b84f4051a090d01e ]
Currently there is race condition between set of byte_pos and wrap it around when new buffer starts. If .pointer is called in-between it will result in inconsistent pointer position be returned from .pointer callback.
This patch increments buffer pointer atomically to avoid this issue.
--- sound/soc/sh/rcar/ssi.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-)
sound/soc/sh/rcar/ssi.c +10 -6
@@ -449,25 +449,29 @@ static bool rsnd_ssi_pointer_update(stru int byte) {struct rsnd_ssi *ssi =rsnd_mod_to_ssi (mod); +bool ret = false; +int byte_pos; - ssi->byte_pos += byte; + byte_pos = ssi->byte_pos + byte; -if (ssi->byte_pos >= ssi->next_period_byte) { +if (byte_pos >= ssi->next_period_byte) {struct snd_pcm_runtime *runtime =rsnd_io_to_runtime (io); ssi->period_pos++; ssi->next_period_byte += ssi->byte_per_period;if (ssi->period_pos >= runtime->periods) { - ssi->byte_pos =0 ; + byte_pos =0 ; ssi->period_pos =0 ; ssi->next_period_byte = ssi->byte_per_period; } -return true; + ret = true; } -return false; +WRITE_ONCE (ssi->byte_pos, byte_pos); + +return ret; }/*
@@ -838,7 +842,7 @@ static int rsnd_ssi_pointer(struct rsnd_struct rsnd_ssi *ssi =rsnd_mod_to_ssi (mod);struct snd_pcm_runtime *runtime =rsnd_io_to_runtime (io); - *pointer =bytes_to_frames (runtime, ssi->byte_pos); + *pointer =bytes_to_frames (runtime,READ_ONCE (ssi->byte_pos));return 0 ; }
Patches currently in stable-queue which might be from [email protected] are
queue-4.14/asoc-rsnd-ssi-fix-race-condition-in-rsnd_ssi_pointer_update.patch