bcache: initialize dirty stripes in flash_dev_run()
authorTang Junhui <tang.junhui@zte.com.cn>
Wed, 6 Sep 2017 17:28:53 +0000 (01:28 +0800)
committerJens Axboe <axboe@kernel.dk>
Thu, 7 Sep 2017 19:32:29 +0000 (13:32 -0600)
bcache uses a Proportion-Differentiation Controller algorithm to control
writeback rate to cached devices. In the PD controller algorithm, dirty
stripes of thin flash device should not be counted in, because flash only
volumes never write back dirty data.

Currently dirty stripe counter for thin flash device is not initialized
when the thin flash device starts. Which means the following calculation
in PD controller will reference an undefined dirty stripes number, and
all cached devices attached to the same cache set where the thin flash
device lies on may have an inaccurate writeback rate.

This patch calles bch_sectors_dirty_init() in flash_dev_run(), to
correctly initialize dirty stripe counter when the thin flash device
starts to run. This patch also does following parameter data type change,
 -void bch_sectors_dirty_init(struct cached_dev *dc);
 +void bch_sectors_dirty_init(struct bcache_device *);
to call this function conveniently in flash_dev_run().

(Commit log is composed by Coly Li)

Signed-off-by: Tang Junhui <tang.junhui@zte.com.cn>
Reviewed-by: Coly Li <colyli@suse.de>
Cc: stable@vger.kernel.org
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/md/bcache/super.c
drivers/md/bcache/writeback.c
drivers/md/bcache/writeback.h

index 1ae63374366c9d661ec42b7d7ab691d4f4c2bab6..fc0a31b13ac423bef0dceb21f6748e44037341f4 100644 (file)
@@ -1026,7 +1026,7 @@ int bch_cached_dev_attach(struct cached_dev *dc, struct cache_set *c)
        }
 
        if (BDEV_STATE(&dc->sb) == BDEV_STATE_DIRTY) {
-               bch_sectors_dirty_init(dc);
+               bch_sectors_dirty_init(&dc->disk);
                atomic_set(&dc->has_dirty, 1);
                atomic_inc(&dc->count);
                bch_writeback_queue(dc);
@@ -1230,6 +1230,7 @@ static int flash_dev_run(struct cache_set *c, struct uuid_entry *u)
                goto err;
 
        bcache_device_attach(d, c, u - c->uuids);
+       bch_sectors_dirty_init(d);
        bch_flash_dev_request_init(d);
        add_disk(d->disk);
 
index 34131439e28cc81630954b4dfbf40d221abfb024..e663ca082183e6a126305fd62757ad538111cd9f 100644 (file)
@@ -482,17 +482,17 @@ static int sectors_dirty_init_fn(struct btree_op *_op, struct btree *b,
        return MAP_CONTINUE;
 }
 
-void bch_sectors_dirty_init(struct cached_dev *dc)
+void bch_sectors_dirty_init(struct bcache_device *d)
 {
        struct sectors_dirty_init op;
 
        bch_btree_op_init(&op.op, -1);
-       op.inode = dc->disk.id;
+       op.inode = d->id;
 
-       bch_btree_map_keys(&op.op, dc->disk.c, &KEY(op.inode, 0, 0),
+       bch_btree_map_keys(&op.op, d->c, &KEY(op.inode, 0, 0),
                           sectors_dirty_init_fn, 0);
 
-       dc->disk.sectors_dirty_last = bcache_dev_sectors_dirty(&dc->disk);
+       d->sectors_dirty_last = bcache_dev_sectors_dirty(d);
 }
 
 void bch_cached_dev_writeback_init(struct cached_dev *dc)
index 8789b9c8c48406ba4db49d5f7c5874e6997dabcc..e35421d20d2eb32b75d48707fe00ecb7f4fdfb72 100644 (file)
@@ -103,7 +103,7 @@ static inline void bch_writeback_add(struct cached_dev *dc)
 
 void bcache_dev_sectors_dirty_add(struct cache_set *, unsigned, uint64_t, int);
 
-void bch_sectors_dirty_init(struct cached_dev *dc);
+void bch_sectors_dirty_init(struct bcache_device *);
 void bch_cached_dev_writeback_init(struct cached_dev *);
 int bch_cached_dev_writeback_start(struct cached_dev *);