diff options
author | millerliang <millerliang@google.com> | 2023-08-10 19:37:21 +0800 |
---|---|---|
committer | Miller Liang <millerliang@google.com> | 2023-08-11 02:00:28 +0000 |
commit | 88d2aee3ebaee9f71daa00165df87ab165630e9d (patch) | |
tree | 1e785e23eaaf9e8dcafb79cf888fb1ca075d19ab | |
parent | a482a8b806f0b264adb96ba6f671df50b60b2c0f (diff) | |
download | aoc-88d2aee3ebaee9f71daa00165df87ab165630e9d.tar.gz |
alsa: set the workqueue to null after destroying itandroid-u-qpr1-beta-2_r0.7android-u-qpr1-beta-2_r0.5android-u-qpr1-beta-2_r0.4android-u-qpr1-beta-2_r0.3android-u-qpr1-beta-2_r0.2android-u-qpr1-beta-2_r0.1android-u-qpr1-beta-1_r0.7android-u-qpr1-beta-1_r0.5android-u-qpr1-beta-1_r0.4android-u-qpr1-beta-1_r0.3android-u-qpr1-beta-1_r0.2android-u-qpr1-beta-1_r0.1
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 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); |