From 8aab824f8a042e76c83902afa4a1e9a473467e29 Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Thu, 23 Oct 2014 08:53:33 -0600 Subject: [PATCH] Fix exit being slowed by disk util stat time Add a cv/lock to handle exit of the disk util thread. This is a lot cleaner than the adhoc method that was used before, and it means that we can signal the exit immediately instead of waiting for DISKUTIL_MSEC to pass. Signed-off-by: Jens Axboe --- backend.c | 50 +++++++++++++++++++++++++++++++++++--------------- diskutil.h | 2 -- 2 files changed, 35 insertions(+), 17 deletions(-) diff --git a/backend.c b/backend.c index 3016e986..8303dc62 100644 --- a/backend.c +++ b/backend.c @@ -57,6 +57,9 @@ static pthread_t disk_util_thread; static struct fio_mutex *disk_thread_mutex; +static pthread_cond_t du_cond; +static pthread_mutex_t du_lock; + static struct fio_mutex *startup_mutex; static struct flist_head *cgroup_list; static char *cgroup_mnt; @@ -1970,16 +1973,20 @@ static void run_threads(void) update_io_ticks(); } -void wait_for_disk_thread_exit(void) +static void wait_for_disk_thread_exit(void) { - fio_mutex_down(disk_thread_mutex); + void *ret; + + disk_util_start_exit(); + pthread_cond_signal(&du_cond); + pthread_join(disk_util_thread, &ret); } static void free_disk_util(void) { - disk_util_start_exit(); - wait_for_disk_thread_exit(); disk_util_prune_entries(); + + pthread_cond_destroy(&du_cond); } static void *disk_thread_main(void *data) @@ -1988,17 +1995,32 @@ static void *disk_thread_main(void *data) fio_mutex_up(startup_mutex); - while (threads && !ret) { - usleep(DISK_UTIL_MSEC * 1000); - if (!threads) + while (!ret) { + uint64_t sec = DISK_UTIL_MSEC / 1000; + uint64_t nsec = (DISK_UTIL_MSEC % 1000) * 1000000; + struct timespec ts; + struct timeval tv; + + gettimeofday(&tv, NULL); + ts.tv_sec = tv.tv_sec + sec; + ts.tv_nsec = (tv.tv_usec * 1000) + nsec; + if (ts.tv_nsec > 1000000000ULL) { + ts.tv_nsec -= 1000000000ULL; + ts.tv_sec++; + } + + ret = pthread_cond_timedwait(&du_cond, &du_lock, &ts); + if (ret != ETIMEDOUT) { + printf("disk thread should exit %d\n", ret); break; + } + ret = update_io_ticks(); if (!is_backend) print_thread_status(); } - fio_mutex_up(disk_thread_mutex); return NULL; } @@ -2010,6 +2032,9 @@ static int create_disk_util_thread(void) disk_thread_mutex = fio_mutex_init(FIO_MUTEX_LOCKED); + pthread_cond_init(&du_cond, NULL); + pthread_mutex_init(&du_lock, NULL); + ret = pthread_create(&disk_util_thread, NULL, disk_thread_main, NULL); if (ret) { fio_mutex_remove(disk_thread_mutex); @@ -2017,13 +2042,6 @@ static int create_disk_util_thread(void) return 1; } - ret = pthread_detach(disk_util_thread); - if (ret) { - fio_mutex_remove(disk_thread_mutex); - log_err("Can't detatch disk util thread: %s\n", strerror(ret)); - return 1; - } - dprint(FD_MUTEX, "wait on startup_mutex\n"); fio_mutex_down(startup_mutex); dprint(FD_MUTEX, "done waiting on startup_mutex\n"); @@ -2067,6 +2085,8 @@ int fio_backend(void) run_threads(); + wait_for_disk_thread_exit(); + if (!fio_abort) { __show_run_stats(); if (write_bw_log) { diff --git a/diskutil.h b/diskutil.h index d86e4ec7..f621113e 100644 --- a/diskutil.h +++ b/diskutil.h @@ -100,8 +100,6 @@ static inline void disk_util_dec(struct disk_util *du) extern struct flist_head disk_list; -extern void wait_for_disk_thread_exit(void); - /* * disk util stuff */ -- 2.25.1