[alsa-devel] [PATCH] ALSA: HDA: Lessen CPU usage when waiting for chip to respond

Takashi Iwai tiwai at suse.de
Tue May 8 12:53:45 CEST 2012


At Fri,  4 May 2012 11:05:55 +0200,
David Henningsson wrote:
> 
> When an IRQ for some reason gets lost, we wait up to a second using
> udelay, which is CPU intensive. This patch improves the situation by
> waiting about 30 ms in the CPU intensive mode, then stepping down to
> using msleep(2) instead. In essence, we trade some granularity in
> exchange for less CPU consumption when the waiting time is a bit longer.
> 
> As a result, PulseAudio should no longer be killed by the kernel
> for taking up to much RT-prio CPU time. At least not for *this* reason.
> 
> Signed-off-by: David Henningsson <david.henningsson at canonical.com>
> ---
>  sound/pci/hda/hda_intel.c |    6 ++++--
>  1 file changed, 4 insertions(+), 2 deletions(-)
> 
> Hi Arun,
> 
> Can you check if this patch resolves your problem with PulseAudio getting
> killed by the kernel? If so, we should apply it to the kernel, perhaps even
> to stable.

The patch looks good to me.  I'm going to apply it for 3.4 kernel
tree (with Cc to stable, too) if it's confirmed to improve actually.
Even if not, it's still good to apply, but this kind of change is a
3.5 kernel material.

So, Arun, please let me know whether it works for you.


thanks,

Takashi

> 
> // David
> 
> 
> diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
> index 7b6a823..0e7c3f1 100644
> --- a/sound/pci/hda/hda_intel.c
> +++ b/sound/pci/hda/hda_intel.c
> @@ -783,11 +783,13 @@ static unsigned int azx_rirb_get_response(struct hda_bus *bus,
>  {
>  	struct azx *chip = bus->private_data;
>  	unsigned long timeout;
> +	unsigned long loopcounter;
>  	int do_poll = 0;
>  
>   again:
>  	timeout = jiffies + msecs_to_jiffies(1000);
> -	for (;;) {
> +	
> +	for (loopcounter = 0;; loopcounter++) {
>  		if (chip->polling_mode || do_poll) {
>  			spin_lock_irq(&chip->reg_lock);
>  			azx_update_rirb(chip);
> @@ -803,7 +805,7 @@ static unsigned int azx_rirb_get_response(struct hda_bus *bus,
>  		}
>  		if (time_after(jiffies, timeout))
>  			break;
> -		if (bus->needs_damn_long_delay)
> +		if (bus->needs_damn_long_delay || loopcounter > 3000)
>  			msleep(2); /* temporary workaround */
>  		else {
>  			udelay(10);
> -- 
> 1.7.9.5
> 
> _______________________________________________
> Alsa-devel mailing list
> Alsa-devel at alsa-project.org
> http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
> 


More information about the Alsa-devel mailing list