mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Prarit Bhargava <prarit@redhat.com>
To: linux-kernel@vger.kernel.org
Cc: Prarit Bhargava <prarit@redhat.com>,
	Tomas Winkler <tomas.winkler@intel.com>
Subject: [PATCH] mei, release device lock when registering watchdog
Date: Thu, 20 Mar 2014 08:46:40 -0400	[thread overview]
Message-ID: <1395319600-31058-1-git-send-email-prarit@redhat.com> (raw)

I don't know if this also shows a possible latent bug with lockdep.  It
seems like I should be seeing this bug all the time with kernels 3.6.6 and
onward.  Testing indicates that the bug is present in 3.11, and 3.12 but
for some reason the reporting of the bug comes-and-goes as patches are
added and removed to the kernel...

P.

---8<---

Seen in kernels,

3.6.6: http://lkml.org/lkml/2012/11/13/184
3.10.0: where I have seen it (and what led to this patch)
3.11: seen in testing (boot & cat /dev/watchdog, OR, reboot)
3.12: seen in testing (boot & cat /dev/watchdog, OR, reboot)
3.13.0: https://lists.fedoraproject.org/pipermail/test/2013-May/115423.html
3.14.0: I can occasionally reproduce this by issuing a reboot.

The lockdep info is:

[   42.016059] ======================================================
[   42.022222] [ INFO: possible circular locking dependency detected ]
[   42.028471] 3.13.0 #1 Not tainted
[   42.031775] -------------------------------------------------------
[   42.038025] cat/2175 is trying to acquire lock:
[   42.042543]  (&dev->device_lock){+.+.+.}, at: [<ffffffff813fcd0d>] mei_wd_ops_start+0x2d/0xf0
[   42.051100]
[   42.051100] but task is already holding lock:
[   42.056917]  (&wdd->lock){+.+...}, at: [<ffffffff81494f52>] watchdog_start+0x22/0x80
[   42.064687]
[   42.064687] which lock already depends on the new lock.
[   42.064687]
[   42.072841]
[   42.072841] the existing dependency chain (in reverse order) is:
[   42.080302]
-> #2 (&wdd->lock){+.+...}:
[   42.084353]        [<ffffffff810b8297>] validate_chain.isra.41+0x4a7/0x910
[   42.091222]        [<ffffffff810b9566>] __lock_acquire+0x3c6/0xb60
[   42.097398]        [<ffffffff810ba4f2>] lock_acquire+0xa2/0x120
[   42.103312]        [<ffffffff8161855d>] mutex_lock_nested+0x5d/0x4c0
[   42.109663]        [<ffffffff81494f52>] watchdog_start+0x22/0x80
[   42.115665]        [<ffffffff814951c8>] watchdog_open+0x98/0xf0
[   42.121582]        [<ffffffff813c0e03>] misc_open+0xb3/0x170
[   42.127240]        [<ffffffff811d0baf>] chrdev_open+0x9f/0x1c0
[   42.133069]        [<ffffffff811c96a7>] do_dentry_open+0x1d7/0x2f0
[   42.139245]        [<ffffffff811c99b1>] finish_open+0x31/0x40
[   42.144986]        [<ffffffff811dc157>] do_last+0xbd7/0x13c0
[   42.150642]        [<ffffffff811dc9fe>] path_openat+0xbe/0x640
[   42.156468]        [<ffffffff811dd79a>] do_filp_open+0x3a/0x90
[   42.162298]        [<ffffffff811cb248>] do_sys_open+0x128/0x220
[   42.168214]        [<ffffffff811cb35e>] SyS_open+0x1e/0x20
[   42.173695]        [<ffffffff816256e9>] system_call_fastpath+0x16/0x1b
[   42.180217]
-> #1 (misc_mtx){+.+.+.}:
[   42.184088]        [<ffffffff810b8297>] validate_chain.isra.41+0x4a7/0x910
[   42.190957]        [<ffffffff810b9566>] __lock_acquire+0x3c6/0xb60
[   42.197134]        [<ffffffff810ba4f2>] lock_acquire+0xa2/0x120
[   42.203048]        [<ffffffff8161855d>] mutex_lock_nested+0x5d/0x4c0
[   42.209396]        [<ffffffff813c0b69>] misc_register+0x29/0x120
[   42.215399]        [<ffffffff814956c5>] watchdog_dev_register+0x35/0x120
[   42.222093]        [<ffffffff81494d0c>] watchdog_register_device+0xac/0x1f0
[   42.229046]        [<ffffffff813fd3b9>] mei_watchdog_register+0x19/0x70
[   42.235651]        [<ffffffff813f6729>] mei_hbm_dispatch+0x269/0xc80
[   42.241999]        [<ffffffff813f72e4>] mei_irq_read_handler+0xe4/0x900
[   42.248609]        [<ffffffff813ffee5>] mei_me_irq_thread_handler+0x115/0x310
[   42.255735]        [<ffffffff810cbb50>] irq_thread_fn+0x20/0x50
[   42.261653]        [<ffffffff810cbfb3>] irq_thread+0x123/0x150
[   42.267482]        [<ffffffff8108d90f>] kthread+0xff/0x120
[   42.272966]        [<ffffffff8162563c>] ret_from_fork+0x7c/0xb0
[   42.278881]
-> #0 (&dev->device_lock){+.+.+.}:
[   42.283536]        [<ffffffff810b7de7>] check_prevs_add+0x967/0x970
[   42.289801]        [<ffffffff810b8297>] validate_chain.isra.41+0x4a7/0x910
[   42.296670]        [<ffffffff810b9566>] __lock_acquire+0x3c6/0xb60
[   42.302843]        [<ffffffff810ba4f2>] lock_acquire+0xa2/0x120
[   42.308760]        [<ffffffff8161855d>] mutex_lock_nested+0x5d/0x4c0
[   42.315108]        [<ffffffff813fcd0d>] mei_wd_ops_start+0x2d/0xf0
[   42.321281]        [<ffffffff81494f8d>] watchdog_start+0x5d/0x80
[   42.327282]        [<ffffffff814951c8>] watchdog_open+0x98/0xf0
[   42.333194]        [<ffffffff813c0e03>] misc_open+0xb3/0x170
[   42.338851]        [<ffffffff811d0baf>] chrdev_open+0x9f/0x1c0
[   42.344681]        [<ffffffff811c96a7>] do_dentry_open+0x1d7/0x2f0
[   42.350855]        [<ffffffff811c99b1>] finish_open+0x31/0x40
[   42.356597]        [<ffffffff811dc157>] do_last+0xbd7/0x13c0
[   42.362255]        [<ffffffff811dc9fe>] path_openat+0xbe/0x640
[   42.368084]        [<ffffffff811dd79a>] do_filp_open+0x3a/0x90
[   42.373911]        [<ffffffff811cb248>] do_sys_open+0x128/0x220
[   42.379824]        [<ffffffff811cb35e>] SyS_open+0x1e/0x20
[   42.385305]        [<ffffffff816256e9>] system_call_fastpath+0x16/0x1b
[   42.391826]
[   42.391826] other info that might help us debug this:
[   42.391826]
[   42.399808] Chain exists of:
  &dev->device_lock --> misc_mtx --> &wdd->lock

