Re: [PATCH] bcache: do not mark writeback_running until backing dev attached to cache_set

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 10/9/18 8:36 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.
> 

Hi Shenghui,

> For a fresh standalone backing device, we can get something like
> following even if no writeback kthread created:
> ------------------------
> /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
> 

So the above output is OK for you?

> /sys/block/bcache0/bcache$ cat writeback_running
> 1
> 

I see, the out put here should be 0.

> Besides that, "echo 1 > writeback_running" will mark writeback_running
> when no writeback kthread created as "d_strtoul(writeback_running)" will
> simply set dc->writeback_running without checking the existence of
> dc->writeback_thread.
> 
> This patch fixes above 2 issues: for a fresh standalone backing device,
> * dc->writeback_running is set to false, until attached to cache_set.
> * "echo 1 > writeback_running" will not mark writeback_running.
> 
Yes, sounds reasonable.

> Signed-off-by: Shenghui Wang <shhuiw@xxxxxxxxxxx>
> ---
>  drivers/md/bcache/writeback.c | 2 +-
>  drivers/md/bcache/writeback.h | 5 ++++-
>  2 files changed, 5 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/md/bcache/writeback.c b/drivers/md/bcache/writeback.c
> index 08c3a9f9676c..2443621d07d6 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);
> diff --git a/drivers/md/bcache/writeback.h b/drivers/md/bcache/writeback.h

It is good to me to set dc->writeback_running to false here.

> index d2b9fdbc8994..0601fe1b40f4 100644
> --- a/drivers/md/bcache/writeback.h
> +++ b/drivers/md/bcache/writeback.h
> @@ -78,8 +78,11 @@ static inline bool should_writeback(struct cached_dev *dc, struct bio *bio,
>  
>  static inline void bch_writeback_queue(struct cached_dev *dc)
>  {
> -	if (!IS_ERR_OR_NULL(dc->writeback_thread))
> +	if (!IS_ERR_OR_NULL(dc->writeback_thread)) {
>  		wake_up_process(dc->writeback_thread);
> +		dc->writeback_running = true;
> +	} else
> +		dc->writeback_running = false;
>  }
> 

I have question for the above change.

Indeed once a wrteback thread is created, dc->writeback_runing will be
always true, and won't be false again. So I suggest to set
dc->writeback_runing to true in bch_cached_dev_writeback_start() after
dc->writeback_thread is created.

""echo 1 > writeback_running" will not mark writeback_running." should
be fixed in sysfs interface, somewhere in STORE(bch_cached_dev),
 386
 387         if (attr == &sysfs_writeback_running)
 388                 bch_writeback_queue(dc);
Don't touch bch_writeback_queue() for your fix :-)


Thanks for your changes, waiting for the update patches :-)

Coly Li






[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux ARM Kernel]     [Linux Filesystem Development]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux