linux/drivers/md/bcache
Andrea Righi 84c529aea1 bcache: fix deadlock in bcache_allocator
bcache_allocator can call the following:

 bch_allocator_thread()
  -> bch_prio_write()
     -> bch_bucket_alloc()
        -> wait on &ca->set->bucket_wait

But the wake up event on bucket_wait is supposed to come from
bch_allocator_thread() itself => deadlock:

[ 1158.490744] INFO: task bcache_allocato:15861 blocked for more than 10 seconds.
[ 1158.495929]       Not tainted 5.3.0-050300rc3-generic #201908042232
[ 1158.500653] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
[ 1158.504413] bcache_allocato D    0 15861      2 0x80004000
[ 1158.504419] Call Trace:
[ 1158.504429]  __schedule+0x2a8/0x670
[ 1158.504432]  schedule+0x2d/0x90
[ 1158.504448]  bch_bucket_alloc+0xe5/0x370 [bcache]
[ 1158.504453]  ? wait_woken+0x80/0x80
[ 1158.504466]  bch_prio_write+0x1dc/0x390 [bcache]
[ 1158.504476]  bch_allocator_thread+0x233/0x490 [bcache]
[ 1158.504491]  kthread+0x121/0x140
[ 1158.504503]  ? invalidate_buckets+0x890/0x890 [bcache]
[ 1158.504506]  ? kthread_park+0xb0/0xb0
[ 1158.504510]  ret_from_fork+0x35/0x40

Fix by making the call to bch_prio_write() non-blocking, so that
bch_allocator_thread() never waits on itself.

Moreover, make sure to wake up the garbage collector thread when
bch_prio_write() is failing to allocate buckets.

BugLink: https://bugs.launchpad.net/bugs/1784665
BugLink: https://bugs.launchpad.net/bugs/1796292
Signed-off-by: Andrea Righi <andrea.righi@canonical.com>
Signed-off-by: Coly Li <colyli@suse.de>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
2019-11-13 15:42:50 -07:00
..
alloc.c bcache: fix deadlock in bcache_allocator 2019-11-13 15:42:50 -07:00
bcache.h bcache: fix deadlock in bcache_allocator 2019-11-13 15:42:50 -07:00
bset.c bcache: add code comment bch_keylist_pop() and bch_keylist_pop_front() 2019-11-13 15:42:50 -07:00
bset.h bcache: fix stack corruption by PRECEDING_KEY() 2019-06-13 03:09:14 -06:00
btree.c bcache: fix a lost wake-up problem caused by mca_cannibalize_lock 2019-11-13 15:42:50 -07:00
btree.h bcache: fix race in btree_flush_write() 2019-06-28 07:39:18 -06:00
closure.c closures: fix a race on wakeup from closure_sync 2019-09-03 08:08:31 -06:00
closure.h bcache: fix typo in code comments of closure_return_with_destructor() 2018-10-08 08:19:43 -06:00
debug.c bcache: Fix an error code in bch_dump_read() 2019-09-03 08:08:29 -06:00
debug.h bcache: add identifier names to arguments of function definitions 2018-08-11 15:46:41 -06:00
extents.c bcache: treat stale && dirty keys as bad keys 2019-02-09 07:18:31 -07:00
extents.h bcache: add identifier names to arguments of function definitions 2018-08-11 15:46:41 -06:00
io.c bcache: ignore read-ahead request failure on backing device 2019-06-28 07:39:14 -06:00
journal.c bcache: add reclaimed_journal_buckets to struct cache_set 2019-06-28 07:39:18 -06:00
journal.h bcache: fix fifo index swapping condition in journal_pin_cmp() 2019-11-13 15:42:49 -07:00
Kconfig treewide: Add SPDX license identifier - Makefile/Kconfig 2019-05-21 10:50:46 +02:00
Makefile License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
movinggc.c bcache: style fix to add a blank line after declarations 2018-08-11 15:46:41 -06:00
request.c bcache: deleted code comments for dead code in bch_data_insert_keys() 2019-11-13 15:42:50 -07:00
request.h bcache: Clean up bch_get_congested() 2019-04-24 10:56:27 -06:00
stats.c bcache: not use hard coded memset size in bch_cache_accounting_clear() 2019-02-09 07:18:31 -07:00
stats.h bcache: add identifier names to arguments of function definitions 2018-08-11 15:46:41 -06:00
super.c bcache: fix deadlock in bcache_allocator 2019-11-13 15:42:50 -07:00
sysfs.c for-5.4/block-2019-09-16 2019-09-17 16:57:47 -07:00
sysfs.h bcache: add sysfs_strtoul_bool() for setting bit-field variables 2019-02-09 07:18:32 -07:00
trace.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
util.c bcache: avoid to use bio_for_each_segment_all() in bch_bio_alloc_pages() 2019-02-15 08:40:11 -07:00
util.h bcache: Revert "bcache: fix high CPU occupancy during journal" 2019-06-28 07:39:17 -06:00
writeback.c bcache: fix potential deadlock in cached_def_free() 2019-06-28 07:39:16 -06:00
writeback.h bcache: never writeback a discard operation 2019-02-09 07:18:31 -07:00