All of lore.kernel.org
 help / color / mirror / Atom feed
From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	stable@vger.kernel.org, Yi Zhang <yizhan@redhat.com>,
	Dan Williams <dan.j.williams@intel.com>
Subject: [PATCH 4.10 90/93] libnvdimm: fix nvdimm_bus_lock() vs device_lock() ordering
Date: Thu, 18 May 2017 12:47:59 +0200	[thread overview]
Message-ID: <20170518104746.716797420@linuxfoundation.org> (raw)
In-Reply-To: <20170518104743.163522815@linuxfoundation.org>

4.10-stable review patch.  If anyone has any objections, please let me know.

------------------

From: Dan Williams <dan.j.williams@intel.com>

commit 452bae0aede774f87bf56c28b6dd50b72c78986c upstream.

A debug patch to turn the standard device_lock() into something that
lockdep can analyze yielded the following:

 ======================================================
 [ INFO: possible circular locking dependency detected ]
 4.11.0-rc4+ #106 Tainted: G           O
 -------------------------------------------------------
 lt-libndctl/1898 is trying to acquire lock:
  (&dev->nvdimm_mutex/3){+.+.+.}, at: [<ffffffffc023c948>] nd_attach_ndns+0x178/0x1b0 [libnvdimm]

 but task is already holding lock:
  (&nvdimm_bus->reconfig_mutex){+.+.+.}, at: [<ffffffffc022e0b1>] nvdimm_bus_lock+0x21/0x30 [libnvdimm]

 which lock already depends on the new lock.

 the existing dependency chain (in reverse order) is:

 -> #1 (&nvdimm_bus->reconfig_mutex){+.+.+.}:
        lock_acquire+0xf6/0x1f0
        __mutex_lock+0x88/0x980
        mutex_lock_nested+0x1b/0x20
        nvdimm_bus_lock+0x21/0x30 [libnvdimm]
        nvdimm_namespace_capacity+0x1b/0x40 [libnvdimm]
        nvdimm_namespace_common_probe+0x230/0x510 [libnvdimm]
        nd_pmem_probe+0x14/0x180 [nd_pmem]
        nvdimm_bus_probe+0xa9/0x260 [libnvdimm]

 -> #0 (&dev->nvdimm_mutex/3){+.+.+.}:
        __lock_acquire+0x1107/0x1280
        lock_acquire+0xf6/0x1f0
        __mutex_lock+0x88/0x980
        mutex_lock_nested+0x1b/0x20
        nd_attach_ndns+0x178/0x1b0 [libnvdimm]
        nd_namespace_store+0x308/0x3c0 [libnvdimm]
        namespace_store+0x87/0x220 [libnvdimm]

In this case '&dev->nvdimm_mutex/3' mirrors '&dev->mutex'.

Fix this by replacing the use of device_lock() with nvdimm_bus_lock() to protect
nd_{attach,detach}_ndns() operations.

Fixes: 8c2f7e8658df ("libnvdimm: infrastructure for btt devices")
Reported-by: Yi Zhang <yizhan@redhat.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

---
 drivers/nvdimm/btt_devs.c |    2 +-
 drivers/nvdimm/claim.c    |   23 +++++++++++++++--------
 drivers/nvdimm/dax_devs.c |    2 +-
 drivers/nvdimm/pfn_devs.c |    2 +-
 4 files changed, 18 insertions(+), 11 deletions(-)

