Patch "bcache: fix for gc and write-back race" has been added to the 4.4-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
bcache: fix for gc and write-back race
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
bcache-fix-for-gc-and-write-back-race.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
9baf30972b5568d8b5bc8b3c46a6ec5b58100463Mon Sep 17 00:00:00 2001
From: Tang Junhui <[email protected]>
Date: Wed, 6 Sep 2017 14:25:59 +0800
Subject: bcache: fix for gc and write-back race
From: Tang Junhui <[email protected]>
commit 9baf30972b5568d8b5bc8b3c46a6ec5b58100463 upstream.
gc and write-back get raced (see the email "bcache get stucked" I sended before):
gc thread write-back thread | |bch_writeback_thread() |bch_gc_thread() | | |==>read_dirty() |==>bch_btree_gc() | |==>btree_root() //get btree root | | //node write locker | |==>bch_btree_gc_root() | | |==>read_dirty_submit() | |==>write_dirty() | |==>continue_at(cl, | | write_dirty_finish, | | system_wq); | |==>write_dirty_finish()//excute | | //in system_wq | |==>bch_btree_insert() | |==>bch_btree_map_leaf_nodes() | |==>__bch_btree_map_nodes() | |==>btree_root //try to get btree | | //root node read | | //lock | |-----stuck here |==>bch_btree_set_root() |==>bch_journal_meta() |==>bch_journal() |==>journal_try_write() |==>journal_write_unlocked() //journal_full(&c->journal) | //condition satisfied |==>continue_at(cl, journal_write, system_wq); //try to excute | //journal_write in system_wq | //but work queue is excuting | //write_dirty_finish() |==>closure_sync(); //wait journal_write execute | //over and wake up gc, |-------------stuck here |==>release root node write locker
This patch alloc a separate work-queue for write-back thread to avoid such race.
(Commit log re-organized by Coly Li to pass checkpatch.pl checking)
--- drivers/md/bcache/bcache.h | 1 + drivers/md/bcache/super.c | 2 ++ drivers/md/bcache/writeback.c | 9 +++++++-- 3 files changed, 10 insertions(+), 2 deletions(-)
drivers/md/bcache/bcache.h +1 -0
@@ -333,6 +333,7 @@ struct cached_dev {/* Limit number of writeback bios in flight */ struct semaphore in_flight;struct task_struct *writeback_thread; +struct workqueue_struct *writeback_write_wq;struct keybuf writeback_keys;
drivers/md/bcache/super.c +2 -0
@@ -1056,6 +1056,8 @@ static void cached_dev_free(struct closucancel_delayed_work_sync (&dc->writeback_rate_update);if (!IS_ERR_OR_NULL (dc->writeback_thread))kthread_stop (dc->writeback_thread); +if (dc->writeback_write_wq) +destroy_workqueue (dc->writeback_write_wq);mutex_lock (&bch_register_lock);
drivers/md/bcache/writeback.c +7 -2
@@ -191,7 +191,7 @@ static void write_dirty(struct closure *closure_bio_submit (&io->bio, cl); -continue_at (cl, write_dirty_finish, system_wq); +continue_at (cl, write_dirty_finish, io->dc->writeback_write_wq); }static void read_dirty_endio (struct bio *bio)
@@ -211,7 +211,7 @@ static void read_dirty_submit(struct cloclosure_bio_submit (&io->bio, cl); -continue_at (cl, write_dirty, system_wq); +continue_at (cl, write_dirty, io->dc->writeback_write_wq); }static void read_dirty (struct cached_dev *dc)
@@ -523,6 +523,11 @@ void bch_cached_dev_writeback_init(strucint bch_cached_dev_writeback_start (struct cached_dev *dc) { + dc->writeback_write_wq =alloc_workqueue ("bcache_writeback_wq" , +WQ_MEM_RECLAIM ,0 ); +if (!dc->writeback_write_wq) +return -ENOMEM ; + dc->writeback_thread =kthread_create (bch_writeback_thread, dc,"bcache_writeback" );if (IS_ERR (dc->writeback_thread))
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/bcache-do-not-subtract-sectors_to_gc-for-bypassed-io.patch queue-4.4/bcache-correct-cache_dirty_target-in-__update_writeback_rate.patch queue-4.4/bcache-fix-for-gc-and-write-back-race.patch queue-4.4/bcache-initialize-dirty-stripes-in-flash_dev_run.patch