All of lore.kernel.org
 help / color / mirror / Atom feed
From: Chris Wilson <chris@chris-wilson.co.uk>
To: alsa-devel@alsa-project.org
Cc: intel-gfx@lists.freedesktop.org,
	Chris Wilson <chris@chris-wilson.co.uk>,
	Jeeja KP <jeeja.kp@intel.com>, Vinod Koul <vinod.koul@intel.com>,
	Takashi Iwai <tiwai@suse.de>,
	"# v4 . 7+" <stable@vger.kernel.org>
Subject: [PATCH] ALSA: hda: Use loop counter for hdac_wait_for_cmd_dmas() timeout
Date: Thu,  4 May 2017 11:18:29 +0100	[thread overview]
Message-ID: <20170504101829.28325-1-chris@chris-wilson.co.uk> (raw)

hdac_wait_for_cmd_dmas() uses a jiffie timeout to ensure that we do not
wait forever for stuck hardware. However, it is called from an
irq-disabled context which prevents jiffie from advancing and so the
loop doesn't terminate if the hardware fails. This can then cause NMI
watchdog warnings, such as:

    NMI watchdog: Watchdog detected hard LOCKUP on cpu 3
    Modules linked in: snd_hda_intel i915 vgem snd_hda_codec_hdmi x86_pkg_temp_thermal intel_powerclamp coretemp crct10dif_pclmul crc32_pclmul snd_hda_codec_realtek snd_hda_codec_generic ghash_clmulni_intel e1000e snd_hda_codec snd_hwdep snd_hda_core snd_pcm ptp mei_me prime_numbers pps_core mei lpc_ich i2c_hid i2c_designware_platform i2c_designware_core [last unloaded: i915]
    irq event stamp: 13366
    hardirqs last  enabled at (13365): [<ffffffff81891a87>] _raw_spin_unlock_irq+0x27/0x50
    hardirqs last disabled at (13366): [<ffffffff818918d2>] _raw_spin_lock_irq+0x12/0x50
    softirqs last  enabled at (12744): [<ffffffff81085c79>] __do_softirq+0x1d9/0x4c0
    softirqs last disabled at (12721): [<ffffffff810860d9>] irq_exit+0xa9/0xc0
    CPU: 3 PID: 10443 Comm: kworker/u8:11 Tainted: G     U          4.11.0-rc4-CI-CI_DRM_319+ #1
    Hardware name:                  /NUC5i5RYB, BIOS RYBDWi35.86A.0362.2017.0118.0940 01/18/2017
    Workqueue: events_unbound async_run_entry_fn
    task: ffff88024cd32740 task.stack: ffffc9000162c000
    RIP: 0010:preempt_count_add+0xe/0xc0
    RSP: 0018:ffffc9000162fbd8 EFLAGS: 00000082
    RAX: 0000000080000001 RBX: 0000000704b96558 RCX: 0000000000000002
    RDX: 0000000000000000 RSI: ffffffff81c74f2d RDI: 0000000000000001
    RBP: ffffc9000162fc08 R08: 00000000bbcc90cc R09: 23c7b07100000000
    R10: ffffffff827901a8 R11: ffff88024cd32740 R12: 0000000704b92baa
    R13: 0000000000003ea0 R14: 0000000000000003 R15: ffffffffa00061f0
    FS:  0000000000000000(0000) GS:ffff880256d80000(0000) knlGS:0000000000000000
    CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: 00007f90f84a5144 CR3: 0000000003e0f000 CR4: 00000000003406e0
    Call Trace:
     ? delay_tsc+0x3d/0xc0
     __delay+0xa/0x10
     __const_udelay+0x31/0x40
     snd_hdac_bus_stop_cmd_io+0x96/0xe0 [snd_hda_core]
     ? azx_dev_disconnect+0x20/0x20 [snd_hda_intel]
     snd_hdac_bus_stop_chip+0xb1/0x100 [snd_hda_core]
     azx_stop_chip+0x9/0x10 [snd_hda_codec]
     azx_suspend+0x72/0x220 [snd_hda_intel]
     pci_pm_suspend+0x71/0x140
     dpm_run_callback+0x6f/0x330
     ? pci_pm_freeze+0xe0/0xe0
     __device_suspend+0xf9/0x370
     ? dpm_watchdog_set+0x60/0x60
     async_suspend+0x1a/0x90
     async_run_entry_fn+0x34/0x160
     process_one_work+0x1f4/0x6d0
     ? process_one_work+0x16e/0x6d0
     worker_thread+0x49/0x4a0
     kthread+0x107/0x140
     ? process_one_work+0x6d0/0x6d0
     ? kthread_create_on_node+0x40/0x40
     ret_from_fork+0x2e/0x40

Fixes: 38b19ed7f81e ("ALSA: hda: fix to wait for RIRB & CORB DMA to set")
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=100419
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Jeeja KP <jeeja.kp@intel.com>
Cc: Vinod Koul <vinod.koul@intel.com>
Cc: Takashi Iwai <tiwai@suse.de>
Cc: <stable@vger.kernel.org> # v4.7+
---
 sound/hda/hdac_controller.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/sound/hda/hdac_controller.c b/sound/hda/hdac_controller.c
index ee08c389b4d6..7f8806b03982 100644
--- a/sound/hda/hdac_controller.c
+++ b/sound/hda/hdac_controller.c
@@ -85,14 +85,14 @@ static void hdac_wait_for_cmd_dmas(struct hdac_bus *bus)
 {
 	unsigned long timeout;
 
-	timeout = jiffies + msecs_to_jiffies(100);
+	timeout = 100 * 100; /* 100ms */
 	while ((snd_hdac_chip_readb(bus, RIRBCTL) & AZX_RBCTL_DMA_EN)
-		&& time_before(jiffies, timeout))
+	       && timeout--)
 		udelay(10);
 
-	timeout = jiffies + msecs_to_jiffies(100);
+	timeout = 100 * 100; /* 100ms */
 	while ((snd_hdac_chip_readb(bus, CORBCTL) & AZX_CORBCTL_RUN)
-		&& time_before(jiffies, timeout))
+	       && timeout--)
 		udelay(10);
 }
 
-- 
2.11.0

             reply	other threads:[~2017-05-04 10:18 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-05-04 10:18 Chris Wilson [this message]
2017-05-04 10:25 ` [PATCH] ALSA: hda: Use loop counter for hdac_wait_for_cmd_dmas() timeout Takashi Iwai
2017-05-04 10:30   ` Vinod Koul
2017-05-04 10:30     ` Takashi Iwai
2017-05-04 10:42   ` Chris Wilson
2017-05-05  6:11     ` [Intel-gfx] " Lofstedt, Marta
2017-05-04 10:35 ` ✓ Fi.CI.BAT: success for " Patchwork

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170504101829.28325-1-chris@chris-wilson.co.uk \
    --to=chris@chris-wilson.co.uk \
    --cc=alsa-devel@alsa-project.org \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=jeeja.kp@intel.com \
    --cc=stable@vger.kernel.org \
    --cc=tiwai@suse.de \
    --cc=vinod.koul@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.