From: Michal Rostecki <mroste...@suse.com> Add a per-CPU inflight BIO counter to btrfs_device which stores the number of requests currently processed by the device. This information is going to be used in roundrobin raid1 read policy.
Signed-off-by: Michal Rostecki <mroste...@suse.com> --- fs/btrfs/volumes.c | 11 +++++++++-- fs/btrfs/volumes.h | 3 +++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index 3948f5b50d11..d4f452dcce95 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c @@ -376,6 +376,7 @@ void btrfs_free_device(struct btrfs_device *device) extent_io_tree_release(&device->alloc_state); bio_put(device->flush_bio); btrfs_destroy_dev_zone_info(device); + percpu_counter_destroy(&device->inflight); kfree(device); } @@ -439,6 +440,11 @@ static struct btrfs_device *__alloc_device(struct btrfs_fs_info *fs_info) extent_io_tree_init(fs_info, &dev->alloc_state, IO_TREE_DEVICE_ALLOC_STATE, NULL); + if (percpu_counter_init(&dev->inflight, 0, GFP_KERNEL)) { + kfree(dev); + return ERR_PTR(-ENOMEM); + } + return dev; } @@ -6305,6 +6311,7 @@ static inline void btrfs_end_bbio(struct btrfs_bio *bbio, struct bio *bio) static void btrfs_end_bio(struct bio *bio) { + struct btrfs_device *dev = btrfs_io_bio(bio)->device; struct btrfs_bio *bbio = bio->bi_private; int is_orig_bio = 0; @@ -6312,8 +6319,6 @@ static void btrfs_end_bio(struct bio *bio) atomic_inc(&bbio->error); if (bio->bi_status == BLK_STS_IOERR || bio->bi_status == BLK_STS_TARGET) { - struct btrfs_device *dev = btrfs_io_bio(bio)->device; - ASSERT(dev->bdev); if (bio_op(bio) == REQ_OP_WRITE) btrfs_dev_stat_inc_and_print(dev, @@ -6331,6 +6336,7 @@ static void btrfs_end_bio(struct bio *bio) is_orig_bio = 1; btrfs_bio_counter_dec(bbio->fs_info); + percpu_counter_dec(&dev->inflight); if (atomic_dec_and_test(&bbio->stripes_pending)) { if (!is_orig_bio) { @@ -6375,6 +6381,7 @@ static void submit_stripe_bio(struct btrfs_bio *bbio, struct bio *bio, bio_set_dev(bio, dev->bdev); btrfs_bio_counter_inc_noblocked(fs_info); + percpu_counter_inc(&dev->inflight); btrfsic_submit_bio(bio); } diff --git a/fs/btrfs/volumes.h b/fs/btrfs/volumes.h index 04e2b26823c2..938c5292250c 100644 --- a/fs/btrfs/volumes.h +++ b/fs/btrfs/volumes.h @@ -143,6 +143,9 @@ struct btrfs_device { struct completion kobj_unregister; /* For sysfs/FSID/devinfo/devid/ */ struct kobject devid_kobj; + + /* I/O stats for raid1 mirror selection */ + struct percpu_counter inflight; }; /* -- 2.30.0