Darrick J. Wong
b8233f7b2f
xfs: periodically yield scrub threads to the scheduler
...
[ Upstream commit 5d1116d4c6af3e580f1ed0382ca5a94bd65a34cf ]
Christoph Hellwig complained about the following soft lockup warning
when running scrub after generic/175 when preemption is disabled and
slub debugging is enabled:
watchdog: BUG: soft lockup - CPU#3 stuck for 22s! [xfs_scrub:161]
Modules linked in:
irq event stamp: 41692326
hardirqs last enabled at (41692325): [<ffffffff8232c3b7>] _raw_0
hardirqs last disabled at (41692326): [<ffffffff81001c5a>] trace0
softirqs last enabled at (41684994): [<ffffffff8260031f>] __do_e
softirqs last disabled at (41684987): [<ffffffff81127d8c>] irq_e0
CPU: 3 PID: 16189 Comm: xfs_scrub Not tainted 5.4.0-rc3+ #30
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.124
RIP: 0010:_raw_spin_unlock_irqrestore+0x39/0x40
Code: 89 f3 be 01 00 00 00 e8 d5 3a e5 fe 48 89 ef e8 ed 87 e5 f2
RSP: 0018:ffffc9000233f970 EFLAGS: 00000286 ORIG_RAX: ffffffffff3
RAX: ffff88813b398040 RBX: 0000000000000286 RCX: 0000000000000006
RDX: 0000000000000006 RSI: ffff88813b3988c0 RDI: ffff88813b398040
RBP: ffff888137958640 R08: 0000000000000001 R09: 0000000000000000
R10: 0000000000000000 R11: 0000000000000000 R12: ffffea00042b0c00
R13: 0000000000000001 R14: ffff88810ac32308 R15: ffff8881376fc040
FS: 00007f6113dea700(0000) GS:ffff88813bb80000(0000) knlGS:00000
CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 00007f6113de8ff8 CR3: 000000012f290000 CR4: 00000000000006e0
Call Trace:
free_debug_processing+0x1dd/0x240
__slab_free+0x231/0x410
kmem_cache_free+0x30e/0x360
xchk_ag_btcur_free+0x76/0xb0
xchk_ag_free+0x10/0x80
xchk_bmap_iextent_xref.isra.14+0xd9/0x120
xchk_bmap_iextent+0x187/0x210
xchk_bmap+0x2e0/0x3b0
xfs_scrub_metadata+0x2e7/0x500
xfs_ioc_scrub_metadata+0x4a/0xa0
xfs_file_ioctl+0x58a/0xcd0
do_vfs_ioctl+0xa0/0x6f0
ksys_ioctl+0x5b/0x90
__x64_sys_ioctl+0x11/0x20
do_syscall_64+0x4b/0x1a0
entry_SYSCALL_64_after_hwframe+0x49/0xbe
If preemption is disabled, all metadata buffers needed to perform the
scrub are already in memory, and there are a lot of records to check,
it's possible that the scrub thread will run for an extended period of
time without sleeping for IO or any other reason. Then the watchdog
timer or the RCU stall timeout can trigger, producing the backtrace
above.
To fix this problem, call cond_resched() from the scrub thread so that
we back out to the scheduler whenever necessary.
Reported-by: Christoph Hellwig <hch@infradead.org>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2020-01-09 10:20:06 +01:00
..
libxfs
xfs: don't check for AG deadlock for realtime files in bunmapi
2020-01-09 10:20:03 +01:00
scrub
xfs: periodically yield scrub threads to the scheduler
2020-01-09 10:20:06 +01:00
Kconfig
treewide: Add SPDX license identifier - Makefile/Kconfig
2019-05-21 10:50:46 +02:00
kmem.c
xfs: add kmem_alloc_io()
2019-08-26 17:43:15 -07:00
kmem.h
xfs: add kmem_alloc_io()
2019-08-26 17:43:15 -07:00
Makefile
xfs: move xfs_trans_inode.c to libxfs/
2019-07-15 08:10:18 -07:00
mrlock.h
xfs.h
xfs_acl.c
xfs: allocate xattr buffer on demand
2019-08-30 22:43:57 -07:00
xfs_acl.h
xfs_aops.c
for-linus-20190715
2019-07-15 21:20:52 -07:00
xfs_aops.h
xfs: remove the unused xfs_count_page_state declaration
2019-06-30 09:05:17 -07:00
xfs_attr_inactive.c
fs: xfs: Remove KM_NOSLEEP and KM_SLEEP.
2019-08-26 12:06:22 -07:00
xfs_attr_list.c
fs: xfs: Remove KM_NOSLEEP and KM_SLEEP.
2019-08-26 12:06:22 -07:00
xfs_bio_io.c
xfs: chain bios the right way around in xfs_rw_bdev
2019-07-10 10:04:16 -07:00
xfs_bmap_item.c
xfs: remove unnecessary int returns from deferred bmap functions
2019-08-28 08:31:02 -07:00
xfs_bmap_item.h
xfs: merge xfs_bud_init into xfs_trans_get_bud
2019-06-28 19:27:36 -07:00
xfs_bmap_util.c
xfs: Fix tail rounding in xfs_alloc_file_space()
2019-10-06 15:39:05 -07:00
xfs_bmap_util.h
xfs_buf.c
xfs: assure zeroed memory buffers for certain kmem allocations
2019-10-06 15:39:06 -07:00
xfs_buf.h
xfs: get allocation alignment from the buftarg
2019-08-26 17:43:14 -07:00
xfs_buf_item.c
fs: xfs: Remove KM_NOSLEEP and KM_SLEEP.
2019-08-26 12:06:22 -07:00
xfs_buf_item.h
xfs: remove the xfs_log_item_t typedef
2019-06-28 19:27:33 -07:00
xfs_dir2_readdir.c
xfs: remove unused header files
2019-06-28 19:30:43 -07:00
xfs_discard.c
xfs: remove unused header files
2019-06-28 19:30:43 -07:00
xfs_discard.h
xfs_dquot.c
xfs: remove all *_ITER_ABORT values
2019-08-29 21:22:41 -07:00
xfs_dquot.h
xfs: remove the debug-only q_transp field from struct xfs_dquot
2019-06-12 08:59:59 -07:00
xfs_dquot_item.c
fs: xfs: Remove KM_NOSLEEP and KM_SLEEP.
2019-08-26 12:06:22 -07:00
xfs_dquot_item.h
xfs: remove the xfs_log_item_t typedef
2019-06-28 19:27:33 -07:00
xfs_error.c
fs: xfs: Remove KM_NOSLEEP and KM_SLEEP.
2019-08-26 12:06:22 -07:00
xfs_error.h
xfs_export.c
xfs: remove unused header files
2019-06-28 19:30:43 -07:00
xfs_export.h
xfs_extent_busy.c
fs: xfs: Remove KM_NOSLEEP and KM_SLEEP.
2019-08-26 12:06:22 -07:00
xfs_extent_busy.h
xfs_extfree_item.c
fs: xfs: Remove KM_NOSLEEP and KM_SLEEP.
2019-08-26 12:06:22 -07:00
xfs_extfree_item.h
xfs: merge xfs_efd_init into xfs_trans_get_efd
2019-06-28 19:27:35 -07:00
xfs_file.c
New code for 5.4:
2019-09-25 09:01:43 -07:00
xfs_filestream.c
xfs: remove unused header files
2019-06-28 19:30:43 -07:00
xfs_filestream.h
xfs_fsmap.c
xfs: remove all *_ITER_CONTINUE values
2019-08-30 22:43:56 -07:00
xfs_fsmap.h
xfs_fsops.c
xfs: remove unused header files
2019-06-28 19:30:43 -07:00
xfs_fsops.h
xfs_globals.c
xfs: multithreaded iwalk implementation
2019-07-03 07:33:26 -07:00
xfs_health.c
xfs: introduce new v5 bulkstat structure
2019-07-03 20:36:26 -07:00
xfs_icache.c
fs: xfs: Remove KM_NOSLEEP and KM_SLEEP.
2019-08-26 12:06:22 -07:00
xfs_icache.h
xfs_icreate_item.c
fs: xfs: Remove KM_NOSLEEP and KM_SLEEP.
2019-08-26 12:06:22 -07:00
xfs_icreate_item.h
xfs_inode.c
xfs: Fix deadlock between AGI and AGF with RENAME_WHITEOUT
2019-09-03 21:07:25 -07:00
xfs_inode.h
xfs_inode_item.c
fs: xfs: Remove KM_NOSLEEP and KM_SLEEP.
2019-08-26 12:06:22 -07:00
xfs_inode_item.h
xfs: remove the xfs_log_item_t typedef
2019-06-28 19:27:33 -07:00
xfs_ioctl.c
New code for 5.4:
2019-09-18 18:32:43 -07:00
xfs_ioctl.h
xfs: introduce v5 inode group structure
2019-07-03 20:36:27 -07:00
xfs_ioctl32.c
fs: xfs: Remove KM_NOSLEEP and KM_SLEEP.
2019-08-26 12:06:22 -07:00
xfs_ioctl32.h
xfs: remove various bulk request typedef usage
2019-07-03 20:36:25 -07:00
xfs_iomap.c
xfs: add a xfs_valid_startblock helper
2019-09-03 08:13:13 -07:00
xfs_iomap.h
xfs_iops.c
xfs: fix missing ILOCK unlock when xfs_setattr_nonsize fails due to EDQUOT
2019-08-22 20:55:54 -07:00
xfs_iops.h
xfs_itable.c
xfs: remove all *_ITER_ABORT values
2019-08-29 21:22:41 -07:00
xfs_itable.h
xfs: remove all *_ITER_ABORT values
2019-08-29 21:22:41 -07:00
xfs_iwalk.c
xfs: remove all *_ITER_ABORT values
2019-08-29 21:22:41 -07:00
xfs_iwalk.h
xfs: remove all *_ITER_CONTINUE values
2019-08-30 22:43:56 -07:00
xfs_linux.h
xfs: use bios directly to read and write the log recovery buffers
2019-06-28 19:27:26 -07:00
xfs_log.c
xfs: fix mount failure crash on invalid iclog memory access
2020-01-04 19:18:43 +01:00
xfs_log.h
fs: xfs: xfs_log: Change return type from int to void
2019-07-03 08:21:58 -07:00
xfs_log_cil.c
fs: xfs: Remove KM_NOSLEEP and KM_SLEEP.
2019-08-26 12:06:22 -07:00
xfs_log_priv.h
fs: xfs: xfs_log: Change return type from int to void
2019-07-03 08:21:58 -07:00
xfs_log_recover.c
xfs: assure zeroed memory buffers for certain kmem allocations
2019-10-06 15:39:06 -07:00
xfs_message.c
xfs: remove unused header files
2019-06-28 19:30:43 -07:00
xfs_message.h
xfs_mount.c
xfs: Use WARN_ON_ONCE for bailout mount-operation
2019-09-05 21:36:12 -07:00
xfs_mount.h
xfs: add kmem allocation trace points
2019-08-26 17:43:14 -07:00
xfs_mru_cache.c
fs: xfs: Remove KM_NOSLEEP and KM_SLEEP.
2019-08-26 12:06:22 -07:00
xfs_mru_cache.h
xfs_ondisk.h
xfs: wire up the v5 inumbers ioctl
2019-07-03 20:36:28 -07:00
xfs_pnfs.c
fs/xfs: Fix return code of xfs_break_leased_layouts()
2019-08-19 18:15:28 -07:00
xfs_pnfs.h
xfs_pwork.c
xfs: poll waiting for quotacheck
2019-07-03 08:21:58 -07:00
xfs_pwork.h
xfs: poll waiting for quotacheck
2019-07-03 08:21:58 -07:00
xfs_qm.c
fs: xfs: Remove KM_NOSLEEP and KM_SLEEP.
2019-08-26 12:06:22 -07:00
xfs_qm.h
xfs_qm_bhv.c
xfs: remove unused header files
2019-06-28 19:30:43 -07:00
xfs_qm_syscalls.c
xfs: remove unused header files
2019-06-28 19:30:43 -07:00
xfs_quota.h
xfs_quotaops.c
xfs: remove unused header files
2019-06-28 19:30:43 -07:00
xfs_refcount_item.c
xfs: remove unnecessary int returns from deferred refcount functions
2019-08-28 08:31:02 -07:00
xfs_refcount_item.h
xfs: merge xfs_cud_init into xfs_trans_get_cud
2019-06-28 19:27:35 -07:00
xfs_reflink.c
xfs: remove unnecessary int returns from deferred bmap functions
2019-08-28 08:31:02 -07:00
xfs_reflink.h
xfs_rmap_item.c
fs: xfs: Remove KM_NOSLEEP and KM_SLEEP.
2019-08-26 12:06:22 -07:00
xfs_rmap_item.h
xfs: merge xfs_rud_init into xfs_trans_get_rud
2019-06-28 19:27:36 -07:00
xfs_rtalloc.c
fs: xfs: Remove KM_NOSLEEP and KM_SLEEP.
2019-08-26 12:06:22 -07:00
xfs_rtalloc.h
xfs_stats.c
xfs: remove unused header files
2019-06-28 19:30:43 -07:00
xfs_stats.h
xfs_super.c
y2038: add inode timestamp clamping
2019-09-19 09:42:37 -07:00
xfs_super.h
xfs: include WARN, REPAIR build options in XFS_BUILD_OPTIONS
2019-06-12 08:37:40 -07:00
xfs_symlink.c
xfs: remove unused header files
2019-06-28 19:30:43 -07:00
xfs_symlink.h
xfs_sysctl.c
xfs: remove unused header files
2019-06-28 19:30:43 -07:00
xfs_sysctl.h
xfs: multithreaded iwalk implementation
2019-07-03 07:33:26 -07:00
xfs_sysfs.c
xfs: avoid unused to_mp() function warning
2019-09-24 09:40:19 -07:00
xfs_sysfs.h
xfs_trace.c
xfs: remove unused header files
2019-06-28 19:30:43 -07:00
xfs_trace.h
xfs: add kmem_alloc_io()
2019-08-26 17:43:15 -07:00
xfs_trans.c
fs: xfs: Remove KM_NOSLEEP and KM_SLEEP.
2019-08-26 12:06:22 -07:00
xfs_trans.h
xfs: merge xfs_trans_bmap.c into xfs_bmap_item.c
2019-06-28 19:29:42 -07:00
xfs_trans_ail.c
xfs: remove the xfs_log_item_t typedef
2019-06-28 19:27:33 -07:00
xfs_trans_buf.c
xfs: remove unused header files
2019-06-28 19:30:43 -07:00
xfs_trans_dquot.c
fs: xfs: Remove KM_NOSLEEP and KM_SLEEP.
2019-08-26 12:06:22 -07:00
xfs_trans_priv.h
xfs: don't use xfs_trans_free_items in the commit path
2019-06-28 19:27:31 -07:00
xfs_xattr.c
xfs: allocate xattr buffer on demand
2019-08-30 22:43:57 -07:00