| From 16037643969e095509cd8446a3f8e406a6dc3a2c Mon Sep 17 00:00:00 2001 |
| From: Takashi Iwai <tiwai@suse.de> |
| Date: Thu, 30 Aug 2018 15:13:16 +0200 |
| Subject: ALSA: hda - Fix cancel_work_sync() stall from jackpoll work |
| |
| From: Takashi Iwai <tiwai@suse.de> |
| |
| commit 16037643969e095509cd8446a3f8e406a6dc3a2c upstream. |
| |
| On AMD/ATI controllers, the HD-audio controller driver allows a bus |
| reset upon the error recovery, and its procedure includes the |
| cancellation of pending jack polling work as found in |
| snd_hda_bus_codec_reset(). This works usually fine, but it becomes a |
| problem when the reset happens from the jack poll work itself; then |
| calling cancel_work_sync() from the work being processed tries to wait |
| the finish endlessly. |
| |
| As a workaround, this patch adds the check of current_work() and |
| applies the cancel_work_sync() only when it's not from the |
| jackpoll_work. |
| |
| This doesn't fix the root cause of the reported error below, but at |
| least, it eases the unexpected stall of the whole system. |
| |
| Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=200937 |
| Cc: <stable@vger.kernel.org> |
| Cc: Lukas Wunner <lukas@wunner.de> |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| sound/pci/hda/hda_codec.c | 3 ++- |
| 1 file changed, 2 insertions(+), 1 deletion(-) |
| |
| --- a/sound/pci/hda/hda_codec.c |
| +++ b/sound/pci/hda/hda_codec.c |
| @@ -3923,7 +3923,8 @@ void snd_hda_bus_reset_codecs(struct hda |
| |
| list_for_each_codec(codec, bus) { |
| /* FIXME: maybe a better way needed for forced reset */ |
| - cancel_delayed_work_sync(&codec->jackpoll_work); |
| + if (current_work() != &codec->jackpoll_work.work) |
| + cancel_delayed_work_sync(&codec->jackpoll_work); |
| #ifdef CONFIG_PM |
| if (hda_codec_is_power_on(codec)) { |
| hda_call_codec_suspend(codec); |