aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Henningsson <david.henningsson@canonical.com>2012-05-04 05:05:55 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2012-05-21 12:40:01 -0400
commitb147567a79744253aa13c8266bfc48ceb70eff6c (patch)
treec31c8a9478b06c17d425fca2db56b7d1776b8a40
parent1a26c7d95b8f7715b1111f75693ef77385af44fa (diff)
ALSA: HDA: Lessen CPU usage when waiting for chip to respond
commit 32cf4023e689ad5b3a81a749d8cc99d7f184cb99 upstream. 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@canonical.com> Tested-by: Arun Raghavan <arun.raghavan@collabora.co.uk> Signed-off-by: Takashi Iwai <tiwai@suse.de> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--sound/pci/hda/hda_intel.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
index 981b6fd1ae7..c5c97880f50 100644
--- a/sound/pci/hda/hda_intel.c
+++ b/sound/pci/hda/hda_intel.c
@@ -702,11 +702,13 @@ static unsigned int azx_rirb_get_response(struct hda_bus *bus,
702{ 702{
703 struct azx *chip = bus->private_data; 703 struct azx *chip = bus->private_data;
704 unsigned long timeout; 704 unsigned long timeout;
705 unsigned long loopcounter;
705 int do_poll = 0; 706 int do_poll = 0;
706 707
707 again: 708 again:
708 timeout = jiffies + msecs_to_jiffies(1000); 709 timeout = jiffies + msecs_to_jiffies(1000);
709 for (;;) { 710
711 for (loopcounter = 0;; loopcounter++) {
710 if (chip->polling_mode || do_poll) { 712 if (chip->polling_mode || do_poll) {
711 spin_lock_irq(&chip->reg_lock); 713 spin_lock_irq(&chip->reg_lock);
712 azx_update_rirb(chip); 714 azx_update_rirb(chip);
@@ -722,7 +724,7 @@ static unsigned int azx_rirb_get_response(struct hda_bus *bus,
722 } 724 }
723 if (time_after(jiffies, timeout)) 725 if (time_after(jiffies, timeout))
724 break; 726 break;
725 if (bus->needs_damn_long_delay) 727 if (bus->needs_damn_long_delay || loopcounter > 3000)
726 msleep(2); /* temporary workaround */ 728 msleep(2); /* temporary workaround */
727 else { 729 else {
728 udelay(10); 730 udelay(10);