ALSA: hda - Fix cancel_work_sync() stall from jackpoll work
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>
This commit is contained in:
Родитель
5b394b2ddf
Коммит
1603764396
|
@ -3935,7 +3935,8 @@ void snd_hda_bus_reset_codecs(struct hda_bus *bus)
|
||||||
|
|
||||||
list_for_each_codec(codec, bus) {
|
list_for_each_codec(codec, bus) {
|
||||||
/* FIXME: maybe a better way needed for forced reset */
|
/* 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
|
#ifdef CONFIG_PM
|
||||||
if (hda_codec_is_power_on(codec)) {
|
if (hda_codec_is_power_on(codec)) {
|
||||||
hda_call_codec_suspend(codec);
|
hda_call_codec_suspend(codec);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче