hi,
Sorry for being late.
I had written a simple iostat patch to show requests's d2c time, the output looks like
below:
Device r/s rMB/s rrqm/s %rrqm r_await r_d2c_await rareq-sz w/s wMB/s wrqm/s %wrqm w_await w_d2c_await wareq-sz d/s dMB/s drqm/s %drqm d_await d_d2c_await
dareq-sz aqu-sz %util
vdb 132.00 3.54 0.50 0.38 21.07 21.02 27.47 6125.00 94.62 5998.00 49.48 3.99 3.55 15.82 0.00 0.00 0.00 0.00 0.00 0.00
0.00 24.43 47.65
Device r/s rMB/s rrqm/s %rrqm r_await r_d2c_await rareq-sz w/s wMB/s wrqm/s %wrqm w_await w_d2c_await wareq-sz d/s dMB/s drqm/s %drqm d_await d_d2c_await
dareq-sz aqu-sz %util
vdb 84.50 2.42 0.00 0.00 36.98 36.72 29.33 3000.00 48.85 3028.50 50.24 4.82 4.17 16.67 0.00 0.00 0.00 0.00 0.00 0.00
0.00 16.23 29.55
Device r/s rMB/s rrqm/s %rrqm r_await r_d2c_await rareq-sz w/s wMB/s wrqm/s %wrqm w_await w_d2c_await wareq-sz d/s dMB/s drqm/s %drqm d_await d_d2c_await
dareq-sz aqu-sz %util
vdb 114.50 2.84 0.00 0.00 27.83 27.83 25.43 4830.00 76.91 4819.00 49.94 2.58 2.40 16.30 0.00 0.00 0.00 0.00 0.00 0.00
0.00 13.31 33.75
You can check r_d2c_await, w_d2c_await and d_d2c_await fields, I think these d2c info
are useful, we can cleary see io's latency distribution. For example, if d2c await is high,
it's much likely that storage device's bottleneck is reached.
Here I put this patch in attachment, please have a check, and currently this patch
is just a trial, I'll make a formal iostat patch to sysstat community if the kernel patch
has been thought useful :)
Regards,
Xiaoguang Wang
In case I missed, is it possible to include iostat patch corresponding
to this kernel patch ?
On 6/3/19 6:29 PM, Xiaoguang Wang wrote:
Indeed tool iostat's await is not good enough, which is somewhat sketchy
and could not show request's latency on device driver's side.
Here we add a new counter to track io request's d2c time, also with this
patch, we can extend iostat to show this value easily.
Signed-off-by: Xiaoguang Wang <xiaoguang.wang@xxxxxxxxxxxxxxxxx>
---
block/blk-core.c | 3 +++
block/genhd.c | 7 +++++--
block/partition-generic.c | 8 ++++++--
include/linux/genhd.h | 4 ++++
4 files changed, 18 insertions(+), 4 deletions(-)
diff --git a/block/blk-core.c b/block/blk-core.c
index ee1b35fe8572..b0449ec80a7d 100644
--- a/block/blk-core.c
+++ b/block/blk-core.c
@@ -1257,6 +1257,9 @@ void blk_account_io_done(struct request *req, u64 now)
update_io_ticks(part, jiffies);
part_stat_inc(part, ios[sgrp]);
part_stat_add(part, nsecs[sgrp], now - req->start_time_ns);
+ if (req->io_start_time_ns)
+ part_stat_add(part, d2c_nsecs[sgrp],
+ now - req->io_start_time_ns);
part_stat_add(part, time_in_queue, nsecs_to_jiffies64(now - req->start_time_ns));
part_dec_in_flight(req->q, part, rq_data_dir(req));
diff --git a/block/genhd.c b/block/genhd.c
index 24654e1d83e6..727bc1de1a74 100644
--- a/block/genhd.c
+++ b/block/genhd.c
@@ -1377,7 +1377,7 @@ static int diskstats_show(struct seq_file *seqf, void *v)
"%lu %lu %lu %u "
"%lu %lu %lu %u "
"%u %u %u "
- "%lu %lu %lu %u\n",
+ "%lu %lu %lu %u %u %u %u\n",
MAJOR(part_devt(hd)), MINOR(part_devt(hd)),
disk_name(gp, hd->partno, buf),
part_stat_read(hd, ios[STAT_READ]),
@@ -1394,7 +1394,10 @@ static int diskstats_show(struct seq_file *seqf, void *v)
part_stat_read(hd, ios[STAT_DISCARD]),
part_stat_read(hd, merges[STAT_DISCARD]),
part_stat_read(hd, sectors[STAT_DISCARD]),
- (unsigned int)part_stat_read_msecs(hd, STAT_DISCARD)
+ (unsigned int)part_stat_read_msecs(hd, STAT_DISCARD),
+ (unsigned int)part_stat_read_d2c_msecs(hd, STAT_READ),
+ (unsigned int)part_stat_read_d2c_msecs(hd, STAT_WRITE),
+ (unsigned int)part_stat_read_d2c_msecs(hd, STAT_DISCARD)
);
}
disk_part_iter_exit(&piter);
diff --git a/block/partition-generic.c b/block/partition-generic.c
index aee643ce13d1..0635a46a31dd 100644
--- a/block/partition-generic.c
+++ b/block/partition-generic.c
@@ -127,7 +127,7 @@ ssize_t part_stat_show(struct device *dev,
"%8lu %8lu %8llu %8u "
"%8lu %8lu %8llu %8u "
"%8u %8u %8u "
- "%8lu %8lu %8llu %8u"
+ "%8lu %8lu %8llu %8u %8u %8u %8u %8u"
"\n",
part_stat_read(p, ios[STAT_READ]),
part_stat_read(p, merges[STAT_READ]),
@@ -143,7 +143,11 @@ ssize_t part_stat_show(struct device *dev,
part_stat_read(p, ios[STAT_DISCARD]),
part_stat_read(p, merges[STAT_DISCARD]),
(unsigned long long)part_stat_read(p, sectors[STAT_DISCARD]),
- (unsigned int)part_stat_read_msecs(p, STAT_DISCARD));
+ (unsigned int)part_stat_read_msecs(p, STAT_DISCARD),
+ (unsigned int)part_stat_read_msecs(p, STAT_DISCARD),
+ (unsigned int)part_stat_read_d2c_msecs(p, STAT_READ),
+ (unsigned int)part_stat_read_d2c_msecs(p, STAT_WRITE),
+ (unsigned int)part_stat_read_d2c_msecs(p, STAT_DISCARD));
}
ssize_t part_inflight_show(struct device *dev, struct device_attribute *attr,
diff --git a/include/linux/genhd.h b/include/linux/genhd.h
index 8b5330dd5ac0..f80ba947cac2 100644
--- a/include/linux/genhd.h
+++ b/include/linux/genhd.h
@@ -85,6 +85,7 @@ struct partition {
struct disk_stats {
u64 nsecs[NR_STAT_GROUPS];
+ u64 d2c_nsecs[NR_STAT_GROUPS];
unsigned long sectors[NR_STAT_GROUPS];
unsigned long ios[NR_STAT_GROUPS];
unsigned long merges[NR_STAT_GROUPS];
@@ -367,6 +368,9 @@ static inline void free_part_stats(struct hd_struct *part)
#define part_stat_read_msecs(part, which) \
div_u64(part_stat_read(part, nsecs[which]), NSEC_PER_MSEC)
+#define part_stat_read_d2c_msecs(part, which) \
+ div_u64(part_stat_read(part, d2c_nsecs[which]), NSEC_PER_MSEC)
+
#define part_stat_read_accum(part, field) \
(part_stat_read(part, field[STAT_READ]) + \
part_stat_read(part, field[STAT_WRITE]) + \
>From 48348a9a079c0d9e05c5620d09a85bc082ee7dc2 Mon Sep 17 00:00:00 2001
From: Xiaoguang Wang <xiaoguang.wang@xxxxxxxxxxxxxxxxx>
Date: Wed, 12 Jun 2019 14:26:23 +0800
Subject: [PATCH] iostat: add initial support for io's d2c info
Signed-off-by: Xiaoguang Wang <xiaoguang.wang@xxxxxxxxxxxxxxxxx>
---
iostat.c | 77 +++++++++++++++++++++++++++++++++++++++++++++--------
iostat.h | 12 +++++++++
raw_stats.c | 8 +++++-
rd_stats.h | 3 +++
4 files changed, 88 insertions(+), 12 deletions(-)
diff --git a/iostat.c b/iostat.c
index 897104e..ccce008 100644
--- a/iostat.c
+++ b/iostat.c
@@ -524,15 +524,17 @@ int read_sysfs_file_stat(int curr, char *filename, char *dev_name, int iodev_nr)
unsigned long rd_ios, rd_merges_or_rd_sec, wr_ios, wr_merges;
unsigned long rd_sec_or_wr_ios, wr_sec, rd_ticks_or_wr_sec;
unsigned long dc_ios, dc_merges, dc_sec, dc_ticks;
+ unsigned long rd_d2c_ticks, wr_d2c_ticks, dc_d2c_ticks;
/* Try to read given stat file */
if ((fp = fopen(filename, "r")) == NULL)
return 0;
- i = fscanf(fp, "%lu %lu %lu %lu %lu %lu %lu %u %u %u %u %lu %lu %lu %lu",
+ i = fscanf(fp, "%lu %lu %lu %lu %lu %lu %lu %u %u %u %u %lu %lu %lu %lu %lu %lu %lu",
&rd_ios, &rd_merges_or_rd_sec, &rd_sec_or_wr_ios, &rd_ticks_or_wr_sec,
&wr_ios, &wr_merges, &wr_sec, &wr_ticks, &ios_pgr, &tot_ticks, &rq_ticks,
- &dc_ios, &dc_merges, &dc_sec, &dc_ticks);
+ &dc_ios, &dc_merges, &dc_sec, &dc_ticks, &rd_d2c_ticks, &wr_d2c_ticks,
+ &dc_d2c_ticks);
memset(&sdev, 0, sizeof(struct io_stats));
@@ -557,6 +559,13 @@ int read_sysfs_file_stat(int curr, char *filename, char *dev_name, int iodev_nr)
sdev.dc_sectors = dc_sec;
sdev.dc_ticks = dc_ticks;
}
+
+ if (i == 18) {
+ /* D2c time of io request */
+ sdev.rd_d2c_ticks = rd_d2c_ticks;
+ sdev.wr_d2c_ticks = wr_d2c_ticks;
+ sdev.dc_d2c_ticks = dc_d2c_ticks;
+ }
}
else if (i == 4) {
/* Partition without extended statistics */
@@ -734,6 +743,7 @@ void read_diskstats_stat(int curr, int iodev_nr, int dlist_idx)
unsigned long rd_ios, rd_merges_or_rd_sec, rd_ticks_or_wr_sec, wr_ios;
unsigned long wr_merges, rd_sec_or_wr_ios, wr_sec;
unsigned long dc_ios, dc_merges, dc_sec, dc_ticks;
+ unsigned long rd_d2c_ticks, wr_d2c_ticks, dc_d2c_ticks;
char *ioc_dname;
unsigned int major, minor;
@@ -748,11 +758,12 @@ void read_diskstats_stat(int curr, int iodev_nr, int dlist_idx)
while (fgets(line, sizeof(line), fp) != NULL) {
/* major minor name rio rmerge rsect ruse wio wmerge wsect wuse running use aveq dcio dcmerge dcsect dcuse*/
- i = sscanf(line, "%u %u %s %lu %lu %lu %lu %lu %lu %lu %u %u %u %u %lu %lu %lu %lu",
+ i = sscanf(line, "%u %u %s %lu %lu %lu %lu %lu %lu %lu %u %u %u %u %lu %lu %lu %lu %lu %lu %lu",
&major, &minor, dev_name,
&rd_ios, &rd_merges_or_rd_sec, &rd_sec_or_wr_ios, &rd_ticks_or_wr_sec,
&wr_ios, &wr_merges, &wr_sec, &wr_ticks, &ios_pgr, &tot_ticks, &rq_ticks,
- &dc_ios, &dc_merges, &dc_sec, &dc_ticks);
+ &dc_ios, &dc_merges, &dc_sec, &dc_ticks, &rd_d2c_ticks, &wr_d2c_ticks,
+ &dc_d2c_ticks);
if (i >= 14) {
/* Device or partition */
@@ -778,6 +789,13 @@ void read_diskstats_stat(int curr, int iodev_nr, int dlist_idx)
sdev.dc_sectors = dc_sec;
sdev.dc_ticks = dc_ticks;
}
+
+ if (i == 21) {
+ /* D2c time of io request */
+ sdev.rd_d2c_ticks = rd_d2c_ticks;
+ sdev.wr_d2c_ticks = wr_d2c_ticks;
+ sdev.dc_d2c_ticks = dc_d2c_ticks;
+ }
}
else if (i == 7) {
/* Partition without extended statistics */
@@ -858,14 +876,17 @@ void compute_device_groups_stats(int curr, int iodev_nr)
gdev.rd_merges += ioi->rd_merges;
gdev.rd_sectors += ioi->rd_sectors;
gdev.rd_ticks += ioi->rd_ticks;
+ gdev.rd_d2c_ticks += ioi->rd_d2c_ticks;
gdev.wr_ios += ioi->wr_ios;
gdev.wr_merges += ioi->wr_merges;
gdev.wr_sectors += ioi->wr_sectors;
gdev.wr_ticks += ioi->wr_ticks;
+ gdev.wr_d2c_ticks += ioi->wr_d2c_ticks;
gdev.dc_ios += ioi->dc_ios;
gdev.dc_merges += ioi->dc_merges;
gdev.dc_sectors += ioi->dc_sectors;
gdev.dc_ticks += ioi->dc_ticks;
+ gdev.dc_d2c_ticks += ioi->dc_d2c_ticks;
gdev.ios_pgr += ioi->ios_pgr;
gdev.tot_ticks += ioi->tot_ticks;
gdev.rq_ticks += ioi->rq_ticks;
@@ -1078,15 +1099,15 @@ void write_disk_stat_header(int *fctr, int *tab, int hpart)
}
else {
if ((hpart == 1) || !hpart) {
- printf(" r/s %sr%s/s rrqm/s %%rrqm r_await rareq-sz",
+ printf(" r/s %sr%s/s rrqm/s %%rrqm r_await r_d2c_await rareq-sz",
spc, units);
}
if ((hpart == 2) || !hpart) {
- printf(" w/s %sw%s/s wrqm/s %%wrqm w_await wareq-sz",
+ printf(" w/s %sw%s/s wrqm/s %%wrqm w_await w_d2c_await wareq-sz",
spc, units);
}
if ((hpart == 3) || !hpart) {
- printf(" d/s %sd%s/s drqm/s %%drqm d_await dareq-sz",
+ printf(" d/s %sd%s/s drqm/s %%drqm d_await d_d2c_await dareq-sz",
spc, units);
}
if ((hpart == 4) || !hpart) {
@@ -1193,6 +1214,10 @@ void write_plain_ext_stat(unsigned long long itv, int fctr, int hpart,
/* r_await */
cprintf_f(NO_UNIT, 1, 7, 2,
xios->r_await);
+
+ /* r_d2c_await */
+ cprintf_f(NO_UNIT, 1, 11, 2,
+ xios->r_d2c_await);
/* rareq-sz (in kB, not sectors) */
cprintf_f(DISPLAY_UNIT(flags) ? UNIT_KILOBYTE : NO_UNIT, 1, 8, 2,
xios->rarqsz / 2);
@@ -1216,6 +1241,10 @@ void write_plain_ext_stat(unsigned long long itv, int fctr, int hpart,
/* w_await */
cprintf_f(NO_UNIT, 1, 7, 2,
xios->w_await);
+
+ /* w_d2c_await */
+ cprintf_f(NO_UNIT, 1, 11, 2,
+ xios->w_d2c_await);
/* wareq-sz (in kB, not sectors) */
cprintf_f(DISPLAY_UNIT(flags) ? UNIT_KILOBYTE : NO_UNIT, 1, 8, 2,
xios->warqsz / 2);
@@ -1239,6 +1268,11 @@ void write_plain_ext_stat(unsigned long long itv, int fctr, int hpart,
/* d_await */
cprintf_f(NO_UNIT, 1, 7, 2,
xios->d_await);
+
+ /* d_d2c_await */
+ cprintf_f(NO_UNIT, 1, 11, 2,
+ xios->d_d2c_await);
+
/* dareq-sz (in kB, not sectors) */
cprintf_f(DISPLAY_UNIT(flags) ? UNIT_KILOBYTE : NO_UNIT, 1, 8, 2,
xios->darqsz / 2);
@@ -1402,10 +1436,16 @@ void write_ext_stat(unsigned long long itv, int fctr, int hpart,
sdc.rd_ticks = ioi->rd_ticks;
sdp.rd_ticks = ioj->rd_ticks;
+ sdc.rd_d2c_ticks = ioi->rd_d2c_ticks;
+ sdp.rd_d2c_ticks = ioj->rd_d2c_ticks;
sdc.wr_ticks = ioi->wr_ticks;
sdp.wr_ticks = ioj->wr_ticks;
+ sdc.wr_d2c_ticks = ioi->wr_d2c_ticks;
+ sdp.wr_d2c_ticks = ioj->wr_d2c_ticks;
sdc.dc_ticks = ioi->dc_ticks;
- sdp.dc_ticks = ioj->dc_ticks;
+ sdp.dc_d2c_ticks = ioj->dc_d2c_ticks;
+ sdp.dc_d2c_ticks = ioj->dc_d2c_ticks;
+
sdc.rd_sect = ioi->rd_sectors;
sdp.rd_sect = ioj->rd_sectors;
@@ -1436,6 +1476,10 @@ void write_ext_stat(unsigned long long itv, int fctr, int hpart,
xios.r_await = (ioi->rd_ios - ioj->rd_ios) ?
(ioi->rd_ticks - ioj->rd_ticks) /
((double) (ioi->rd_ios - ioj->rd_ios)) : 0.0;
+ /* r_d2c_await */
+ xios.r_d2c_await = (ioi->rd_ios - ioj->rd_ios) ?
+ (ioi->rd_d2c_ticks - ioj->rd_d2c_ticks) /
+ ((double) (ioi->rd_ios - ioj->rd_ios)) : 0.0;
/* rareq-sz (still in sectors, not kB) */
xios.rarqsz = (ioi->rd_ios - ioj->rd_ios) ?
(ioi->rd_sectors - ioj->rd_sectors) / ((double) (ioi->rd_ios - ioj->rd_ios)) :
@@ -1451,6 +1495,10 @@ void write_ext_stat(unsigned long long itv, int fctr, int hpart,
xios.w_await = (ioi->wr_ios - ioj->wr_ios) ?
(ioi->wr_ticks - ioj->wr_ticks) /
((double) (ioi->wr_ios - ioj->wr_ios)) : 0.0;
+ /* w_d2c_await */
+ xios.w_d2c_await = (ioi->wr_ios - ioj->wr_ios) ?
+ (ioi->wr_d2c_ticks - ioj->wr_d2c_ticks) /
+ ((double) (ioi->wr_ios - ioj->wr_ios)) : 0.0;
/* wareq-sz (still in sectors, not kB) */
xios.warqsz = (ioi->wr_ios - ioj->wr_ios) ?
(ioi->wr_sectors - ioj->wr_sectors) / ((double) (ioi->wr_ios - ioj->wr_ios)) :
@@ -1466,6 +1514,10 @@ void write_ext_stat(unsigned long long itv, int fctr, int hpart,
xios.d_await = (ioi->dc_ios - ioj->dc_ios) ?
(ioi->dc_ticks - ioj->dc_ticks) /
((double) (ioi->dc_ios - ioj->dc_ios)) : 0.0;
+ /* d_d2c_await */
+ xios.d_d2c_await = (ioi->dc_ios - ioj->dc_ios) ?
+ (ioi->dc_d2c_ticks - ioj->dc_d2c_ticks) /
+ ((double) (ioi->dc_ios - ioj->dc_ios)) : 0.0;
/* dareq-sz (still in sectors, not kB) */
xios.darqsz = (ioi->dc_ios - ioj->dc_ios) ?
(ioi->dc_sectors - ioj->dc_sectors) / ((double) (ioi->dc_ios - ioj->dc_ios)) :
@@ -1776,9 +1828,9 @@ void write_stats(int curr, struct tm *rectime, int iodev_nr, int dlist_idx)
fprintf(stderr,
"name=%s itv=%llu fctr=%d ioi{ rd_sectors=%lu "
"wr_sectors=%lu dc_sectors=%lu "
- "rd_ios=%lu rd_merges=%lu rd_ticks=%u "
- "wr_ios=%lu wr_merges=%lu wr_ticks=%u "
- "dc_ios=%lu dc_merges=%lu dc_ticks=%u "
+ "rd_ios=%lu rd_merges=%lu rd_ticks=%u rd_d2c_ticks=%lu "
+ "wr_ios=%lu wr_merges=%lu wr_ticks=%u wr_d2c_ticks=%lu "
+ "dc_ios=%lu dc_merges=%lu dc_ticks=%u dc_d2c_ticks=%lu "
"ios_pgr=%u tot_ticks=%u "
"rq_ticks=%u }\n",
shi->name,
@@ -1790,12 +1842,15 @@ void write_stats(int curr, struct tm *rectime, int iodev_nr, int dlist_idx)
ioi->rd_ios,
ioi->rd_merges,
ioi->rd_ticks,
+ ioi->rd_d2c_ticks,
ioi->wr_ios,
ioi->wr_merges,
ioi->wr_ticks,
+ ioi->wr_d2c_ticks,
ioi->dc_ios,
ioi->dc_merges,
ioi->dc_ticks,
+ ioi->dc_d2c_ticks,
ioi->ios_pgr,
ioi->tot_ticks,
ioi->rq_ticks);
diff --git a/iostat.h b/iostat.h
index ce6ccc1..8804b4a 100644
--- a/iostat.h
+++ b/iostat.h
@@ -93,10 +93,16 @@ struct io_stats {
unsigned long dc_merges __attribute__ ((packed));
/* Time of read requests in queue */
unsigned int rd_ticks __attribute__ ((packed));
+ /* D2c time of read requests in queue */
+ unsigned int rd_d2c_ticks __attribute__ ((packed));
/* Time of write requests in queue */
unsigned int wr_ticks __attribute__ ((packed));
+ /* D2c time of write requests in queue */
+ unsigned int wr_d2c_ticks __attribute__ ((packed));
/* Time of discard requests in queue */
unsigned int dc_ticks __attribute__ ((packed));
+ /* D2c ime of discard requests in queue */
+ unsigned int dc_d2c_ticks __attribute__ ((packed));
/* # of I/Os in progress */
unsigned int ios_pgr __attribute__ ((packed));
/* # of ticks total (for this device) for I/O */
@@ -110,10 +116,16 @@ struct io_stats {
struct ext_io_stats {
/* r_await */
double r_await;
+ /* r_d2c_await */
+ double r_d2c_await;
/* w_await */
double w_await;
+ /* w_d2c_await */
+ double w_d2c_await;
/* d_await */
double d_await;
+ /* d_d2c_await */
+ double d_d2c_await;
/* rsec/s */
double rsectors;
/* wsec/s */
diff --git a/raw_stats.c b/raw_stats.c
index efa1f81..15db172 100644
--- a/raw_stats.c
+++ b/raw_stats.c
@@ -567,10 +567,16 @@ __print_funct_t raw_print_disk_stats(struct activity *a, char *timestr, int curr
pval((unsigned long long) sdp->dc_sect, (unsigned long long) sdc->dc_sect);
printf(" rd_ticks");
pval((unsigned long long) sdp->rd_ticks, (unsigned long long) sdc->rd_ticks);
+ printf(" rd_d2c_ticks");
+ pval((unsigned long long) sdp->rd_d2c_ticks, (unsigned long long) sdc->rd_d2c_ticks);
printf(" wr_ticks");
pval((unsigned long long) sdp->wr_ticks, (unsigned long long) sdc->wr_ticks);
+ printf(" wr_d2c_ticks");
+ pval((unsigned long long) sdp->wr_d2c_ticks, (unsigned long long) sdc->wr_d2c_ticks);
printf(" dc_ticks");
- pval((unsigned long long) sdp->dc_ticks, (unsigned long long) sdc->dc_ticks);
+ pval((unsigned long long) sdp->dc_ticks, (unsigned long long) sdc->dc_d2c_ticks);
+ printf(" dc_d2c_ticks");
+ pval((unsigned long long) sdp->dc_d2c_ticks, (unsigned long long) sdc->dc_ticks);
printf(" tot_ticks");
pval((unsigned long long) sdp->tot_ticks, (unsigned long long) sdc->tot_ticks);
pfield(NULL, 0); /* Skip areq-sz */
diff --git a/rd_stats.h b/rd_stats.h
index bc99127..2ea079b 100644
--- a/rd_stats.h
+++ b/rd_stats.h
@@ -272,6 +272,9 @@ struct stats_disk {
unsigned int major;
unsigned int minor;
unsigned int dc_ticks;
+ unsigned int rd_d2c_ticks;
+ unsigned int wr_d2c_ticks;
+ unsigned int dc_d2c_ticks;
};
#define STATS_DISK_SIZE (sizeof(struct stats_disk))
--
2.17.2