--- a/drivers/nvdimm/btt_devs.c
+++ b/drivers/nvdimm/btt_devs.c
@@ -314,7 +314,7 @@ int nd_btt_probe(struct device *dev, str
 	if (rc < 0) {
 		struct nd_btt *nd_btt = to_nd_btt(btt_dev);
 
-		__nd_detach_ndns(btt_dev, &nd_btt->ndns);
+		nd_detach_ndns(btt_dev, &nd_btt->ndns);
 		put_device(btt_dev);
 	}
 
--- a/drivers/nvdimm/claim.c
+++ b/drivers/nvdimm/claim.c
@@ -21,8 +21,13 @@
 void __nd_detach_ndns(struct device *dev, struct nd_namespace_common **_ndns)
 {
 	struct nd_namespace_common *ndns = *_ndns;
+	struct nvdimm_bus *nvdimm_bus;
 
-	lockdep_assert_held(&ndns->dev.mutex);
+	if (!ndns)
+		return;
+
+	nvdimm_bus = walk_to_nvdimm_bus(&ndns->dev);
+	lockdep_assert_held(&nvdimm_bus->reconfig_mutex);
 	dev_WARN_ONCE(dev, ndns->claim != dev, "%s: invalid claim\n", __func__);
 	ndns->claim = NULL;
 	*_ndns = NULL;
@@ -37,18 +42,20 @@ void nd_detach_ndns(struct device *dev,
 	if (!ndns)
 		return;
 	get_device(&ndns->dev);
-	device_lock(&ndns->dev);
+	nvdimm_bus_lock(&ndns->dev);
 	__nd_detach_ndns(dev, _ndns);
-	device_unlock(&ndns->dev);
+	nvdimm_bus_unlock(&ndns->dev);
 	put_device(&ndns->dev);
 }
 
 bool __nd_attach_ndns(struct device *dev, struct nd_namespace_common *attach,
 		struct nd_namespace_common **_ndns)
 {
+	struct nvdimm_bus *nvdimm_bus = walk_to_nvdimm_bus(&attach->dev);
+
 	if (attach->claim)
 		return false;
-	lockdep_assert_held(&attach->dev.mutex);
+	lockdep_assert_held(&nvdimm_bus->reconfig_mutex);
 	dev_WARN_ONCE(dev, *_ndns, "%s: invalid claim\n", __func__);
 	attach->claim = dev;
 	*_ndns = attach;
@@ -61,9 +68,9 @@ bool nd_attach_ndns(struct device *dev,
 {
 	bool claimed;
 
-	device_lock(&attach->dev);
+	nvdimm_bus_lock(&attach->dev);
 	claimed = __nd_attach_ndns(dev, attach, _ndns);
-	device_unlock(&attach->dev);
+	nvdimm_bus_unlock(&attach->dev);
 	return claimed;
 }
 
@@ -114,7 +121,7 @@ static void nd_detach_and_reset(struct d
 		struct nd_namespace_common **_ndns)
 {
 	/* detach the namespace and destroy / reset the device */
-	nd_detach_ndns(dev, _ndns);
+	__nd_detach_ndns(dev, _ndns);
 	if (is_idle(dev, *_ndns)) {
 		nd_device_unregister(dev, ND_ASYNC);
 	} else if (is_nd_btt(dev)) {
@@ -184,7 +191,7 @@ ssize_t nd_namespace_store(struct device
 	}
 
 	WARN_ON_ONCE(!is_nvdimm_bus_locked(dev));
-	if (!nd_attach_ndns(dev, ndns, _ndns)) {
+	if (!__nd_attach_ndns(dev, ndns, _ndns)) {
 		dev_dbg(dev, "%s already claimed\n",
 				dev_name(&ndns->dev));
 		len = -EBUSY;
--- a/drivers/nvdimm/dax_devs.c
+++ b/drivers/nvdimm/dax_devs.c
@@ -124,7 +124,7 @@ int nd_dax_probe(struct device *dev, str
 	dev_dbg(dev, "%s: dax: %s\n", __func__,
 			rc == 0 ? dev_name(dax_dev) : "<none>");
 	if (rc < 0) {
-		__nd_detach_ndns(dax_dev, &nd_pfn->ndns);
+		nd_detach_ndns(dax_dev, &nd_pfn->ndns);
 		put_device(dax_dev);
 	} else
 		__nd_device_register(dax_dev);
--- a/drivers/nvdimm/pfn_devs.c
+++ b/drivers/nvdimm/pfn_devs.c
@@ -484,7 +484,7 @@ int nd_pfn_probe(struct device *dev, str
 	dev_dbg(dev, "%s: pfn: %s\n", __func__,
 			rc == 0 ? dev_name(pfn_dev) : "<none>");
 	if (rc < 0) {
-		__nd_detach_ndns(pfn_dev, &nd_pfn->ndns);
+		nd_detach_ndns(pfn_dev, &nd_pfn->ndns);
 		put_device(pfn_dev);
 	} else
 		__nd_device_register(pfn_dev);

  parent reply	other threads:[~2017-05-18 11:34 UTC|newest]

Thread overview: 93+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-05-18 10:46 [PATCH 4.10 00/93] 4.10.17-stable review Greg Kroah-Hartman
2017-05-18 10:46 ` [PATCH 4.10 01/93] xen: adjust early dom0 p2m handling to xen hypervisor behavior Greg Kroah-Hartman
2017-05-18 10:46 ` [PATCH 4.10 02/93] target: Fix compare_and_write_callback handling for non GOOD status Greg Kroah-Hartman
2017-05-18 10:46 ` [PATCH 4.10 03/93] target/fileio: Fix zero-length READ and WRITE handling Greg Kroah-Hartman
2017-05-18 10:46 ` [PATCH 4.10 04/93] iscsi-target: Set session_fall_back_to_erl0 when forcing reinstatement Greg Kroah-Hartman
2017-05-18 10:46 ` [PATCH 4.10 05/93] usb: xhci: bInterval quirk for TI TUSB73x0 Greg Kroah-Hartman
2017-05-18 10:46 ` [PATCH 4.10 06/93] usb: host: xhci: print correct command ring address Greg Kroah-Hartman
2017-05-18 10:46 ` [PATCH 4.10 07/93] USB: serial: ftdi_sio: add device ID for Microsemi/Arrow SF2PLUS Dev Kit Greg Kroah-Hartman
2017-05-18 10:46 ` [PATCH 4.10 08/93] USB: Proper handling of Race Condition when two USB class drivers try to call init_usb_class simultaneously Greg Kroah-Hartman
2017-05-18 10:46 ` [PATCH 4.10 10/93] staging: vt6656: use off stack for in buffer USB transfers Greg Kroah-Hartman
2017-05-18 10:46 ` [PATCH 4.10 11/93] staging: vt6656: use off stack for out " Greg Kroah-Hartman
2017-05-18 10:46 ` [PATCH 4.10 12/93] staging: gdm724x: gdm_mux: fix use-after-free on module unload Greg Kroah-Hartman
2017-05-18 10:46 ` [PATCH 4.10 13/93] staging: wilc1000: Fix problem with wrong vif index Greg Kroah-Hartman
2017-05-18 10:46 ` [PATCH 4.10 14/93] staging: comedi: jr3_pci: fix possible null pointer dereference Greg Kroah-Hartman
2017-05-18 10:46 ` [PATCH 4.10 15/93] staging: comedi: jr3_pci: cope with jiffies wraparound Greg Kroah-Hartman
2017-05-18 10:46 ` [PATCH 4.10 16/93] usb: misc: add missing continue in switch Greg Kroah-Hartman
2017-05-18 10:46 ` [PATCH 4.10 17/93] usb: gadget: legacy gadgets are optional Greg Kroah-Hartman
2017-05-18 10:46 ` [PATCH 4.10 18/93] usb: Make sure usb/phy/of gets built-in Greg Kroah-Hartman
2017-05-18 10:46   ` Greg Kroah-Hartman
2017-05-18 10:46 ` [PATCH 4.10 19/93] usb: hub: Fix error loop seen after hub communication errors Greg Kroah-Hartman
2017-05-18 10:46 ` [PATCH 4.10 20/93] usb: hub: Do not attempt to autosuspend disconnected devices Greg Kroah-Hartman
2017-05-18 10:46 ` [PATCH 4.10 21/93] usb: misc: legousbtower: Fix buffers on stack Greg Kroah-Hartman
2017-05-18 10:46 ` [PATCH 4.10 22/93] x86/boot: Fix BSS corruption/overwrite bug in early x86 kernel startup Greg Kroah-Hartman
2017-05-18 10:46 ` [PATCH 4.10 23/93] selftests/x86/ldt_gdt_32: Work around a glibc sigaction() bug Greg Kroah-Hartman
2017-05-18 10:46 ` [PATCH 4.10 24/93] x86, pmem: Fix cache flushing for iovec write < 8 bytes Greg Kroah-Hartman
2017-05-18 10:46 ` [PATCH 4.10 25/93] um: Fix PTRACE_POKEUSER on x86_64 Greg Kroah-Hartman
2017-05-18 10:46 ` [PATCH 4.10 26/93] perf/x86: Fix Broadwell-EP DRAM RAPL events Greg Kroah-Hartman
2017-05-18 10:46 ` [PATCH 4.10 28/93] KVM: arm/arm64: fix races in kvm_psci_vcpu_on Greg Kroah-Hartman
2017-05-18 10:46 ` [PATCH 4.10 29/93] arm64: KVM: Fix decoding of Rt/Rt2 when trapping AArch32 CP accesses Greg Kroah-Hartman
2017-05-18 10:46 ` [PATCH 4.10 30/93] block: fix blk_integrity_register to use templates interval_exp if not 0 Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 31/93] crypto: s5p-sss - Close possible race for completed requests Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 32/93] crypto: algif_aead - Require setkey before accept(2) Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 33/93] crypto: ccp - Use only the relevant interrupt bits Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 34/93] crypto: ccp - Disable interrupts early on unload Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 35/93] crypto: ccp - Change ISR handler method for a v3 CCP Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 36/93] crypto: ccp - Change ISR handler method for a v5 CCP Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 37/93] dm crypt: rewrite (wipe) key in crypto layer using random data Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 38/93] dm era: save spacemap metadata root after the pre-commit Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 39/93] dm rq: check blk_mq_register_dev() return value in dm_mq_init_request_queue() Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 40/93] dm thin: fix a memory leak when passing discard bio down Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 41/93] vfio/type1: Remove locked page accounting workqueue Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 42/93] iov_iter: dont revert iov buffer if csum error Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 43/93] IB/core: Fix sysfs registration error flow Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 44/93] IB/core: For multicast functions, verify that LIDs are multicast LIDs Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 45/93] IB/IPoIB: ibX: failed to create mcg debug file Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 46/93] IB/mlx4: Fix ib device initialization error flow Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 47/93] IB/mlx4: Reduce SRIOV multicast cleanup warning message to debug level Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 48/93] IB/hfi1: Prevent kernel QP post send hard lockups Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 49/93] perf auxtrace: Fix no_size logic in addr_filter__resolve_kernel_syms() Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 50/93] perf annotate s390: Fix perf annotate error -95 (4.10 regression) Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 51/93] perf annotate s390: Implement jump types for perf annotate Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 52/93] jbd2: fix dbench4 performance regression for nobarrier mounts Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 53/93] ext4: evict inline data when writing to memory map Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 54/93] orangefs: fix bounds check for listxattr Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 55/93] orangefs: clean up oversize xattr validation Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 56/93] orangefs: do not set getattr_time on orangefs_lookup Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 57/93] orangefs: do not check possibly stale size on truncate Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 58/93] fs/xattr.c: zero out memory copied to userspace in getxattr Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 59/93] ceph: fix memory leak in __ceph_setxattr() Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 60/93] fs/block_dev: always invalidate cleancache in invalidate_bdev() Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 61/93] mm: prevent potential recursive reclaim due to clearing PF_MEMALLOC Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 62/93] Fix match_prepath() Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 63/93] Set unicode flag on cifs echo request to avoid Mac error Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 64/93] SMB3: Work around mount failure when using SMB3 dialect to Macs Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 66/93] cifs: fix leak in FSCTL_ENUM_SNAPS response handling Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 67/93] cifs: fix CIFS_ENUMERATE_SNAPSHOTS oops Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 68/93] CIFS: fix oplock break deadlocks Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 69/93] cifs: fix CIFS_IOC_GET_MNT_INFO oops Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 71/93] ovl: do not set overlay.opaque on non-dir create Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 72/93] padata: free correct variable Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 73/93] md/raid1: avoid reusing a resync bio after error handling Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 74/93] device-dax: fix cdev leak Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 75/93] device-dax: fix sysfs attribute deadlock Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 76/93] dax: prevent invalidation of mapped DAX entries Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 77/93] mm: fix data corruption due to stale mmap reads Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 78/93] f2fs: fix fs corruption due to zero inode page Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 79/93] fscrypt: fix context consistency check when key(s) unavailable Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 80/93] serial: samsung: Use right device for DMA-mapping calls Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 81/93] serial: omap: fix runtime-pm handling on unbind Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 82/93] serial: omap: suspend device on probe errors Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 83/93] tty: pty: Fix ldisc flush after userspace become aware of the data already Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 84/93] Bluetooth: Fix user channel for 32bit userspace on 64bit kernel Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 85/93] Bluetooth: hci_bcm: add missing tty-device sanity check Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 86/93] Bluetooth: hci_intel: " Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 87/93] ipmi: Fix kernel panic at ipmi_ssif_thread() Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 88/93] libnvdimm, region: fix flush hint detection crash Greg Kroah-Hartman
2017-05-18 10:47 ` [PATCH 4.10 89/93] libnvdimm, pmem: fix a NULL pointer BUG in nd_pmem_notify Greg Kroah-Hartman
2017-05-18 10:47 ` Greg Kroah-Hartman [this message]
2017-05-18 10:48 ` [PATCH 4.10 91/93] libnvdimm, pfn: fix npfns vs section alignment Greg Kroah-Hartman
2017-05-18 10:48 ` [PATCH 4.10 92/93] pstore: Fix flags to enable dumps on powerpc Greg Kroah-Hartman
2017-05-18 10:48 ` [PATCH 4.10 93/93] pstore: Shut down worker when unregistering Greg Kroah-Hartman
2017-05-18 17:31 ` [PATCH 4.10 00/93] 4.10.17-stable review Shuah Khan
2017-05-19  1:10 ` Guenter Roeck

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=20170518104746.716797420@linuxfoundation.org \
    --to=gregkh@linuxfoundation.org \
    --cc=dan.j.williams@intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=stable@vger.kernel.org \
    --cc=yizhan@redhat.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.