From mboxrd@z Thu Jan 1 00:00:00 1970 From: Arun Raghavan Subject: Re: [PATCH] ALSA: HDA: Lessen CPU usage when waiting for chip to respond Date: Wed, 09 May 2012 01:35:52 +0530 Message-ID: <1336507552.5353.3.camel@localhost> References: <1336122355-6017-1-git-send-email-david.henningsson@canonical.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Received: from bhuna.collabora.co.uk (bhuna.collabora.co.uk [93.93.135.160]) by alsa0.perex.cz (Postfix) with ESMTP id 14AB51044A3 for ; Tue, 8 May 2012 22:06:10 +0200 (CEST) In-Reply-To: <1336122355-6017-1-git-send-email-david.henningsson@canonical.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: alsa-devel-bounces@alsa-project.org Errors-To: alsa-devel-bounces@alsa-project.org To: David Henningsson Cc: alsa-devel@alsa-project.org List-Id: alsa-devel@alsa-project.org On Fri, 2012-05-04 at 11:05 +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 > --- > 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. > > // David Thanks, this fixes the problem for me. Don't know what the official procedure for these things is, but fwiw: Signed-off-by: Arun Raghavan > 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);