[   42.407170]  Possible unsafe locking scenario:
[   42.407170]
[   42.413073]        CPU0                    CPU1
[   42.417588]        ----                    ----
[   42.422105]   lock(&wdd->lock);
[   42.425259]                                lock(misc_mtx);
[   42.430752]                                lock(&wdd->lock);
[   42.436420]   lock(&dev->device_lock);
[   42.440178]
[   42.440178]  *** DEADLOCK ***
[   42.440178]
[   42.446081] 2 locks held by cat/2175:
[   42.449732]  #0:  (misc_mtx){+.+.+.}, at: [<ffffffff813c0d7e>] misc_open+0x2e/0x170
[   42.457430]  #1:  (&wdd->lock){+.+...}, at: [<ffffffff81494f52>] watchdog_start+0x22/0x80
[   42.465647]
[   42.465647] stack backtrace:
[   42.469992] CPU: 7 PID: 2175 Comm: cat Not tainted 3.13.0 #1
[   42.475636] Hardware name: Intel Corporation 2012 Client Platform/Emerald Lake 2, BIOS ACRVMBY1.86C.0078.P00.1201161002 01/16/2012
[   42.487340]  ffffffff822b2a40 ffff880036475918 ffffffff81613aa0 ffffffff822ca9e0
[   42.494763]  ffff880036475958 ffffffff8160defb ffff880036475980 0000000000000001
[   42.502186]  ffff88023af4e400 ffff88023af4ef40 ffff88023af4ef40 0000000000000002
[   42.509609] Call Trace:
[   42.512048]  [<ffffffff81613aa0>] dump_stack+0x45/0x56
[   42.517172]  [<ffffffff8160defb>] print_circular_bug+0x1f9/0x207
[   42.523161]  [<ffffffff810b7de7>] check_prevs_add+0x967/0x970
[   42.528893]  [<ffffffff810b7952>] ? check_prevs_add+0x4d2/0x970
[   42.534797]  [<ffffffff810b8297>] validate_chain.isra.41+0x4a7/0x910
[   42.541132]  [<ffffffff810b9566>] __lock_acquire+0x3c6/0xb60
[   42.546776]  [<ffffffff810b9566>] ? __lock_acquire+0x3c6/0xb60
[   42.552591]  [<ffffffff810ba4f2>] lock_acquire+0xa2/0x120
[   42.557974]  [<ffffffff813fcd0d>] ? mei_wd_ops_start+0x2d/0xf0
[   42.563790]  [<ffffffff8161855d>] mutex_lock_nested+0x5d/0x4c0
[   42.569605]  [<ffffffff813fcd0d>] ? mei_wd_ops_start+0x2d/0xf0
[   42.575421]  [<ffffffff810b8dbd>] ? trace_hardirqs_on+0xd/0x10
[   42.581235]  [<ffffffff813fcd0d>] ? mei_wd_ops_start+0x2d/0xf0
[   42.587052]  [<ffffffff81494f52>] ? watchdog_start+0x22/0x80
[   42.592697]  [<ffffffff81494f52>] ? watchdog_start+0x22/0x80
[   42.598341]  [<ffffffff813fcd0d>] mei_wd_ops_start+0x2d/0xf0
[   42.603984]  [<ffffffff81494f8d>] watchdog_start+0x5d/0x80
[   42.609453]  [<ffffffff814951c8>] watchdog_open+0x98/0xf0
[   42.614836]  [<ffffffff813c0e03>] misc_open+0xb3/0x170
[   42.619961]  [<ffffffff811d0baf>] chrdev_open+0x9f/0x1c0
[   42.625257]  [<ffffffff811c96a7>] do_dentry_open+0x1d7/0x2f0
[   42.630901]  [<ffffffff811d7e62>] ? __inode_permission+0x52/0xc0
[   42.636892]  [<ffffffff811d0b10>] ? cdev_put+0x30/0x30
[   42.642016]  [<ffffffff811c99b1>] finish_open+0x31/0x40
[   42.647226]  [<ffffffff811dc157>] do_last+0xbd7/0x13c0
[   42.652349]  [<ffffffff811d7ee8>] ? inode_permission+0x18/0x50
[   42.658165]  [<ffffffff811d8631>] ? link_path_walk+0x71/0x850
[   42.663894]  [<ffffffff811dc9fe>] path_openat+0xbe/0x640
[   42.669190]  [<ffffffff810b9566>] ? __lock_acquire+0x3c6/0xb60
[   42.675005]  [<ffffffff810a0a15>] ? sched_clock_cpu+0xb5/0x100
[   42.680822]  [<ffffffff811dd79a>] do_filp_open+0x3a/0x90
[   42.686118]  [<ffffffff8161c187>] ? _raw_spin_unlock+0x27/0x30
[   42.691934]  [<ffffffff811eb20f>] ? __alloc_fd+0xaf/0x140
[   42.697318]  [<ffffffff811cb248>] do_sys_open+0x128/0x220
[   42.702700]  [<ffffffff811cb35e>] SyS_open+0x1e/0x20
[   42.707652]  [<ffffffff816256e9>] system_call_fastpath+0x16/0x1b

