On 11/22/18 8:54 PM, Shenghui Wang wrote: > A fresh backing device is not attached to any cache_set, and > has no writeback kthread created until first attached to some > cache_set. > > But bch_cached_dev_writeback_init run > " > dc->writeback_running = true; > WARN_ON(test_and_clear_bit(BCACHE_DEV_WB_RUNNING, > &dc->disk.flags)); > " > for any newly formatted backing devices. > > For a fresh standalone backing device, we can get something like > following even if no writeback kthread created: > ------------------------ > /sys/block/bcache0/bcache# cat writeback_running > 1 > /sys/block/bcache0/bcache# cat writeback_rate_debug > rate: 512.0k/sec > dirty: 0.0k > target: 0.0k > proportional: 0.0k > integral: 0.0k > change: 0.0k/sec > next io: -15427384ms > > The none ZERO fields are misleading as no alive writeback kthread yet. > > Set dc->writeback_running false as no writeback thread created in > bch_cached_dev_writeback_init(). > > We have writeback thread created and woken up in bch_cached_dev_writeback > _start(). Set dc->writeback_running true before bch_writeback_queue() > called, as a writeback thread will check if dc->writeback_running is true > before writing back dirty data, and hung if false detected. > > After the change, we can get the following output for a fresh standalone > backing device: > ----------------------- > /sys/block/bcache0/bcache$ cat writeback_running > 0 > /sys/block/bcache0/bcache# cat writeback_rate_debug > rate: 0.0k/sec > dirty: 0.0k > target: 0.0k > proportional: 0.0k > integral: 0.0k > change: 0.0k/sec > next io: 0ms > > v1 -> v2: > Set dc->writeback_running before bch_writeback_queue() called, > > Signed-off-by: Shenghui Wang <shhuiw@xxxxxxxxxxx> Add to my for-next, thanks. Coly Li > --- > drivers/md/bcache/writeback.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/drivers/md/bcache/writeback.c b/drivers/md/bcache/writeback.c > index 08c3a9f9676c..1696b212ec4e 100644 > --- a/drivers/md/bcache/writeback.c > +++ b/drivers/md/bcache/writeback.c > @@ -777,7 +777,7 @@ void bch_cached_dev_writeback_init(struct cached_dev *dc) > bch_keybuf_init(&dc->writeback_keys); > > dc->writeback_metadata = true; > - dc->writeback_running = true; > + dc->writeback_running = false; > dc->writeback_percent = 10; > dc->writeback_delay = 30; > atomic_long_set(&dc->writeback_rate.rate, 1024); > @@ -805,6 +805,7 @@ int bch_cached_dev_writeback_start(struct cached_dev *dc) > cached_dev_put(dc); > return PTR_ERR(dc->writeback_thread); > } > + dc->writeback_running = true; > > WARN_ON(test_and_set_bit(BCACHE_DEV_WB_RUNNING, &dc->disk.flags)); > schedule_delayed_work(&dc->writeback_rate_update, >