2024-02-28 07:42:28

by songxiebing

[permalink] [raw]
Subject: [PATCH v1] ALSA: hda: optimize the probe codec process

From: songxiebing <[email protected]>

In azx_probe_codecs function,when bus->codec_mask is becomes to 0(no codecs),
execute azx_init_chip, bus->codec_mask will be initialized to a value again,
this causes snd_hda_codec_new function to run, the process is as follows:
-->snd_hda_codec_new
-->snd_hda_codec_device_init
-->snd_hdac_device_init---snd_hdac_read_parm(...AC_PAR_VENDOR_ID) 2s
---snd_hdac_read_parm(...AC_PAR_VENDOR_ID) 2s
---snd_hdac_read_parm(...AC_PAR_SUBSYSTEM_ID) 2s
---snd_hdac_read_parm(...AC_PAR_REV_ID) 2s
---snd_hdac_read_parm(...AC_PAR_NODE_COUNT) 2s
when no codecs, read communication is error, each command will be polled for
2 second,a total of 10s, it is easy to some problem.
like this:
2 [ 14.833404][ 6] [ T164] hda 0006:00: Codec #0 probe error; disabling it...
3 [ 14.844178][ 6] [ T164] hda 0006:00: codec_mask = 0x1
4 [ 14.880532][ 6] [ T164] hda 0006:00: too slow response, last cmd=0x0f0000
5 [ 15.891988][ 6] [ T164] hda 0006:00: too slow response, last cmd=0x0f0000
6 [ 16.978090][ 6] [ T164] hda 0006:00: too slow response, last cmd=0x0f0001
7 [ 18.140895][ 6] [ T164] hda 0006:00: too slow response, last cmd=0x0f0002
8 [ 19.135516][ 6] [ T164] hda 0006:00: too slow response, last cmd=0x0f0004
10 [ 19.900086][ 6] [ T164] hda 0006:00: no codecs initialized
11 [ 45.573398][ 2] [ C2] watchdog: BUG: soft lockup - CPU#2 stuck for 22s! [kworker/2:0:25]

Here, when bus->codec_mask is 0, use a direct break to avoid execute snd_hda_codec_new function.

Signed-off-by: songxiebing <[email protected]>
---
sound/pci/hda/hda_controller.c | 3 +++
1 file changed, 3 insertions(+)

diff --git a/sound/pci/hda/hda_controller.c b/sound/pci/hda/hda_controller.c
index e5c53ad..e1ece0a 100644
--- a/sound/pci/hda/hda_controller.c
+++ b/sound/pci/hda/hda_controller.c
@@ -1474,6 +1474,9 @@ int azx_probe_codecs(struct azx *chip, unsigned int max_slots)
dev_warn(chip->card->dev,
"Codec #%d probe error; disabling it...\n", c);
bus->codec_mask &= ~(1 << c);
+ /* no codecs */
+ if (bus->codec_mask == 0)
+ break;
/* More badly, accessing to a non-existing
* codec often screws up the controller chip,
* and disturbs the further communications.
--
2.7.4



2024-02-28 08:22:02

by Takashi Iwai

[permalink] [raw]
Subject: Re: [PATCH v1] ALSA: hda: optimize the probe codec process

On Wed, 28 Feb 2024 08:41:38 +0100,
songxiebing wrote:
>
> From: songxiebing <[email protected]>
>
> In azx_probe_codecs function$B!$(Bwhen bus->codec_mask is becomes to 0(no codecs),
> execute azx_init_chip, bus->codec_mask will be initialized to a value again$B!$(B
> this causes snd_hda_codec_new function to run, the process is as follows:
> -->snd_hda_codec_new
> -->snd_hda_codec_device_init
> -->snd_hdac_device_init---snd_hdac_read_parm(...AC_PAR_VENDOR_ID) 2s
> ---snd_hdac_read_parm(...AC_PAR_VENDOR_ID) 2s
> ---snd_hdac_read_parm(...AC_PAR_SUBSYSTEM_ID) 2s
> ---snd_hdac_read_parm(...AC_PAR_REV_ID) 2s
> ---snd_hdac_read_parm(...AC_PAR_NODE_COUNT) 2s
> when no codecs, read communication is error, each command will be polled for
> 2 second$B!$(Ba total of 10s, it is easy to some problem.
> like this:
> 2 [ 14.833404][ 6] [ T164] hda 0006:00: Codec #0 probe error; disabling it...
> 3 [ 14.844178][ 6] [ T164] hda 0006:00: codec_mask = 0x1
> 4 [ 14.880532][ 6] [ T164] hda 0006:00: too slow response, last cmd=0x0f0000
> 5 [ 15.891988][ 6] [ T164] hda 0006:00: too slow response, last cmd=0x0f0000
> 6 [ 16.978090][ 6] [ T164] hda 0006:00: too slow response, last cmd=0x0f0001
> 7 [ 18.140895][ 6] [ T164] hda 0006:00: too slow response, last cmd=0x0f0002
> 8 [ 19.135516][ 6] [ T164] hda 0006:00: too slow response, last cmd=0x0f0004
> 10 [ 19.900086][ 6] [ T164] hda 0006:00: no codecs initialized
> 11 [ 45.573398][ 2] [ C2] watchdog: BUG: soft lockup - CPU#2 stuck for 22s! [kworker/2:0:25]
>
> Here, when bus->codec_mask is 0, use a direct break to avoid execute snd_hda_codec_new function.
>
> Signed-off-by: songxiebing <[email protected]>

Thanks for the patch. The code change looks OK, but you use both
ASCII and non-ASCII comma letters in the patch description.
Could you try to keep only ASCII letters?


Takashi

2024-03-01 01:20:46

by songxiebing

[permalink] [raw]
Subject: [PATCH v2] ALSA: hda: optimize the probe codec process

From: songxiebing <[email protected]>

In azx_probe_codecs function, when bus->codec_mask is becomes to 0(no codecs),
execute azx_init_chip, bus->codec_mask will be initialized to a value again,
this causes snd_hda_codec_new function to run, the process is as follows:
-->snd_hda_codec_new
-->snd_hda_codec_device_init
-->snd_hdac_device_init---snd_hdac_read_parm(...AC_PAR_VENDOR_ID) 2s
---snd_hdac_read_parm(...AC_PAR_VENDOR_ID) 2s
---snd_hdac_read_parm(...AC_PAR_SUBSYSTEM_ID) 2s
---snd_hdac_read_parm(...AC_PAR_REV_ID) 2s
---snd_hdac_read_parm(...AC_PAR_NODE_COUNT) 2s
when no codecs, read communication is error, each command will be polled for
2 second, a total of 10s, it is easy to some problem.
like this:
2 [ 14.833404][ 6] [ T164] hda 0006:00: Codec #0 probe error; disabling it...
3 [ 14.844178][ 6] [ T164] hda 0006:00: codec_mask = 0x1
4 [ 14.880532][ 6] [ T164] hda 0006:00: too slow response, last cmd=0x0f0000
5 [ 15.891988][ 6] [ T164] hda 0006:00: too slow response, last cmd=0x0f0000
6 [ 16.978090][ 6] [ T164] hda 0006:00: too slow response, last cmd=0x0f0001
7 [ 18.140895][ 6] [ T164] hda 0006:00: too slow response, last cmd=0x0f0002
8 [ 19.135516][ 6] [ T164] hda 0006:00: too slow response, last cmd=0x0f0004
10 [ 19.900086][ 6] [ T164] hda 0006:00: no codecs initialized
11 [ 45.573398][ 2] [ C2] watchdog: BUG: soft lockup - CPU#2 stuck for 22s! [kworker/2:0:25]

Here, when bus->codec_mask is 0, use a direct break to avoid execute snd_hda_codec_new function.

Signed-off-by: songxiebing <[email protected]>
---
Changes in v2: fix some non-ASCII comma letters.
---
sound/pci/hda/hda_controller.c | 3 +++
1 file changed, 3 insertions(+)

diff --git a/sound/pci/hda/hda_controller.c b/sound/pci/hda/hda_controller.c
index e5c53ad..e1ece0a 100644
--- a/sound/pci/hda/hda_controller.c
+++ b/sound/pci/hda/hda_controller.c
@@ -1474,6 +1474,9 @@ int azx_probe_codecs(struct azx *chip, unsigned int max_slots)
dev_warn(chip->card->dev,
"Codec #%d probe error; disabling it...\n", c);
bus->codec_mask &= ~(1 << c);
+ /* no codecs */
+ if (bus->codec_mask == 0)
+ break;
/* More badly, accessing to a non-existing
* codec often screws up the controller chip,
* and disturbs the further communications.
--
2.7.4


2024-03-01 10:47:56

by Takashi Iwai

[permalink] [raw]
Subject: Re: [PATCH v2] ALSA: hda: optimize the probe codec process

On Fri, 01 Mar 2024 02:18:41 +0100,
songxiebing wrote:
>
> From: songxiebing <[email protected]>
>
> In azx_probe_codecs function, when bus->codec_mask is becomes to 0(no codecs),
> execute azx_init_chip, bus->codec_mask will be initialized to a value again,
> this causes snd_hda_codec_new function to run, the process is as follows:
> -->snd_hda_codec_new
> -->snd_hda_codec_device_init
> -->snd_hdac_device_init---snd_hdac_read_parm(...AC_PAR_VENDOR_ID) 2s
> ---snd_hdac_read_parm(...AC_PAR_VENDOR_ID) 2s
> ---snd_hdac_read_parm(...AC_PAR_SUBSYSTEM_ID) 2s
> ---snd_hdac_read_parm(...AC_PAR_REV_ID) 2s
> ---snd_hdac_read_parm(...AC_PAR_NODE_COUNT) 2s
> when no codecs, read communication is error, each command will be polled for
> 2 second, a total of 10s, it is easy to some problem.
> like this:
> 2 [ 14.833404][ 6] [ T164] hda 0006:00: Codec #0 probe error; disabling it...
> 3 [ 14.844178][ 6] [ T164] hda 0006:00: codec_mask = 0x1
> 4 [ 14.880532][ 6] [ T164] hda 0006:00: too slow response, last cmd=0x0f0000
> 5 [ 15.891988][ 6] [ T164] hda 0006:00: too slow response, last cmd=0x0f0000
> 6 [ 16.978090][ 6] [ T164] hda 0006:00: too slow response, last cmd=0x0f0001
> 7 [ 18.140895][ 6] [ T164] hda 0006:00: too slow response, last cmd=0x0f0002
> 8 [ 19.135516][ 6] [ T164] hda 0006:00: too slow response, last cmd=0x0f0004
> 10 [ 19.900086][ 6] [ T164] hda 0006:00: no codecs initialized
> 11 [ 45.573398][ 2] [ C2] watchdog: BUG: soft lockup - CPU#2 stuck for 22s! [kworker/2:0:25]
>
> Here, when bus->codec_mask is 0, use a direct break to avoid execute snd_hda_codec_new function.
>
> Signed-off-by: songxiebing <[email protected]>
> ---
> Changes in v2: fix some non-ASCII comma letters.

Thanks, applied now.


Takashi