X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=backend.c;h=ec535bcc47955bc8bf15b64a76f43686ae5b2368;hb=0f5234b4d75c4415d87903d26cdd79ee380c7f49;hp=a21dfef637bb74c2d6bf645d7f0e6a025961c072;hpb=4a6f4ee73e84bc92123fc1667f9aa14b3f4034f7;p=fio.git diff --git a/backend.c b/backend.c index a21dfef6..ec535bcc 100644 --- a/backend.c +++ b/backend.c @@ -90,6 +90,25 @@ static void sig_int(int sig) } } +#ifdef WIN32 +static void sig_break(int sig) +{ + struct thread_data *td; + int i; + + sig_int(sig); + + /** + * Windows terminates all job processes on SIGBREAK after the handler + * returns, so give them time to wrap-up and give stats + */ + for_each_td(td, i) { + while (td->runstate < TD_EXITED) + sleep(1); + } +} +#endif + void sig_show_status(int sig) { show_running_run_stats(); @@ -112,7 +131,7 @@ static void set_sig_handlers(void) /* Windows uses SIGBREAK as a quit signal from other applications */ #ifdef WIN32 memset(&act, 0, sizeof(act)); - act.sa_handler = sig_int; + act.sa_handler = sig_break; act.sa_flags = SA_RESTART; sigaction(SIGBREAK, &act, NULL); #endif @@ -952,9 +971,11 @@ static void do_io(struct thread_data *td, uint64_t *bytes_done) total_bytes += td->o.size; /* In trimwrite mode, each byte is trimmed and then written, so - * allow total_bytes to be twice as big */ - if (td_trimwrite(td)) + * allow total_bytes or number of ios to be twice as big */ + if (td_trimwrite(td)) { total_bytes += td->total_io_size; + td->o.number_ios *= 2; + } while ((td->o.read_iolog_file && !flist_empty(&td->io_log_list)) || (!flist_empty(&td->trim_list)) || !io_issue_bytes_exceeded(td) || @@ -2021,7 +2042,7 @@ static void reap_threads(unsigned int *nr_running, uint64_t *t_rate, for_each_td(td, i) { int flags = 0; - if (!strcmp(td->o.ioengine, "cpuio")) + if (!strcmp(td->o.ioengine, "cpuio")) cputhreads++; else realthreads++; @@ -2432,7 +2453,10 @@ reap: strerror(ret)); } else { pid_t pid; + void *eo; dprint(FD_PROCESS, "will fork\n"); + eo = td->eo; + read_barrier(); pid = fork(); if (!pid) { int ret; @@ -2441,6 +2465,9 @@ reap: _exit(ret); } else if (i == fio_debug_jobno) *fio_debug_jobp = pid; + free(eo); + free(fd); + fd = NULL; } dprint(FD_MUTEX, "wait on startup_sem\n"); if (fio_sem_down_timeout(startup_sem, 10000)) { @@ -2559,6 +2586,11 @@ int fio_backend(struct sk_out *sk_out) setup_log(&agg_io_log[DDIR_TRIM], &p, "agg-trim_bw.log"); } + if (init_global_dedupe_working_set_seeds()) { + log_err("fio: failed to initialize global dedupe working set\n"); + return 1; + } + startup_sem = fio_sem_init(FIO_SEM_LOCKED); if (!sk_out) is_local_backend = true;