[Drbd-dev] [RFC] block: Change the granularity of io ticks from ms to ns
Yu Kuai
yukuai1 at huaweicloud.com
Wed Dec 7 03:19:08 CET 2022
Hi,
在 2022/12/07 2:15, Gulam Mohamed 写道:
> Use ktime to change the granularity of IO accounting in block layer from
> milli-seconds to nano-seconds to get the proper latency values for the
> devices whose latency is in micro-seconds. After changing the granularity
> to nano-seconds the iostat command, which was showing incorrect values for
> %util, is now showing correct values.
This patch didn't correct the counting of io_ticks, just make the
error accounting from jiffies(ms) to ns. The problem that util can be
smaller or larger still exist.
However, I think this change make sense consider that error margin is
much smaller, and performance overhead should be minimum.
Hi, Ming, how do you think?
>
> We did not work on the patch to drop the logic for
> STAT_PRECISE_TIMESTAMPS yet. Will do it if this patch is ok.
>
> The iostat command was run after starting the fio with following command
> on an NVME disk. For the same fio command, the iostat %util was showing
> ~100% for the disks whose latencies are in the range of microseconds.
> With the kernel changes (granularity to nano-seconds), the %util was
> showing correct values. Following are the details of the test and their
> output:
>
> fio command
> -----------
> [global]
> bs=128K
> iodepth=1
> direct=1
> ioengine=libaio
> group_reporting
> time_based
> runtime=90
> thinktime=1ms
> numjobs=1
> name=raw-write
> rw=randrw
> ignore_error=EIO:EIO
> [job1]
> filename=/dev/nvme0n1
>
> Correct values after kernel changes:
> ====================================
> iostat output
> -------------
> iostat -d /dev/nvme0n1 -x 1
>
> Device r_await w_await aqu-sz rareq-sz wareq-sz svctm %util
> nvme0n1 0.08 0.05 0.06 128.00 128.00 0.07 6.50
>
> Device r_await w_await aqu-sz rareq-sz wareq-sz svctm %util
> nvme0n1 0.08 0.06 0.06 128.00 128.00 0.07 6.30
>
> Device r_await w_await aqu-sz rareq-sz wareq-sz svctm %util
> nvme0n1 0.06 0.05 0.06 128.00 128.00 0.06 5.70
>
>>From fio
> --------
> Read Latency: clat (usec): min=32, max=2335, avg=79.54, stdev=29.95
> Write Latency: clat (usec): min=38, max=130, avg=57.76, stdev= 3.25
>
> Values before kernel changes
> ============================
> iostat output
> -------------
>
> iostat -d /dev/nvme0n1 -x 1
>
> Device r_await w_await aqu-sz rareq-sz wareq-sz svctm %util
> nvme0n1 0.08 0.06 0.06 128.00 128.00 1.07 97.70
>
> Device r_await w_await aqu-sz rareq-sz wareq-sz svctm %util
> nvme0n1 0.08 0.06 0.06 128.00 128.00 1.08 98.80
>
> Device r_await w_await aqu-sz rareq-sz wareq-sz svctm %util
> nvme0n1 0.08 0.05 0.06 128.00 128.00 1.06 97.20
>
>>From fio
> --------
> Read Latency: clat (usec): min=33, max=468, avg=79.56, stdev=28.04
> Write Latency: clat (usec): min=9, max=139, avg=57.10, stdev= 3.79
>
> Signed-off-by: Junxiao Bi <junxiao.bi at oracle.com>
> Signed-off-by: Gulam Mohamed <gulam.mohamed at oracle.com>
> ---
> block/blk-core.c | 26 +++++++++++++-------------
> block/blk-mq.c | 4 ++--
> block/blk.h | 2 +-
> block/genhd.c | 8 ++++----
> drivers/block/drbd/drbd_debugfs.c | 4 ++--
> drivers/block/drbd/drbd_int.h | 2 +-
> drivers/block/zram/zram_drv.c | 4 ++--
> drivers/md/bcache/request.c | 10 +++++-----
> drivers/md/dm-core.h | 2 +-
> drivers/md/dm.c | 8 ++++----
> drivers/md/md.h | 2 +-
> drivers/md/raid1.h | 2 +-
> drivers/md/raid10.h | 2 +-
> drivers/md/raid5.c | 2 +-
> drivers/nvdimm/btt.c | 2 +-
> drivers/nvdimm/pmem.c | 2 +-
> include/linux/blk_types.h | 2 +-
> include/linux/blkdev.h | 14 +++++++-------
> include/linux/part_stat.h | 2 +-
> 19 files changed, 50 insertions(+), 50 deletions(-)
>
> diff --git a/block/blk-core.c b/block/blk-core.c
> index 5487912befe8..069c29dad3e7 100644
> --- a/block/blk-core.c
> +++ b/block/blk-core.c
> @@ -912,12 +912,12 @@ int iocb_bio_iopoll(struct kiocb *kiocb, struct io_comp_batch *iob,
> }
> EXPORT_SYMBOL_GPL(iocb_bio_iopoll);
>
> -void update_io_ticks(struct block_device *part, unsigned long now, bool end)
> +void update_io_ticks(struct block_device *part, u64 now, bool end)
> {
> - unsigned long stamp;
> + u64 stamp;
> again:
> stamp = READ_ONCE(part->bd_stamp);
> - if (unlikely(time_after(now, stamp))) {
> + if (unlikely(time_after64(now, stamp))) {
> if (likely(try_cmpxchg(&part->bd_stamp, &stamp, now)))
> __part_stat_add(part, io_ticks, end ? now - stamp : 1);
> }
> @@ -927,9 +927,9 @@ void update_io_ticks(struct block_device *part, unsigned long now, bool end)
> }
> }
>
> -unsigned long bdev_start_io_acct(struct block_device *bdev,
> +u64 bdev_start_io_acct(struct block_device *bdev,
> unsigned int sectors, enum req_op op,
> - unsigned long start_time)
> + u64 start_time)
> {
> const int sgrp = op_stat_group(op);
>
> @@ -949,7 +949,7 @@ EXPORT_SYMBOL(bdev_start_io_acct);
> * @bio: bio to start account for
> * @start_time: start time that should be passed back to bio_end_io_acct().
> */
> -void bio_start_io_acct_time(struct bio *bio, unsigned long start_time)
> +void bio_start_io_acct_time(struct bio *bio, u64 start_time)
> {
> bdev_start_io_acct(bio->bi_bdev, bio_sectors(bio),
> bio_op(bio), start_time);
> @@ -962,29 +962,29 @@ EXPORT_SYMBOL_GPL(bio_start_io_acct_time);
> *
> * Returns the start time that should be passed back to bio_end_io_acct().
> */
> -unsigned long bio_start_io_acct(struct bio *bio)
> +u64 bio_start_io_acct(struct bio *bio)
> {
> return bdev_start_io_acct(bio->bi_bdev, bio_sectors(bio),
> - bio_op(bio), jiffies);
> + bio_op(bio), ktime_get_ns());
> }
> EXPORT_SYMBOL_GPL(bio_start_io_acct);
>
> void bdev_end_io_acct(struct block_device *bdev, enum req_op op,
> - unsigned long start_time)
> + u64 start_time)
> {
> const int sgrp = op_stat_group(op);
> - unsigned long now = READ_ONCE(jiffies);
> - unsigned long duration = now - start_time;
> + u64 now = ktime_get_ns();
> + u64 duration = now - start_time;
>
> part_stat_lock();
> update_io_ticks(bdev, now, true);
> - part_stat_add(bdev, nsecs[sgrp], jiffies_to_nsecs(duration));
> + part_stat_add(bdev, nsecs[sgrp], duration);
> part_stat_local_dec(bdev, in_flight[op_is_write(op)]);
> part_stat_unlock();
> }
> EXPORT_SYMBOL(bdev_end_io_acct);
>
> -void bio_end_io_acct_remapped(struct bio *bio, unsigned long start_time,
> +void bio_end_io_acct_remapped(struct bio *bio, u64 start_time,
> struct block_device *orig_bdev)
> {
> bdev_end_io_acct(orig_bdev, bio_op(bio), start_time);
> diff --git a/block/blk-mq.c b/block/blk-mq.c
> index 228a6696d835..45bc2fc3d4e7 100644
> --- a/block/blk-mq.c
> +++ b/block/blk-mq.c
> @@ -948,7 +948,7 @@ static void __blk_account_io_done(struct request *req, u64 now)
> const int sgrp = op_stat_group(req_op(req));
>
> part_stat_lock();
> - update_io_ticks(req->part, jiffies, true);
> + update_io_ticks(req->part, ktime_get_ns(), true);
> part_stat_inc(req->part, ios[sgrp]);
> part_stat_add(req->part, nsecs[sgrp], now - req->start_time_ns);
> part_stat_unlock();
> @@ -980,7 +980,7 @@ static void __blk_account_io_start(struct request *rq)
> rq->part = rq->q->disk->part0;
>
> part_stat_lock();
> - update_io_ticks(rq->part, jiffies, false);
> + update_io_ticks(rq->part, ktime_get_ns(), false);
> part_stat_unlock();
> }
>
> diff --git a/block/blk.h b/block/blk.h
> index a186ea20f39d..938607c9964a 100644
> --- a/block/blk.h
> +++ b/block/blk.h
> @@ -345,7 +345,7 @@ static inline bool blk_do_io_stat(struct request *rq)
> return (rq->rq_flags & RQF_IO_STAT) && !blk_rq_is_passthrough(rq);
> }
>
> -void update_io_ticks(struct block_device *part, unsigned long now, bool end);
> +void update_io_ticks(struct block_device *part, u64 now, bool end);
>
> static inline void req_set_nomerge(struct request_queue *q, struct request *req)
> {
> diff --git a/block/genhd.c b/block/genhd.c
> index 0f9769db2de8..0fb2a3dcbe9d 100644
> --- a/block/genhd.c
> +++ b/block/genhd.c
> @@ -956,7 +956,7 @@ ssize_t part_stat_show(struct device *dev,
>
> if (inflight) {
> part_stat_lock();
> - update_io_ticks(bdev, jiffies, true);
> + update_io_ticks(bdev, ktime_get_ns(), true);
> part_stat_unlock();
> }
> part_stat_read_all(bdev, &stat);
> @@ -976,7 +976,7 @@ ssize_t part_stat_show(struct device *dev,
> (unsigned long long)stat.sectors[STAT_WRITE],
> (unsigned int)div_u64(stat.nsecs[STAT_WRITE], NSEC_PER_MSEC),
> inflight,
> - jiffies_to_msecs(stat.io_ticks),
> + (unsigned int)div_u64(stat.io_ticks, NSEC_PER_MSEC),
> (unsigned int)div_u64(stat.nsecs[STAT_READ] +
> stat.nsecs[STAT_WRITE] +
> stat.nsecs[STAT_DISCARD] +
> @@ -1245,7 +1245,7 @@ static int diskstats_show(struct seq_file *seqf, void *v)
>
> if (inflight) {
> part_stat_lock();
> - update_io_ticks(hd, jiffies, true);
> + update_io_ticks(hd, ktime_get_ns(), true);
> part_stat_unlock();
> }
> part_stat_read_all(hd, &stat);
> @@ -1268,7 +1268,7 @@ static int diskstats_show(struct seq_file *seqf, void *v)
> (unsigned int)div_u64(stat.nsecs[STAT_WRITE],
> NSEC_PER_MSEC),
> inflight,
> - jiffies_to_msecs(stat.io_ticks),
> + (unsigned int)div_u64(stat.io_ticks, NSEC_PER_MSEC),
> (unsigned int)div_u64(stat.nsecs[STAT_READ] +
> stat.nsecs[STAT_WRITE] +
> stat.nsecs[STAT_DISCARD] +
> diff --git a/drivers/block/drbd/drbd_debugfs.c b/drivers/block/drbd/drbd_debugfs.c
> index b3b9cd5628fd..5359c04e658b 100644
> --- a/drivers/block/drbd/drbd_debugfs.c
> +++ b/drivers/block/drbd/drbd_debugfs.c
> @@ -105,7 +105,7 @@ static void seq_print_one_request(struct seq_file *m, struct drbd_request *req,
> (s & RQ_WRITE) ? "W" : "R");
>
> #define RQ_HDR_2 "\tstart\tin AL\tsubmit"
> - seq_printf(m, "\t%d", jiffies_to_msecs(now - req->start_jif));
> + seq_printf(m, "\t%d", jiffies_to_msecs(now - nsecs_to_jiffies(req->start_jif)));
> seq_print_age_or_dash(m, s & RQ_IN_ACT_LOG, now - req->in_actlog_jif);
> seq_print_age_or_dash(m, s & RQ_LOCAL_PENDING, now - req->pre_submit_jif);
>
> @@ -171,7 +171,7 @@ static void seq_print_waiting_for_AL(struct seq_file *m, struct drbd_resource *r
> /* if the oldest request does not wait for the activity log
> * it is not interesting for us here */
> if (req && !(req->rq_state & RQ_IN_ACT_LOG))
> - jif = req->start_jif;
> + jif = nsecs_to_jiffies(req->start_jif);
> else
> req = NULL;
> spin_unlock_irq(&device->resource->req_lock);
> diff --git a/drivers/block/drbd/drbd_int.h b/drivers/block/drbd/drbd_int.h
> index 4d661282ff41..1d605c47c592 100644
> --- a/drivers/block/drbd/drbd_int.h
> +++ b/drivers/block/drbd/drbd_int.h
> @@ -300,7 +300,7 @@ struct drbd_request {
> struct list_head req_pending_local;
>
> /* for generic IO accounting */
> - unsigned long start_jif;
> + u64 start_jif;
>
> /* for DRBD internal statistics */
>
> diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c
> index 966aab902d19..5376b67b88c6 100644
> --- a/drivers/block/zram/zram_drv.c
> +++ b/drivers/block/zram/zram_drv.c
> @@ -1662,7 +1662,7 @@ static int zram_rw_page(struct block_device *bdev, sector_t sector,
> u32 index;
> struct zram *zram;
> struct bio_vec bv;
> - unsigned long start_time;
> + u64 start_time;
>
> if (PageTransHuge(page))
> return -ENOTSUPP;
> @@ -1682,7 +1682,7 @@ static int zram_rw_page(struct block_device *bdev, sector_t sector,
> bv.bv_offset = 0;
>
> start_time = bdev_start_io_acct(bdev->bd_disk->part0,
> - SECTORS_PER_PAGE, op, jiffies);
> + SECTORS_PER_PAGE, op, ktime_get_ns());
> ret = zram_bvec_rw(zram, &bv, index, offset, op, NULL);
> bdev_end_io_acct(bdev->bd_disk->part0, op, start_time);
> out:
> diff --git a/drivers/md/bcache/request.c b/drivers/md/bcache/request.c
> index 3427555b0cca..8798b1eb6d2d 100644
> --- a/drivers/md/bcache/request.c
> +++ b/drivers/md/bcache/request.c
> @@ -476,7 +476,7 @@ struct search {
> unsigned int cache_missed:1;
>
> struct block_device *orig_bdev;
> - unsigned long start_time;
> + u64 start_time;
>
> struct btree_op op;
> struct data_insert_op iop;
> @@ -714,7 +714,7 @@ static void search_free(struct closure *cl)
>
> static inline struct search *search_alloc(struct bio *bio,
> struct bcache_device *d, struct block_device *orig_bdev,
> - unsigned long start_time)
> + u64 start_time)
> {
> struct search *s;
>
> @@ -1065,7 +1065,7 @@ static void cached_dev_nodata(struct closure *cl)
>
> struct detached_dev_io_private {
> struct bcache_device *d;
> - unsigned long start_time;
> + u64 start_time;
> bio_end_io_t *bi_end_io;
> void *bi_private;
> struct block_device *orig_bdev;
> @@ -1094,7 +1094,7 @@ static void detached_dev_end_io(struct bio *bio)
> }
>
> static void detached_dev_do_request(struct bcache_device *d, struct bio *bio,
> - struct block_device *orig_bdev, unsigned long start_time)
> + struct block_device *orig_bdev, u64 start_time)
> {
> struct detached_dev_io_private *ddip;
> struct cached_dev *dc = container_of(d, struct cached_dev, disk);
> @@ -1173,7 +1173,7 @@ void cached_dev_submit_bio(struct bio *bio)
> struct block_device *orig_bdev = bio->bi_bdev;
> struct bcache_device *d = orig_bdev->bd_disk->private_data;
> struct cached_dev *dc = container_of(d, struct cached_dev, disk);
> - unsigned long start_time;
> + u64 start_time;
> int rw = bio_data_dir(bio);
>
> if (unlikely((d->c && test_bit(CACHE_SET_IO_DISABLE, &d->c->flags)) ||
> diff --git a/drivers/md/dm-core.h b/drivers/md/dm-core.h
> index 6c6bd24774f2..e620fd878b08 100644
> --- a/drivers/md/dm-core.h
> +++ b/drivers/md/dm-core.h
> @@ -284,7 +284,7 @@ struct dm_io {
> unsigned short magic;
> blk_short_t flags;
> spinlock_t lock;
> - unsigned long start_time;
> + u64 start_time;
> void *data;
> struct dm_io *next;
> struct dm_stats_aux stats_aux;
> diff --git a/drivers/md/dm.c b/drivers/md/dm.c
> index 95a1ee3d314e..dacd8eaadf73 100644
> --- a/drivers/md/dm.c
> +++ b/drivers/md/dm.c
> @@ -482,7 +482,7 @@ static int dm_blk_ioctl(struct block_device *bdev, fmode_t mode,
>
> u64 dm_start_time_ns_from_clone(struct bio *bio)
> {
> - return jiffies_to_nsecs(clone_to_tio(bio)->io->start_time);
> + return clone_to_tio(bio)->io->start_time;
> }
> EXPORT_SYMBOL_GPL(dm_start_time_ns_from_clone);
>
> @@ -494,7 +494,7 @@ static bool bio_is_flush_with_data(struct bio *bio)
> static void dm_io_acct(struct dm_io *io, bool end)
> {
> struct dm_stats_aux *stats_aux = &io->stats_aux;
> - unsigned long start_time = io->start_time;
> + u64 start_time = io->start_time;
> struct mapped_device *md = io->md;
> struct bio *bio = io->orig_bio;
> unsigned int sectors;
> @@ -527,7 +527,7 @@ static void dm_io_acct(struct dm_io *io, bool end)
>
> dm_stats_account_io(&md->stats, bio_data_dir(bio),
> sector, sectors,
> - end, start_time, stats_aux);
> + end, nsecs_to_jiffies(start_time), stats_aux);
> }
> }
>
> @@ -589,7 +589,7 @@ static struct dm_io *alloc_io(struct mapped_device *md, struct bio *bio)
> io->orig_bio = bio;
> io->md = md;
> spin_lock_init(&io->lock);
> - io->start_time = jiffies;
> + io->start_time = ktime_get_ns();
> io->flags = 0;
>
> if (static_branch_unlikely(&stats_enabled))
> diff --git a/drivers/md/md.h b/drivers/md/md.h
> index b4e2d8b87b61..f129e0ae59da 100644
> --- a/drivers/md/md.h
> +++ b/drivers/md/md.h
> @@ -711,7 +711,7 @@ struct md_thread {
>
> struct md_io_acct {
> struct bio *orig_bio;
> - unsigned long start_time;
> + u64 start_time;
> struct bio bio_clone;
> };
>
> diff --git a/drivers/md/raid1.h b/drivers/md/raid1.h
> index ebb6788820e7..0fb5a1148745 100644
> --- a/drivers/md/raid1.h
> +++ b/drivers/md/raid1.h
> @@ -157,7 +157,7 @@ struct r1bio {
> sector_t sector;
> int sectors;
> unsigned long state;
> - unsigned long start_time;
> + u64 start_time;
> struct mddev *mddev;
> /*
> * original bio going to /dev/mdx
> diff --git a/drivers/md/raid10.h b/drivers/md/raid10.h
> index 8c072ce0bc54..4cf3eec89bf3 100644
> --- a/drivers/md/raid10.h
> +++ b/drivers/md/raid10.h
> @@ -123,7 +123,7 @@ struct r10bio {
> sector_t sector; /* virtual sector number */
> int sectors;
> unsigned long state;
> - unsigned long start_time;
> + u64 start_time;
> struct mddev *mddev;
> /*
> * original bio going to /dev/mdx
> diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
> index 7b820b81d8c2..8f4364f4bda0 100644
> --- a/drivers/md/raid5.c
> +++ b/drivers/md/raid5.c
> @@ -5474,7 +5474,7 @@ static void raid5_align_endio(struct bio *bi)
> struct r5conf *conf;
> struct md_rdev *rdev;
> blk_status_t error = bi->bi_status;
> - unsigned long start_time = md_io_acct->start_time;
> + u64 start_time = md_io_acct->start_time;
>
> bio_put(bi);
>
> diff --git a/drivers/nvdimm/btt.c b/drivers/nvdimm/btt.c
> index 0297b7882e33..4d7ff7c3ad11 100644
> --- a/drivers/nvdimm/btt.c
> +++ b/drivers/nvdimm/btt.c
> @@ -1442,7 +1442,7 @@ static void btt_submit_bio(struct bio *bio)
> struct bio_integrity_payload *bip = bio_integrity(bio);
> struct btt *btt = bio->bi_bdev->bd_disk->private_data;
> struct bvec_iter iter;
> - unsigned long start;
> + u64 start;
> struct bio_vec bvec;
> int err = 0;
> bool do_acct;
> diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c
> index 96e6e9a5f235..b5b7a709e1ab 100644
> --- a/drivers/nvdimm/pmem.c
> +++ b/drivers/nvdimm/pmem.c
> @@ -202,7 +202,7 @@ static void pmem_submit_bio(struct bio *bio)
> int ret = 0;
> blk_status_t rc = 0;
> bool do_acct;
> - unsigned long start;
> + u64 start;
> struct bio_vec bvec;
> struct bvec_iter iter;
> struct pmem_device *pmem = bio->bi_bdev->bd_disk->private_data;
> diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h
> index e0b098089ef2..6ffa0ca80217 100644
> --- a/include/linux/blk_types.h
> +++ b/include/linux/blk_types.h
> @@ -41,7 +41,7 @@ struct block_device {
> sector_t bd_start_sect;
> sector_t bd_nr_sectors;
> struct disk_stats __percpu *bd_stats;
> - unsigned long bd_stamp;
> + u64 bd_stamp;
> bool bd_read_only; /* read-only policy */
> dev_t bd_dev;
> atomic_t bd_openers;
> diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
> index 891f8cbcd043..0ecfc1ffd4a5 100644
> --- a/include/linux/blkdev.h
> +++ b/include/linux/blkdev.h
> @@ -1452,15 +1452,15 @@ static inline void blk_wake_io_task(struct task_struct *waiter)
> wake_up_process(waiter);
> }
>
> -unsigned long bdev_start_io_acct(struct block_device *bdev,
> +u64 bdev_start_io_acct(struct block_device *bdev,
> unsigned int sectors, enum req_op op,
> - unsigned long start_time);
> + u64 start_time);
> void bdev_end_io_acct(struct block_device *bdev, enum req_op op,
> - unsigned long start_time);
> + u64 start_time);
>
> -void bio_start_io_acct_time(struct bio *bio, unsigned long start_time);
> -unsigned long bio_start_io_acct(struct bio *bio);
> -void bio_end_io_acct_remapped(struct bio *bio, unsigned long start_time,
> +void bio_start_io_acct_time(struct bio *bio, u64 start_time);
> +u64 bio_start_io_acct(struct bio *bio);
> +void bio_end_io_acct_remapped(struct bio *bio, u64 start_time,
> struct block_device *orig_bdev);
>
> /**
> @@ -1468,7 +1468,7 @@ void bio_end_io_acct_remapped(struct bio *bio, unsigned long start_time,
> * @bio: bio to end account for
> * @start_time: start time returned by bio_start_io_acct()
> */
> -static inline void bio_end_io_acct(struct bio *bio, unsigned long start_time)
> +static inline void bio_end_io_acct(struct bio *bio, u64 start_time)
> {
> return bio_end_io_acct_remapped(bio, start_time, bio->bi_bdev);
> }
> diff --git a/include/linux/part_stat.h b/include/linux/part_stat.h
> index abeba356bc3f..85c50235693c 100644
> --- a/include/linux/part_stat.h
> +++ b/include/linux/part_stat.h
> @@ -10,7 +10,7 @@ struct disk_stats {
> unsigned long sectors[NR_STAT_GROUPS];
> unsigned long ios[NR_STAT_GROUPS];
> unsigned long merges[NR_STAT_GROUPS];
> - unsigned long io_ticks;
> + u64 io_ticks;
> local_t in_flight[2];
> };
>
>
More information about the drbd-dev
mailing list