X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=diskutil.c;h=dd8fc6a20b3aec09875823f416369743a897af3e;hp=c34841a2af2c379b10b47b162ef79e99fd88a040;hb=4f37732a580d7983467ea1ba11f963da4e8cf06e;hpb=2a20eebccf88b3be2c56d4b5cd6cb4466b289e4f diff --git a/diskutil.c b/diskutil.c index c34841a2..dd8fc6a2 100644 --- a/diskutil.c +++ b/diskutil.c @@ -3,10 +3,16 @@ #include #include #include +#include #include #include #include #include +#ifdef CONFIG_VALGRIND_DEV +#include +#else +#define DRD_IGNORE_VAR(x) do { } while (0) +#endif #include "fio.h" #include "smalloc.h" @@ -16,9 +22,7 @@ static int last_majdev, last_mindev; static struct disk_util *last_du; -static struct fio_mutex *disk_util_mutex; - -FLIST_HEAD(disk_list); +static struct fio_sem *disk_util_sem; static struct disk_util *__init_per_file_disk_util(struct thread_data *td, int majdev, int mindev, char *path); @@ -36,7 +40,7 @@ static void disk_util_free(struct disk_util *du) slave->users--; } - fio_mutex_remove(du->lock); + fio_sem_remove(du->lock); free(du->sysfs_root); sfree(du); } @@ -86,7 +90,7 @@ static int get_io_ticks(struct disk_util *du, struct disk_util_stat *dus) static void update_io_tick_disk(struct disk_util *du) { struct disk_util_stat __dus, *dus, *ldus; - struct timeval t; + struct timespec t; if (!du->users) return; @@ -121,7 +125,7 @@ int update_io_ticks(void) dprint(FD_DISKUTIL, "update io ticks\n"); - fio_mutex_down(disk_util_mutex); + fio_sem_down(disk_util_sem); if (!helper_should_exit()) { flist_for_each(entry, &disk_list) { @@ -131,7 +135,7 @@ int update_io_ticks(void) } else ret = 1; - fio_mutex_up(disk_util_mutex); + fio_sem_up(disk_util_sem); return ret; } @@ -140,18 +144,18 @@ static struct disk_util *disk_util_exists(int major, int minor) struct flist_head *entry; struct disk_util *du; - fio_mutex_down(disk_util_mutex); + fio_sem_down(disk_util_sem); flist_for_each(entry, &disk_list) { du = flist_entry(entry, struct disk_util, list); if (major == du->major && minor == du->minor) { - fio_mutex_up(disk_util_mutex); + fio_sem_up(disk_util_sem); return du; } } - fio_mutex_up(disk_util_mutex); + fio_sem_up(disk_util_sem); return NULL; } @@ -247,7 +251,7 @@ static void find_add_disk_slaves(struct thread_data *td, char *path, * devices? */ linklen = readlink(temppath, slavepath, PATH_MAX - 1); - if (linklen < 0) { + if (linklen < 0) { perror("readlink() for slave device."); closedir(dirhandle); return; @@ -255,8 +259,10 @@ static void find_add_disk_slaves(struct thread_data *td, char *path, slavepath[linklen] = '\0'; sprintf(temppath, "%s/%s/dev", slavesdir, slavepath); + if (access(temppath, F_OK) != 0) + sprintf(temppath, "%s/%s/device/dev", slavesdir, slavepath); if (read_block_dev_entry(temppath, &majdev, &mindev)) { - perror("Error getting slave device numbers."); + perror("Error getting slave device numbers"); closedir(dirhandle); return; } @@ -296,6 +302,7 @@ static struct disk_util *disk_util_add(struct thread_data *td, int majdev, if (!du) return NULL; + DRD_IGNORE_VAR(du->users); memset(du, 0, sizeof(*du)); INIT_FLIST_HEAD(&du->list); l = snprintf(du->path, sizeof(du->path), "%s/stat", path); @@ -311,10 +318,10 @@ static struct disk_util *disk_util_add(struct thread_data *td, int majdev, du->minor = mindev; INIT_FLIST_HEAD(&du->slavelist); INIT_FLIST_HEAD(&du->slaves); - du->lock = fio_mutex_init(FIO_MUTEX_UNLOCKED); + du->lock = fio_sem_init(FIO_SEM_UNLOCKED); du->users = 0; - fio_mutex_down(disk_util_mutex); + fio_sem_down(disk_util_sem); flist_for_each(entry, &disk_list) { __du = flist_entry(entry, struct disk_util, list); @@ -323,7 +330,7 @@ static struct disk_util *disk_util_add(struct thread_data *td, int majdev, if (!strcmp((char *) du->dus.name, (char *) __du->dus.name)) { disk_util_free(du); - fio_mutex_up(disk_util_mutex); + fio_sem_up(disk_util_sem); return __du; } } @@ -334,7 +341,7 @@ static struct disk_util *disk_util_add(struct thread_data *td, int majdev, get_io_ticks(du, &du->last_dus); flist_add_tail(&du->list, &disk_list); - fio_mutex_up(disk_util_mutex); + fio_sem_up(disk_util_sem); find_add_disk_slaves(td, path, du); return du; @@ -365,7 +372,7 @@ static int find_block_dir(int majdev, int mindev, char *path, int link_ok) return 0; while ((dir = readdir(D)) != NULL) { - char full_path[256]; + char full_path[257]; if (!strcmp(dir->d_name, ".") || !strcmp(dir->d_name, "..")) continue; @@ -431,9 +438,6 @@ static struct disk_util *__init_per_file_disk_util(struct thread_data *td, sprintf(path, "%s", tmp); } - if (td->o.ioscheduler && !td->sysfs_root) - td->sysfs_root = strdup(path); - return disk_util_add(td, majdev, mindev, path); } @@ -452,12 +456,8 @@ static struct disk_util *init_per_file_disk_util(struct thread_data *td, mindev); du = disk_util_exists(majdev, mindev); - if (du) { - if (td->o.ioscheduler && !td->sysfs_root) - td->sysfs_root = strdup(du->sysfs_root); - + if (du) return du; - } /* * for an fs without a device, we will repeatedly stat through @@ -565,7 +565,7 @@ static void aggregate_slaves_stats(struct disk_util *masterdu) void disk_util_prune_entries(void) { - fio_mutex_down(disk_util_mutex); + fio_sem_down(disk_util_sem); while (!flist_empty(&disk_list)) { struct disk_util *du; @@ -576,8 +576,8 @@ void disk_util_prune_entries(void) } last_majdev = last_mindev = -1; - fio_mutex_up(disk_util_mutex); - fio_mutex_remove(disk_util_mutex); + fio_sem_up(disk_util_sem); + fio_sem_remove(disk_util_sem); } void print_disk_util(struct disk_util_stat *dus, struct disk_util_agg *agg, @@ -699,13 +699,13 @@ void show_disk_util(int terse, struct json_object *parent, struct disk_util *du; bool do_json; - if (!disk_util_mutex) + if (!disk_util_sem) return; - fio_mutex_down(disk_util_mutex); + fio_sem_down(disk_util_sem); if (flist_empty(&disk_list)) { - fio_mutex_up(disk_util_mutex); + fio_sem_up(disk_util_sem); return; } @@ -728,10 +728,10 @@ void show_disk_util(int terse, struct json_object *parent, } } - fio_mutex_up(disk_util_mutex); + fio_sem_up(disk_util_sem); } void setup_disk_util(void) { - disk_util_mutex = fio_mutex_init(FIO_MUTEX_UNLOCKED); + disk_util_sem = fio_sem_init(FIO_SEM_UNLOCKED); }