return found;
}
-static int get_io_ticks(struct disk_util *du)
+static int get_io_ticks(struct disk_util *du, struct disk_util_stat *dus)
{
- int i1, i2, i3, i4, i5, i6, i7, i8, i9;
- unsigned long long ull1, ull2;
+ unsigned in_flight;
char line[256];
FILE *f;
char *p;
f = fopen(du->path, "r");
if (!f)
- return 0;
+ return 1;
p = fgets(line, sizeof(line), f);
if (!p) {
fclose(f);
- return 0;
+ return 1;
}
- if (sscanf(p, "%8u %8u %8llu %8u %8u %8u %8llu %8u %8u %8u %8u", &i1, &i2, &ull1, &i3, &i4, &i5, &ull2, &i6, &i7, &i8, &i9) != 11) {
+ if (sscanf(p, "%8u %8u %8llu %8u %8u %8u %8llu %8u %8u %8u %8u", &dus->ios[0], &dus->merges[0], &dus->sectors[0], &dus->ticks[0], &dus->ios[1], &dus->merges[1], &dus->sectors[1], &dus->ticks[1], &in_flight, &dus->io_ticks, &dus->time_in_queue) != 11) {
fclose(f);
- return 0;
+ return 1;
}
fclose(f);
- return i8;
+ return 0;
}
static void update_io_tick_disk(struct disk_util *du)
{
- unsigned long ticks = get_io_ticks(du);
+ struct disk_util_stat __dus, *dus, *ldus;
struct timeval t;
- du->io_ticks += (ticks - du->last_io_ticks);
- du->last_io_ticks = ticks;
+ if (get_io_ticks(du, &__dus))
+ return;
+
+ dus = &du->dus;
+ ldus = &du->last_dus;
+
+ dus->sectors[0] += (__dus.sectors[0] - ldus->sectors[0]);
+ dus->sectors[1] += (__dus.sectors[1] - ldus->sectors[1]);
+ dus->ios[0] += (__dus.ios[0] - ldus->ios[0]);
+ dus->ios[1] += (__dus.ios[1] - ldus->ios[1]);
+ dus->merges[0] += (__dus.merges[0] - ldus->merges[0]);
+ dus->merges[1] += (__dus.merges[1] - ldus->merges[1]);
+ dus->ticks[0] += (__dus.ticks[0] - ldus->ticks[0]);
+ dus->ticks[1] += (__dus.ticks[1] - ldus->ticks[1]);
+ dus->io_ticks += (__dus.io_ticks - ldus->io_ticks);
+ dus->time_in_queue += (__dus.time_in_queue - ldus->time_in_queue);
+
gettimeofday(&t, NULL);
du->msec += mtime_since(&du->time, &t);
memcpy(&du->time, &t, sizeof(t));
+ memcpy(ldus, &__dus, sizeof(__dus));
}
static void update_io_ticks(void)
du->dev = dev;
gettimeofday(&du->time, NULL);
- du->last_io_ticks = get_io_ticks(du);
+ get_io_ticks(du, &du->last_dus);
list_add_tail(&du->list, &disk_list);
}
static void show_disk_util(void)
{
+ struct disk_util_stat *dus;
struct list_head *entry;
struct disk_util *du;
double util;
- printf("\nDisk utilization:\n");
+ printf("\nDisk stats:\n");
list_for_each(entry, &disk_list) {
du = list_entry(entry, struct disk_util, list);
+ dus = &du->dus;
- util = (double) 100 * du->io_ticks / (double) du->msec;
+ util = (double) 100 * du->dus.io_ticks / (double) du->msec;
if (util > 100.0)
util = 100.0;
- printf(" %s: %3.2f%%\n", du->name, util);
+ printf(" %s: ios=%u/%u, merge=%u/%u, ticks=%u/%u, in_queue=%u, util=%3.2f%%\n", du->name, dus->ios[0], dus->ios[1], dus->merges[0], dus->merges[1], dus->ticks[0], dus->ticks[1], dus->time_in_queue, util);
}
}