diff options
author | millerliang <millerliang@google.com> | 2023-08-10 19:37:21 +0800 |
---|---|---|
committer | millerliang <millerliang@google.com> | 2023-08-11 09:57:52 +0800 |
commit | 46f490f4c6f450cdf6bbb3a9489c2bfacd6268ac (patch) | |
tree | 51c149a95a4ead96d30a02af7cb6ba9d8da9c69a | |
parent | 669cf068795b1c5196eb8bf08b9564bcb98c9c8a (diff) | |
download | aoc-main-16k-gs-shusky-5.15.tar.gz |
alsa: set the workqueue to null after destroying itandroid-14.0.0_r0.8android-14.0.0_r0.18main-16k-gs-shusky-5.15android-gs-shusky-udc-d1android-gs-shusky-5.15-android14-d1
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.c | 5 | ||||
-rw-r--r-- | alsa/aoc_alsa_pcm.c | 5 | ||||
-rw-r--r-- | alsa/aoc_alsa_voip.c | 5 |
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); |