summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormillerliang <millerliang@google.com>2023-08-10 19:37:21 +0800
committermillerliang <millerliang@google.com>2023-08-11 09:57:52 +0800
commit46f490f4c6f450cdf6bbb3a9489c2bfacd6268ac (patch)
tree51c149a95a4ead96d30a02af7cb6ba9d8da9c69a
parent669cf068795b1c5196eb8bf08b9564bcb98c9c8a (diff)
downloadaoc-main-16k-gs-shusky-5.15.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 b3cd480..93ed7dd 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);
@@ -211,7 +212,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)) {
@@ -390,6 +391,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);
}
@@ -415,6 +417,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);