summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormillerliang <millerliang@google.com>2023-08-10 19:37:21 +0800
committerMiller Liang <millerliang@google.com>2023-08-11 02:00:28 +0000
commit88d2aee3ebaee9f71daa00165df87ab165630e9d (patch)
tree1e785e23eaaf9e8dcafb79cf888fb1ca075d19ab
parenta482a8b806f0b264adb96ba6f671df50b60b2c0f (diff)
downloadaoc-88d2aee3ebaee9f71daa00165df87ab165630e9d.tar.gz
In mmap playback, it would destory the workqueue during AoC SSR. Set the workqueue to null after destroying it to avoid acesss after freed in pcm close. Bug: 295074657 Change-Id: I258f124b3e8daaf9f160ec960f5ec86fd8f6227c Signed-off-by: millerliang <millerliang@google.com>
-rw-r--r--alsa/aoc_alsa_incall.c5
-rw-r--r--alsa/aoc_alsa_pcm.c5
-rw-r--r--alsa/aoc_alsa_voip.c5
3 files changed, 12 insertions, 3 deletions
diff --git a/alsa/aoc_alsa_incall.c b/alsa/aoc_alsa_incall.c
index 4ee2139..56a1ac7 100644
--- a/alsa/aoc_alsa_incall.c
+++ b/alsa/aoc_alsa_incall.c
@@ -87,7 +87,8 @@ static enum hrtimer_restart aoc_incall_hifi_irq_process(struct aoc_alsa_stream *
}
/* Do not queue a work if the cancel_work is active */
- if (atomic_read(&alsa_stream->cancel_work_active) > 0)
+ if (atomic_read(&alsa_stream->cancel_work_active) > 0
+ || alsa_stream->incall_period_wq == NULL)
return HRTIMER_RESTART;
if (!queue_work(alsa_stream->incall_period_wq, &alsa_stream->pcm_period_work)) {
@@ -249,6 +250,7 @@ out:
if (alsa_stream->incall_period_wq) {
flush_workqueue(alsa_stream->incall_period_wq);
destroy_workqueue(alsa_stream->incall_period_wq);
+ alsa_stream->incall_period_wq = NULL;
}
kfree(alsa_stream);
}
@@ -280,6 +282,7 @@ static int snd_aoc_pcm_close(struct snd_soc_component *component,
if (alsa_stream->incall_period_wq) {
flush_workqueue(alsa_stream->incall_period_wq);
destroy_workqueue(alsa_stream->incall_period_wq);
+ alsa_stream->incall_period_wq = NULL;
}
atomic_set(&alsa_stream->cancel_work_active, 0);
diff --git a/alsa/aoc_alsa_pcm.c b/alsa/aoc_alsa_pcm.c
index 4005fff..157d265 100644
--- a/alsa/aoc_alsa_pcm.c
+++ b/alsa/aoc_alsa_pcm.c
@@ -38,6 +38,7 @@ static void free_aoc_service_work_handler(struct work_struct *work)
if (alsa_stream->pcm_period_wq) {
flush_workqueue(alsa_stream->pcm_period_wq);
destroy_workqueue(alsa_stream->pcm_period_wq);
+ alsa_stream->pcm_period_wq = NULL;
}
atomic_set(&alsa_stream->cancel_work_active, 0);
@@ -207,7 +208,7 @@ static enum hrtimer_restart aoc_pcm_irq_process(struct aoc_alsa_stream *alsa_str
}
/* Do not queue a work if the cancel_work is active */
- if (atomic_read(&alsa_stream->cancel_work_active) > 0)
+ if (atomic_read(&alsa_stream->cancel_work_active) > 0 || alsa_stream->pcm_period_wq == NULL)
return HRTIMER_RESTART;
if (!queue_work(alsa_stream->pcm_period_wq, &alsa_stream->pcm_period_work)) {
@@ -386,6 +387,7 @@ out:
if (alsa_stream->pcm_period_wq) {
flush_workqueue(alsa_stream->pcm_period_wq);
destroy_workqueue(alsa_stream->pcm_period_wq);
+ alsa_stream->pcm_period_wq = NULL;
}
kfree(alsa_stream);
}
@@ -411,6 +413,7 @@ static int snd_aoc_pcm_close(struct snd_soc_component *component,
if (alsa_stream->pcm_period_wq) {
flush_workqueue(alsa_stream->pcm_period_wq);
destroy_workqueue(alsa_stream->pcm_period_wq);
+ alsa_stream->pcm_period_wq = NULL;
}
atomic_set(&alsa_stream->cancel_work_active, 0);
diff --git a/alsa/aoc_alsa_voip.c b/alsa/aoc_alsa_voip.c
index a1cf17a..f6200dd 100644
--- a/alsa/aoc_alsa_voip.c
+++ b/alsa/aoc_alsa_voip.c
@@ -86,7 +86,8 @@ static enum hrtimer_restart aoc_voip_irq_process(struct aoc_alsa_stream *alsa_st
}
/* Do not queue a work if the cancel_work is active */
- if (atomic_read(&alsa_stream->cancel_work_active) > 0)
+ if (atomic_read(&alsa_stream->cancel_work_active) > 0
+ || alsa_stream->voip_period_wq == NULL)
return HRTIMER_RESTART;
if (!queue_work(alsa_stream->voip_period_wq, &alsa_stream->pcm_period_work)) {
@@ -245,6 +246,7 @@ out:
if (alsa_stream->voip_period_wq) {
flush_workqueue(alsa_stream->voip_period_wq);
destroy_workqueue(alsa_stream->voip_period_wq);
+ alsa_stream->voip_period_wq = NULL;
}
kfree(alsa_stream);
}
@@ -276,6 +278,7 @@ static int snd_aoc_pcm_close(struct snd_soc_component *component,
if (alsa_stream->voip_period_wq) {
flush_workqueue(alsa_stream->voip_period_wq);
destroy_workqueue(alsa_stream->voip_period_wq);
+ alsa_stream->voip_period_wq = NULL;
}
atomic_set(&alsa_stream->cancel_work_active, 0);