X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=backend.c;h=89ffee1277f5ad47f733b56e9bf5c86ad9b39fc8;hb=a46c5e01ba7382395cba7a561bc232e8e978d1f3;hp=035ba73b1d0e2c3423a1d008e25aabc5face4354;hpb=5a812f9b9d987d1cacbb6f17a65835cbe0d66361;p=fio.git diff --git a/backend.c b/backend.c index 035ba73b..89ffee12 100644 --- a/backend.c +++ b/backend.c @@ -835,7 +835,7 @@ sync_done: check_update_rusage(td); if (td->trim_entries) - log_err("fio: %d trim entries leaked?\n", td->trim_entries); + log_err("fio: %lu trim entries leaked?\n", td->trim_entries); if (td->o.fill_device && td->error == ENOSPC) { td->error = 0; @@ -910,6 +910,15 @@ static int init_io_u(struct thread_data *td) if ((td->io_ops->flags & FIO_NOIO) || !(td_read(td) || td_write(td))) data_xfer = 0; + /* + * if we may later need to do address alignment, then add any + * possible adjustment here so that we don't cause a buffer + * overflow later. this adjustment may be too much if we get + * lucky and the allocator gives us an aligned address. + */ + if (td->o.odirect || td->o.mem_align || (td->io_ops->flags & FIO_RAWIO)) + td->orig_buffer_size += page_mask + td->o.mem_align; + if (td->o.mem_type == MEM_SHMHUGE || td->o.mem_type == MEM_MMAPHUGE) { unsigned long bs; @@ -1095,6 +1104,7 @@ static void *thread_main(void *data) struct thread_options *o = &td->o; pthread_condattr_t attr; int clear_state; + int ret; if (!o->use_thread) { setsid(); @@ -1106,6 +1116,9 @@ static void *thread_main(void *data) dprint(FD_PROCESS, "jobs pid=%d started\n", (int) td->pid); + if (is_backend) + fio_server_send_start(td); + INIT_FLIST_HEAD(&td->io_u_freelist); INIT_FLIST_HEAD(&td->io_u_busylist); INIT_FLIST_HEAD(&td->io_u_requeues); @@ -1133,6 +1146,7 @@ static void *thread_main(void *data) * eating a file descriptor */ fio_mutex_remove(td->mutex); + td->mutex = NULL; /* * A new gid requires privilege, so we need to do this before setting @@ -1159,7 +1173,8 @@ static void *thread_main(void *data) * allocations. */ if (o->cpumask_set) { - if (fio_setaffinity(td->pid, o->cpumask) == -1) { + ret = fio_setaffinity(td->pid, o->cpumask); + if (ret == -1) { td_verror(td, errno, "cpu_set_affinity"); goto err; } @@ -1224,8 +1239,9 @@ static void *thread_main(void *data) if (o->verify_async && verify_async_init(td)) goto err; - if (td->ioprio_set) { - if (ioprio_set(IOPRIO_WHO_PROCESS, 0, td->ioprio) == -1) { + if (o->ioprio) { + ret = ioprio_set(IOPRIO_WHO_PROCESS, 0, o->ioprio_class, o->ioprio); + if (ret == -1) { td_verror(td, errno, "ioprio_set"); goto err; } @@ -1542,6 +1558,12 @@ reaped: fio_terminate_threads(TERMINATE_ALL); } +static void do_usleep(unsigned int usecs) +{ + check_for_running_stats(); + usleep(usecs); +} + /* * Main function for kicking off and reaping jobs, as needed. */ @@ -1720,7 +1742,7 @@ static void run_threads(void) if (mtime_since_now(&this_start) > JOB_START_TIMEOUT) break; - usleep(100000); + do_usleep(100000); for (i = 0; i < this_jobs; i++) { td = map[i]; @@ -1771,21 +1793,13 @@ static void run_threads(void) reap_threads(&nr_running, &t_rate, &m_rate); - if (todo) { - if (is_backend) - fio_server_idle_loop(); - else - usleep(100000); - } + if (todo) + do_usleep(100000); } while (nr_running) { reap_threads(&nr_running, &t_rate, &m_rate); - - if (is_backend) - fio_server_idle_loop(); - else - usleep(10000); + do_usleep(10000); } fio_idle_prof_stop(); @@ -1881,6 +1895,7 @@ int fio_backend(void) return 1; set_genesis_time(); + stat_init(); create_disk_util_thread(); cgroup_list = smalloc(sizeof(*cgroup_list)); @@ -1910,5 +1925,6 @@ int fio_backend(void) fio_mutex_remove(startup_mutex); fio_mutex_remove(writeout_mutex); fio_mutex_remove(disk_thread_mutex); + stat_exit(); return exit_value; }