[PATCH 2/2] hda/i915: split the wait for the component binding
Lucas De Marchi
lucas.demarchi at intel.com
Thu Feb 24 17:13:57 UTC 2022
On Thu, Feb 24, 2022 at 01:22:03AM +0530, Ramalingam C wrote:
>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 at intel.com>
>cc: Kai Vehmanen <kai.vehmanen at intel.com>
>cc: Lucas De Marchi <lucas.demarchi at intel.com>
some more Cc needed?
$ ./scripts/get_maintainer.pl sound/hda/hdac_i915.c
Jaroslav Kysela <perex at perex.cz> (maintainer:SOUND)
Takashi Iwai <tiwai at suse.com> (maintainer:SOUND)
Lucas De Marchi <lucas.demarchi at intel.com> (commit_signer:2/2=100%)
Rodrigo Vivi <rodrigo.vivi at intel.com> (commit_signer:1/2=50%)
Ramalingam C <ramalingam.c at intel.com> (commit_signer:1/2=50%,authored:1/2=50%,removed_lines:1/1=100%)
Chris Wilson <chris at chris-wilson.co.uk> (authored:1/2=50%,added_lines:23/24=96%)
alsa-devel at alsa-project.org (moderated list:SOUND)
linux-kernel at vger.kernel.org (open list)
>---
> 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++)
it will return 0 if a timeout occurs so it's trapped forever here? Did
you mean &&?
Also maybe:
itr_cnt = DIV_ROUND_UP(60, sysctl_hung_task_timeout_secs ?: 60);
Lucas De Marchi
} while ();
>+ ret = wait_for_completion_timeout(&acomp->master_bind_complete,
>+ timeout);
> }
> }
> if (!acomp->ops) {
>--
>2.20.1
>
More information about the dri-devel
mailing list