X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=diskutil.c;h=b3bb605aa6592c0f23fcfdcbf4c4744e7cb38961;hp=a87435afc7481ad2eb8652b8a268e2ab53ae7df7;hb=808e9ea8dd3dc3d631a7982fa0c4b01547cb811a;hpb=e11c410cbd60400c10d92d0115880c6e5728aa4e diff --git a/diskutil.c b/diskutil.c index a87435af..b3bb605a 100644 --- a/diskutil.c +++ b/diskutil.c @@ -20,6 +20,9 @@ static int get_io_ticks(struct disk_util *du, struct disk_util_stat *dus) char line[256]; FILE *f; char *p; + int ret; + + dprint(FD_DISKUTIL, "open stat file: %s\n", du->path); f = fopen(du->path, "r"); if (!f) @@ -31,13 +34,17 @@ static int get_io_ticks(struct disk_util *du, struct disk_util_stat *dus) return 1; } - if (sscanf(p, "%u %u %llu %u %u %u %llu %u %u %u %u\n", &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 1; - } + dprint(FD_DISKUTIL, "%s: %s", du->path, p); + ret = sscanf(p, "%u %u %llu %u %u %u %llu %u %u %u %u\n", &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); fclose(f); - return 0; + dprint(FD_DISKUTIL, "%s: stat read ok? %d\n", du->path, ret == 1); + return ret != 11; } static void update_io_tick_disk(struct disk_util *du) @@ -73,6 +80,8 @@ void update_io_ticks(void) struct list_head *entry; struct disk_util *du; + dprint(FD_DISKUTIL, "update io ticks\n"); + list_for_each(entry, &disk_list) { du = list_entry(entry, struct disk_util, list); update_io_tick_disk(du); @@ -99,6 +108,8 @@ static void disk_util_add(int majdev, int mindev, char *path) struct disk_util *du, *__du; struct list_head *entry; + dprint(FD_DISKUTIL, "add maj/min %d/%d: %s\n", majdev, mindev, path); + du = malloc(sizeof(*du)); memset(du, 0, sizeof(*du)); INIT_LIST_HEAD(&du->list); @@ -111,6 +122,8 @@ static void disk_util_add(int majdev, int mindev, char *path) list_for_each(entry, &disk_list) { __du = list_entry(entry, struct disk_util, list); + dprint(FD_DISKUTIL, "found %s in list\n", __du->name); + if (!strcmp(du->name, __du->name)) { free(du->name); free(du); @@ -118,6 +131,8 @@ static void disk_util_add(int majdev, int mindev, char *path) } } + dprint(FD_DISKUTIL, "add %s to list\n", du->name); + fio_gettime(&du->time, NULL); get_io_ticks(du, &du->last_dus); @@ -209,15 +224,18 @@ static void __init_disk_util(struct thread_data *td, struct fio_file *f) int mindev, majdev; char *p; - if (!stat(f->file_name, &st)) { + if (!lstat(f->file_name, &st)) { if (S_ISBLK(st.st_mode)) { majdev = major(st.st_rdev); mindev = minor(st.st_rdev); } else if (S_ISCHR(st.st_mode)) { majdev = major(st.st_rdev); mindev = minor(st.st_rdev); - fio_lookup_raw(st.st_rdev, &majdev, &mindev); - } else { + if (fio_lookup_raw(st.st_rdev, &majdev, &mindev)) + return; + } else if (S_ISFIFO(st.st_mode)) + return; + else { majdev = major(st.st_dev); mindev = minor(st.st_dev); } @@ -236,6 +254,9 @@ static void __init_disk_util(struct thread_data *td, struct fio_file *f) mindev = minor(st.st_dev); } + dprint(FD_DISKUTIL, "%s belongs to maj/min %d/%d\n", f->file_name, + majdev, mindev); + du = disk_util_exists(majdev, mindev); if (du) { if (td->o.ioscheduler && !td->sysfs_root) @@ -255,7 +276,7 @@ static void __init_disk_util(struct thread_data *td, struct fio_file *f) last_mindev = mindev; last_majdev = majdev; - + sprintf(foo, "/sys/block"); if (!find_block_dir(majdev, mindev, foo)) return; @@ -310,6 +331,9 @@ void show_disk_util(void) struct disk_util *du; double util; + if (list_empty(&disk_list)) + return; + log_info("\nDisk stats (read/write):\n"); list_for_each(entry, &disk_list) { @@ -320,7 +344,12 @@ void show_disk_util(void) if (util > 100.0) util = 100.0; - log_info(" %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); + log_info(" %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); } /*