Split the wait for component binding from i915 in multiples of sysctl_hung_task_timeout_secs. This helps to avoid the possible kworker thread hung detection given below. <3>[ 60.946316] INFO: task kworker/11:1:104 blocked for more than 30 seconds. <3>[ 60.946479] Tainted: G W 5.17.0-rc5-CI-CI_DRM_11265+ #1 <3>[ 60.946580] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. <6>[ 60.946688] task:kworker/11:1 state:D stack:14192 pid: 104 ppid: 2 flags:0x00004000 <6>[ 60.946713] Workqueue: events azx_probe_work [snd_hda_intel] <6>[ 60.946740] Call Trace: <6>[ 60.946745] <TASK> <6>[ 60.946763] __schedule+0x42c/0xa80 <6>[ 60.946797] schedule+0x3f/0xc0 <6>[ 60.946811] schedule_timeout+0x1be/0x2e0 <6>[ 60.946829] ? del_timer_sync+0xb0/0xb0 <6>[ 60.946849] ? 0xffffffff81000000 <6>[ 60.946864] ? wait_for_completion_timeout+0x79/0x120 <6>[ 60.946879] wait_for_completion_timeout+0xab/0x120 <6>[ 60.946906] snd_hdac_i915_init+0xa5/0xb0 [snd_hda_core] <6>[ 60.946943] azx_probe_work+0x71/0x84c [snd_hda_intel] <6>[ 60.946974] process_one_work+0x275/0x5c0 <6>[ 60.947010] worker_thread+0x37/0x370 <6>[ 60.947028] ? process_one_work+0x5c0/0x5c0 <6>[ 60.947038] kthread+0xef/0x120 <6>[ 60.947047] ? kthread_complete_and_exit+0x20/0x20 <6>[ 60.947065] ret_from_fork+0x22/0x30 <6>[ 60.947110] </TASK> Signed-off-by: Ramalingam C <ramalingam.c@xxxxxxxxx> cc: Kai Vehmanen <kai.vehmanen@xxxxxxxxx> cc: Lucas De Marchi <lucas.demarchi@xxxxxxxxx> --- sound/hda/hdac_i915.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/sound/hda/hdac_i915.c b/sound/hda/hdac_i915.c index d20a450a9a15..daaeebc5099e 100644 --- a/sound/hda/hdac_i915.c +++ b/sound/hda/hdac_i915.c @@ -6,6 +6,7 @@ #include <linux/init.h> #include <linux/module.h> #include <linux/pci.h> +#include <linux/sched/sysctl.h> #include <sound/core.h> #include <sound/hdaudio.h> #include <sound/hda_i915.h> @@ -163,7 +164,8 @@ static bool dg1_gfx_present(void) int snd_hdac_i915_init(struct hdac_bus *bus) { struct drm_audio_component *acomp; - int err; + unsigned long timeout, ret = 0; + int err, i, itr_cnt; if (!i915_gfx_present()) return -ENODEV; @@ -182,9 +184,18 @@ int snd_hdac_i915_init(struct hdac_bus *bus) if (!acomp->ops) { if (!IS_ENABLED(CONFIG_MODULES) || !request_module("i915")) { + if (!sysctl_hung_task_timeout_secs) { + itr_cnt = 1; + timeout = msecs_to_jiffies(60 * 1000); + } else { + itr_cnt = DIV_ROUND_UP(60, sysctl_hung_task_timeout_secs); + timeout = msecs_to_jiffies(sysctl_hung_task_timeout_secs * 1000); + } + /* 60s timeout */ - wait_for_completion_timeout(&acomp->master_bind_complete, - msecs_to_jiffies(30 * 1000)); + for (i = 0; i < itr_cnt || !ret; i++) + ret = wait_for_completion_timeout(&acomp->master_bind_complete, + timeout); } } if (!acomp->ops) { -- 2.20.1