The mei_watchdog_register() only registers the watchdog.
mei_watchdog_unregister() is called outside of the dev->device_lock so it
looks like mei_watchdog_register() can as well.

Signed-off-by: Prarit Bhargava <prarit@redhat.com>
Cc: Tomas Winkler <tomas.winkler@intel.com>
---
 drivers/misc/mei/hbm.c |    2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/misc/mei/hbm.c b/drivers/misc/mei/hbm.c
index 28cd74c..fdc83ff 100644
--- a/drivers/misc/mei/hbm.c
+++ b/drivers/misc/mei/hbm.c
@@ -491,7 +491,9 @@ static void mei_hbm_cl_connect_res(struct mei_device *dev,
 
 	if (is_treat_specially_client(&dev->wd_cl, rs)) {
 		dev_dbg(&dev->pdev->dev, "successfully connected to WD client.\n");
+		mutex_unlock(&dev->device_lock);
 		mei_watchdog_register(dev);
+		mutex_lock(&dev->device_lock);
 
 		return;
 	}
-- 
1.7.9.3


             reply	other threads:[~2014-03-20 12:46 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-03-20 12:46 Prarit Bhargava [this message]
2014-03-20 13:09 ` Winkler, Tomas

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=1395319600-31058-1-git-send-email-prarit@redhat.com \
    --to=prarit@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=tomas.winkler@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®