From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
stable@vger.kernel.org, Nikolay Borisov <nborisov@suse.com>,
Anand Jain <anand.jain@oracle.com>,
Josef Bacik <josef@toxicpanda.com>,
David Sterba <dsterba@suse.com>
Subject: [PATCH 4.19 56/78] btrfs: fix lockdep splat in add_missing_dev
Date: Tue, 15 Sep 2020 16:13:21 +0200 [thread overview]
Message-ID: <20200915140636.377816311@linuxfoundation.org> (raw)
In-Reply-To: <20200915140633.552502750@linuxfoundation.org>
From: Josef Bacik <josef@toxicpanda.com>
commit fccc0007b8dc952c6bc0805cdf842eb8ea06a639 upstream.
Nikolay reported a lockdep splat in generic/476 that I could reproduce
with btrfs/187.
======================================================
WARNING: possible circular locking dependency detected
5.9.0-rc2+ #1 Tainted: G W
------------------------------------------------------
kswapd0/100 is trying to acquire lock:
ffff9e8ef38b6268 (&delayed_node->mutex){+.+.}-{3:3}, at: __btrfs_release_delayed_node.part.0+0x3f/0x330
but task is already holding lock:
ffffffffa9d74700 (fs_reclaim){+.+.}-{0:0}, at: __fs_reclaim_acquire+0x5/0x30
which lock already depends on the new lock.
the existing dependency chain (in reverse order) is:
-> #2 (fs_reclaim){+.+.}-{0:0}:
fs_reclaim_acquire+0x65/0x80
slab_pre_alloc_hook.constprop.0+0x20/0x200
kmem_cache_alloc_trace+0x3a/0x1a0
btrfs_alloc_device+0x43/0x210
add_missing_dev+0x20/0x90
read_one_chunk+0x301/0x430
btrfs_read_sys_array+0x17b/0x1b0
open_ctree+0xa62/0x1896
btrfs_mount_root.cold+0x12/0xea
legacy_get_tree+0x30/0x50
vfs_get_tree+0x28/0xc0
vfs_kern_mount.part.0+0x71/0xb0
btrfs_mount+0x10d/0x379
legacy_get_tree+0x30/0x50
vfs_get_tree+0x28/0xc0
path_mount+0x434/0xc00
__x64_sys_mount+0xe3/0x120
do_syscall_64+0x33/0x40
entry_SYSCALL_64_after_hwframe+0x44/0xa9
-> #1 (&fs_info->chunk_mutex){+.+.}-{3:3}:
__mutex_lock+0x7e/0x7e0
btrfs_chunk_alloc+0x125/0x3a0
find_free_extent+0xdf6/0x1210
btrfs_reserve_extent+0xb3/0x1b0
btrfs_alloc_tree_block+0xb0/0x310
alloc_tree_block_no_bg_flush+0x4a/0x60
__btrfs_cow_block+0x11a/0x530
btrfs_cow_block+0x104/0x220
btrfs_search_slot+0x52e/0x9d0
btrfs_lookup_inode+0x2a/0x8f
__btrfs_update_delayed_inode+0x80/0x240
btrfs_commit_inode_delayed_inode+0x119/0x120
btrfs_evict_inode+0x357/0x500
evict+0xcf/0x1f0
vfs_rmdir.part.0+0x149/0x160
do_rmdir+0x136/0x1a0
do_syscall_64+0x33/0x40
entry_SYSCALL_64_after_hwframe+0x44/0xa9
-> #0 (&delayed_node->mutex){+.+.}-{3:3}:
__lock_acquire+0x1184/0x1fa0
lock_acquire+0xa4/0x3d0
__mutex_lock+0x7e/0x7e0
__btrfs_release_delayed_node.part.0+0x3f/0x330
btrfs_evict_inode+0x24c/0x500
evict+0xcf/0x1f0
dispose_list+0x48/0x70
prune_icache_sb+0x44/0x50
super_cache_scan+0x161/0x1e0
do_shrink_slab+0x178/0x3c0
shrink_slab+0x17c/0x290
shrink_node+0x2b2/0x6d0
balance_pgdat+0x30a/0x670
kswapd+0x213/0x4c0
kthread+0x138/0x160
ret_from_fork+0x1f/0x30
other info that might help us debug this:
Chain exists of:
&delayed_node->mutex --> &fs_info->chunk_mutex --> fs_reclaim
Possible unsafe locking scenario:
CPU0 CPU1
---- ----
lock(fs_reclaim);
lock(&fs_info->chunk_mutex);
lock(fs_reclaim);
lock(&delayed_node->mutex);
*** DEADLOCK ***
3 locks held by kswapd0/100:
#0: ffffffffa9d74700 (fs_reclaim){+.+.}-{0:0}, at: __fs_reclaim_acquire+0x5/0x30
#1: ffffffffa9d65c50 (shrinker_rwsem){++++}-{3:3}, at: shrink_slab+0x115/0x290
#2: ffff9e8e9da260e0 (&type->s_umount_key#48){++++}-{3:3}, at: super_cache_scan+0x38/0x1e0
stack backtrace:
CPU: 1 PID: 100 Comm: kswapd0 Tainted: G W 5.9.0-rc2+ #1
Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.13.0-2.fc32 04/01/2014
Call Trace:
dump_stack+0x92/0xc8
check_noncircular+0x12d/0x150
__lock_acquire+0x1184/0x1fa0
lock_acquire+0xa4/0x3d0
? __btrfs_release_delayed_node.part.0+0x3f/0x330
__mutex_lock+0x7e/0x7e0
? __btrfs_release_delayed_node.part.0+0x3f/0x330
? __btrfs_release_delayed_node.part.0+0x3f/0x330
? lock_acquire+0xa4/0x3d0
? btrfs_evict_inode+0x11e/0x500
? find_held_lock+0x2b/0x80
__btrfs_release_delayed_node.part.0+0x3f/0x330
btrfs_evict_inode+0x24c/0x500
evict+0xcf/0x1f0
dispose_list+0x48/0x70
prune_icache_sb+0x44/0x50
super_cache_scan+0x161/0x1e0
do_shrink_slab+0x178/0x3c0
shrink_slab+0x17c/0x290
shrink_node+0x2b2/0x6d0
balance_pgdat+0x30a/0x670
kswapd+0x213/0x4c0
? _raw_spin_unlock_irqrestore+0x46/0x60
? add_wait_queue_exclusive+0x70/0x70
? balance_pgdat+0x670/0x670
kthread+0x138/0x160
? kthread_create_worker_on_cpu+0x40/0x40
ret_from_fork+0x1f/0x30
This is because we are holding the chunk_mutex when we call
btrfs_alloc_device, which does a GFP_KERNEL allocation. We don't want
to switch that to a GFP_NOFS lock because this is the only place where
it matters. So instead use memalloc_nofs_save() around the allocation
in order to avoid the lockdep splat.
Reported-by: Nikolay Borisov <nborisov@suse.com>
CC: stable@vger.kernel.org # 4.4+
Reviewed-by: Anand Jain <anand.jain@oracle.com>
Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
fs/btrfs/volumes.c | 10 ++++++++++
1 file changed, 10 insertions(+)
--- a/fs/btrfs/volumes.c
+++ b/fs/btrfs/volumes.c
@@ -4,6 +4,7 @@
*/
#include <linux/sched.h>
+#include <linux/sched/mm.h>
#include <linux/bio.h>
#include <linux/slab.h>
#include <linux/buffer_head.h>
@@ -6292,8 +6293,17 @@ static struct btrfs_device *add_missing_
u64 devid, u8 *dev_uuid)
{
struct btrfs_device *device;
+ unsigned int nofs_flag;
+ /*
+ * We call this under the chunk_mutex, so we want to use NOFS for this
+ * allocation, however we don't want to change btrfs_alloc_device() to
+ * always do NOFS because we use it in a lot of other GFP_KERNEL safe
+ * places.
+ */
+ nofs_flag = memalloc_nofs_save();
device = btrfs_alloc_device(NULL, &devid, dev_uuid);
+ memalloc_nofs_restore(nofs_flag);
if (IS_ERR(device))
return device;
next prev parent reply other threads:[~2020-09-15 15:06 UTC|newest]
Thread overview: 96+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-09-15 14:12 [PATCH 4.19 00/78] 4.19.146-rc1 review Greg Kroah-Hartman
2020-09-15 14:12 ` [PATCH 4.19 01/78] ARM: dts: logicpd-torpedo-baseboard: Fix broken audio Greg Kroah-Hartman
2020-09-15 14:12 ` [PATCH 4.19 02/78] ARM: dts: logicpd-som-lv-baseboard: " Greg Kroah-Hartman
2020-09-15 14:12 ` [PATCH 4.19 03/78] ARM: dts: socfpga: fix register entry for timer3 on Arria10 Greg Kroah-Hartman
2020-09-15 14:12 ` [PATCH 4.19 04/78] ARM: dts: ls1021a: fix QuadSPI-memory reg range Greg Kroah-Hartman
2020-09-15 14:12 ` [PATCH 4.19 05/78] RDMA/rxe: Fix memleak in rxe_mem_init_user Greg Kroah-Hartman
2020-09-15 14:12 ` [PATCH 4.19 06/78] RDMA/rxe: Drop pointless checks in rxe_init_ports Greg Kroah-Hartman
2020-09-15 14:12 ` [PATCH 4.19 07/78] RDMA/bnxt_re: Do not report transparent vlan from QP1 Greg Kroah-Hartman
2020-09-15 14:12 ` [PATCH 4.19 08/78] drm/sun4i: Fix dsi dcs long write function Greg Kroah-Hartman
2020-09-15 14:12 ` [PATCH 4.19 09/78] iio: adc: mcp3422: fix locking on error path Greg Kroah-Hartman
2020-09-16 7:31 ` Pavel Machek
2020-09-17 1:41 ` Sasha Levin
2020-09-15 14:12 ` [PATCH 4.19 10/78] scsi: libsas: Set data_dir as DMA_NONE if libata marks qc as NODATA Greg Kroah-Hartman
2020-09-15 14:12 ` [PATCH 4.19 11/78] RDMA/core: Fix reported speed and width Greg Kroah-Hartman
2020-09-15 14:12 ` [PATCH 4.19 12/78] mmc: sdhci-msm: Add retries when all tuning phases are found valid Greg Kroah-Hartman
2020-09-15 14:12 ` [PATCH 4.19 13/78] ARM: dts: bcm: HR2: Fixed QSPI compatible string Greg Kroah-Hartman
2020-09-15 14:12 ` [PATCH 4.19 14/78] ARM: dts: NSP: " Greg Kroah-Hartman
2020-09-15 14:12 ` [PATCH 4.19 15/78] ARM: dts: BCM5301X: " Greg Kroah-Hartman
2020-09-15 14:12 ` [PATCH 4.19 16/78] arm64: dts: ns2: " Greg Kroah-Hartman
2020-09-15 14:12 ` [PATCH 4.19 17/78] ARC: HSDK: wireup perf irq Greg Kroah-Hartman
2020-09-15 14:12 ` [PATCH 4.19 18/78] dmaengine: acpi: Put the CSRT table after using it Greg Kroah-Hartman
2020-09-15 14:12 ` [PATCH 4.19 19/78] netfilter: conntrack: allow sctp hearbeat after connection re-use Greg Kroah-Hartman
2020-09-15 14:12 ` [PATCH 4.19 20/78] drivers/net/wan/lapbether: Added needed_tailroom Greg Kroah-Hartman
2020-09-15 14:12 ` [PATCH 4.19 21/78] NFC: st95hf: Fix memleak in st95hf_in_send_cmd Greg Kroah-Hartman
2020-09-15 14:12 ` [PATCH 4.19 22/78] firestream: Fix memleak in fs_open Greg Kroah-Hartman
2020-09-15 14:12 ` [PATCH 4.19 23/78] ALSA: hda: Fix 2 channel swapping for Tegra Greg Kroah-Hartman
2020-09-15 14:12 ` [PATCH 4.19 24/78] drivers/net/wan/lapbether: Set network_header before transmitting Greg Kroah-Hartman
2020-09-15 14:12 ` [PATCH 4.19 25/78] xfs: initialize the shortform attr header padding entry Greg Kroah-Hartman
2020-09-15 14:12 ` [PATCH 4.19 26/78] irqchip/eznps: Fix build error for !ARC700 builds Greg Kroah-Hartman
2020-09-15 14:12 ` [PATCH 4.19 27/78] nvme-fabrics: dont check state NVME_CTRL_NEW for request acceptance Greg Kroah-Hartman
2020-09-15 14:12 ` [PATCH 4.19 28/78] nvme: have nvme_wait_freeze_timeout return if it timed out Greg Kroah-Hartman
2020-09-16 7:34 ` Pavel Machek
2020-09-17 1:35 ` Sasha Levin
2020-09-15 14:12 ` [PATCH 4.19 29/78] nvme-rdma: serialize controller teardown sequences Greg Kroah-Hartman
2020-09-15 14:12 ` [PATCH 4.19 30/78] HID: quirks: Set INCREMENT_USAGE_ON_DUPLICATE for all Saitek X52 devices Greg Kroah-Hartman
2020-09-15 14:12 ` [PATCH 4.19 31/78] drivers/net/wan/hdlc_cisco: Add hard_header_len Greg Kroah-Hartman
2020-09-15 14:12 ` [PATCH 4.19 32/78] HID: elan: Fix memleak in elan_input_configured Greg Kroah-Hartman
2020-09-15 14:12 ` [PATCH 4.19 33/78] ARC: [plat-hsdk]: Switch ethernet phy-mode to rgmii-id Greg Kroah-Hartman
2020-09-15 14:12 ` [PATCH 4.19 34/78] cpufreq: intel_pstate: Refuse to turn off with HWP enabled Greg Kroah-Hartman
2020-09-15 14:13 ` [PATCH 4.19 35/78] cpufreq: intel_pstate: Fix intel_pstate_get_hwp_max() for turbo disabled Greg Kroah-Hartman
2020-09-15 14:13 ` [PATCH 4.19 36/78] ALSA: hda: fix a runtime pm issue in SOF when integrated GPU is disabled Greg Kroah-Hartman
2020-09-15 14:13 ` [PATCH 4.19 37/78] drm/amdgpu: Fix bug in reporting voltage for CIK Greg Kroah-Hartman
2020-09-15 14:13 ` [PATCH 4.19 38/78] iommu/amd: Do not use IOMMUv2 functionality when SME is active Greg Kroah-Hartman
2020-09-15 14:13 ` [PATCH 4.19 39/78] gcov: Disable gcov build with GCC 10 Greg Kroah-Hartman
2020-09-15 14:13 ` [PATCH 4.19 40/78] iio: adc: mcp3422: fix locking scope Greg Kroah-Hartman
2020-09-15 14:13 ` [PATCH 4.19 41/78] iio: adc: ti-ads1015: fix conversion when CONFIG_PM is not set Greg Kroah-Hartman
2020-09-15 14:13 ` [PATCH 4.19 42/78] iio:light:ltr501 Fix timestamp alignment issue Greg Kroah-Hartman
2020-09-15 14:13 ` [PATCH 4.19 43/78] iio:accel:bmc150-accel: Fix timestamp alignment and prevent data leak Greg Kroah-Hartman
2020-09-15 14:13 ` [PATCH 4.19 44/78] iio:adc:ti-adc084s021 Fix alignment and data leak issues Greg Kroah-Hartman
2020-09-15 14:13 ` [PATCH 4.19 45/78] iio:adc:ina2xx Fix timestamp alignment issue Greg Kroah-Hartman
2020-09-15 14:13 ` [PATCH 4.19 46/78] iio:adc:max1118 Fix alignment of timestamp and data leak issues Greg Kroah-Hartman
2020-09-15 14:13 ` [PATCH 4.19 47/78] iio:adc:ti-adc081c Fix alignment " Greg Kroah-Hartman
2020-09-15 14:13 ` [PATCH 4.19 48/78] iio:magnetometer:ak8975 " Greg Kroah-Hartman
2020-09-15 14:13 ` [PATCH 4.19 49/78] iio:light:max44000 Fix timestamp alignment and prevent data leak Greg Kroah-Hartman
2020-09-15 14:13 ` [PATCH 4.19 50/78] iio:chemical:ccs811: " Greg Kroah-Hartman
2020-09-15 14:13 ` [PATCH 4.19 51/78] iio: accel: kxsd9: Fix alignment of local buffer Greg Kroah-Hartman
2020-09-15 14:13 ` [PATCH 4.19 52/78] iio:accel:mma7455: Fix timestamp alignment and prevent data leak Greg Kroah-Hartman
2020-09-15 14:13 ` [PATCH 4.19 53/78] iio:accel:mma8452: " Greg Kroah-Hartman
2020-09-15 14:13 ` [PATCH 4.19 54/78] staging: wlan-ng: fix out of bounds read in prism2sta_probe_usb() Greg Kroah-Hartman
2020-09-15 14:13 ` [PATCH 4.19 55/78] btrfs: require only sector size alignment for parent eb bytenr Greg Kroah-Hartman
2020-09-15 14:13 ` Greg Kroah-Hartman [this message]
2020-09-15 14:13 ` [PATCH 4.19 57/78] btrfs: fix wrong address when faulting in pages in the search ioctl Greg Kroah-Hartman
2020-09-15 14:13 ` [PATCH 4.19 58/78] regulator: push allocation in set_consumer_device_supply() out of lock Greg Kroah-Hartman
2020-09-15 14:13 ` [PATCH 4.19 59/78] scsi: target: iscsi: Fix data digest calculation Greg Kroah-Hartman
2020-09-15 14:13 ` [PATCH 4.19 60/78] scsi: target: iscsi: Fix hang in iscsit_access_np() when getting tpg->np_login_sem Greg Kroah-Hartman
2020-09-15 14:13 ` [PATCH 4.19 61/78] drm/tve200: Stabilize enable/disable Greg Kroah-Hartman
2020-09-15 14:13 ` [PATCH 4.19 62/78] drm/msm: Disable preemption on all 5xx targets Greg Kroah-Hartman
2020-09-15 14:13 ` [PATCH 4.19 63/78] rbd: require global CAP_SYS_ADMIN for mapping and unmapping Greg Kroah-Hartman
2020-09-15 14:13 ` [PATCH 4.19 64/78] RDMA/rxe: Fix the parent sysfs read when the interface has 15 chars Greg Kroah-Hartman
2020-09-15 14:13 ` [PATCH 4.19 65/78] vgacon: remove software scrollback support Greg Kroah-Hartman
2020-09-15 14:13 ` [PATCH 4.19 66/78] fbcon: remove soft scrollback code Greg Kroah-Hartman
2020-09-16 7:57 ` Pavel Machek
2020-09-16 8:25 ` Greg Kroah-Hartman
2020-09-16 9:07 ` Pavel Machek
2020-09-16 9:14 ` Willy Tarreau
2020-09-23 8:44 ` Pavel Machek
2020-09-23 18:19 ` Linus Torvalds
2020-09-23 18:57 ` Daniel Vetter
2020-09-15 14:13 ` [PATCH 4.19 67/78] fbcon: remove now unusued softback_lines cursor() argument Greg Kroah-Hartman
2020-09-15 14:13 ` [PATCH 4.19 68/78] KVM: VMX: Dont freeze guest when event delivery causes an APIC-access exit Greg Kroah-Hartman
2020-09-15 14:13 ` [PATCH 4.19 69/78] ARM: dts: vfxxx: Add syscon compatible with OCOTP Greg Kroah-Hartman
2020-09-15 14:13 ` [PATCH 4.19 70/78] video: fbdev: fix OOB read in vga_8planes_imageblit() Greg Kroah-Hartman
2020-09-15 14:13 ` [PATCH 4.19 71/78] staging: greybus: audio: fix uninitialized value issue Greg Kroah-Hartman
2020-09-15 14:13 ` [PATCH 4.19 72/78] phy: qcom-qmp: Use correct values for ipq8074 PCIe Gen2 PHY init Greg Kroah-Hartman
2020-09-15 14:13 ` [PATCH 4.19 73/78] usb: core: fix slab-out-of-bounds Read in read_descriptors Greg Kroah-Hartman
2020-09-15 14:13 ` [PATCH 4.19 74/78] USB: serial: ftdi_sio: add IDs for Xsens Mti USB converter Greg Kroah-Hartman
2020-09-15 14:13 ` [PATCH 4.19 75/78] USB: serial: option: support dynamic Quectel USB compositions Greg Kroah-Hartman
2020-09-15 14:13 ` [PATCH 4.19 76/78] USB: serial: option: add support for SIM7070/SIM7080/SIM7090 modules Greg Kroah-Hartman
2020-09-15 14:13 ` [PATCH 4.19 77/78] usb: Fix out of sync data toggle if a configured device is reconfigured Greg Kroah-Hartman
2020-09-15 14:13 ` [PATCH 4.19 78/78] usb: typec: ucsi: acpi: Check the _DEP dependencies Greg Kroah-Hartman
2020-09-16 0:00 ` [PATCH 4.19 00/78] 4.19.146-rc1 review Shuah Khan
2020-09-16 8:16 ` Jon Hunter
2020-09-16 8:20 ` Pavel Machek
2020-09-17 14:31 ` Greg Kroah-Hartman
2020-09-16 10:49 ` Naresh Kamboju
2020-09-16 17:05 ` 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=20200915140636.377816311@linuxfoundation.org \
--to=gregkh@linuxfoundation.org \
--cc=anand.jain@oracle.com \
--cc=dsterba@suse.com \
--cc=josef@toxicpanda.com \
--cc=linux-kernel@vger.kernel.org \
--cc=nborisov@suse.com \
--cc=stable@vger.kernel.org \
/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.