X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=fio.c;h=5bced2469ceaa217fbb67af80e9e29fc532f7582;hb=9cc935a15e2ca54e6bdff4c18bd432dff3fbfaee;hp=c95d7b57deb4ad903ae84d34849fc19bb26f4378;hpb=eb8bbf48e79a8c6afd3c84e3d64263d10ee45daa;p=fio.git diff --git a/fio.c b/fio.c index c95d7b57..5bced246 100644 --- a/fio.c +++ b/fio.c @@ -43,13 +43,17 @@ int thread_number = 0; static char run_str[MAX_JOBS + 1]; int shm_id = 0; static struct timeval genesis; +static int temp_stall_ts; static void print_thread_status(void); extern unsigned long long mlock_size; /* - * thread life cycle + * Thread life cycle. Once a thread has a runstate beyond TD_INITIALIZED, it + * will never back again. It may cycle between running/verififying/fsyncing. + * Once the thread reaches TD_EXITED, it is just waiting for the core to + * reap it. */ enum { TD_NOT_CREATED = 0, @@ -287,8 +291,8 @@ static int verify_io_u_crc32(struct verify_header *hdr, struct io_u *io_u) c = crc32(p, hdr->len - sizeof(*hdr)); if (c != hdr->crc32) { - fprintf(f_err, "crc32: verify failed at %llu/%u\n", io_u->offset, io_u->buflen); - fprintf(f_err, "crc32: wanted %lx, got %lx\n", hdr->crc32, c); + log_err("crc32: verify failed at %llu/%u\n", io_u->offset, io_u->buflen); + log_err("crc32: wanted %lx, got %lx\n", hdr->crc32, c); return 1; } @@ -305,7 +309,7 @@ static int verify_io_u_md5(struct verify_header *hdr, struct io_u *io_u) md5_update(&md5_ctx, p, hdr->len - sizeof(*hdr)); if (memcmp(hdr->md5_digest, md5_ctx.hash, sizeof(md5_ctx.hash))) { - fprintf(f_err, "md5: verify failed at %llu/%u\n", io_u->offset, io_u->buflen); + log_err("md5: verify failed at %llu/%u\n", io_u->offset, io_u->buflen); hexdump(hdr->md5_digest, sizeof(hdr->md5_digest)); hexdump(md5_ctx.hash, sizeof(md5_ctx.hash)); return 1; @@ -327,7 +331,7 @@ static int verify_io_u(struct io_u *io_u) else if (hdr->verify_type == VERIFY_CRC32) ret = verify_io_u_crc32(hdr, io_u); else { - fprintf(f_err, "Bad verify type %d\n", hdr->verify_type); + log_err("Bad verify type %d\n", hdr->verify_type); ret = 1; } @@ -851,7 +855,7 @@ static int init_io(struct thread_data *td) else if (td->io_engine == FIO_SPLICEIO) return fio_spliceio_init(td); else { - fprintf(f_err, "bad io_engine %d\n", td->io_engine); + log_err("bad io_engine %d\n", td->io_engine); return 1; } } @@ -878,7 +882,7 @@ static void cleanup_io_u(struct thread_data *td) } else if (td->mem_type == MEM_MMAP) munmap(td->orig_buffer, td->orig_buffer_size); else - fprintf(f_err, "Bad memory type %d\n", td->mem_type); + log_err("Bad memory type %d\n", td->mem_type); td->orig_buffer = NULL; } @@ -937,43 +941,39 @@ static int init_io_u(struct thread_data *td) return 0; } -static int create_file(struct thread_data *td, unsigned long long size, - int extend) +static int create_file(struct thread_data *td, unsigned long long size) { unsigned long long left; unsigned int bs; - int r, oflags; char *b; + int r; /* * unless specifically asked for overwrite, let normal io extend it */ - if (td_write(td) && !td->overwrite) + if (!td->overwrite) { + td->real_file_size = size; return 0; + } if (!size) { - fprintf(f_err, "Need size for create\n"); + log_err("Need size for create\n"); td_verror(td, EINVAL); return 1; } - if (!extend) { - oflags = O_CREAT | O_TRUNC; - fprintf(f_out, "%s: Laying out IO file (%LuMiB)\n", td->name, size >> 20); - } else { - oflags = O_APPEND; - fprintf(f_out, "%s: Extending IO file (%Lu -> %LuMiB)\n", td->name, (td->file_size - size) >> 20, td->file_size >> 20); - } + temp_stall_ts = 1; + fprintf(f_out, "%s: Laying out IO file (%LuMiB)\n",td->name,size >> 20); - td->fd = open(td->file_name, O_WRONLY | oflags, 0644); + td->fd = open(td->file_name, O_WRONLY | O_CREAT | O_TRUNC, 0644); if (td->fd < 0) { td_verror(td, errno); - return 1; + goto done_noclose; } - if (!extend && ftruncate(td->fd, td->file_size) == -1) { + if (ftruncate(td->fd, td->file_size) == -1) { td_verror(td, errno); - return 1; + goto done; } td->io_size = td->file_size; @@ -1006,9 +1006,12 @@ static int create_file(struct thread_data *td, unsigned long long size, else if (td->create_fsync) fsync(td->fd); + free(b); +done: close(td->fd); td->fd = -1; - free(b); +done_noclose: + temp_stall_ts = 0; return 0; } @@ -1016,15 +1019,17 @@ static int file_size(struct thread_data *td) { struct stat st; - if (fstat(td->fd, &st) == -1) { - td_verror(td, errno); - return 1; - } + if (td->overwrite) { + if (fstat(td->fd, &st) == -1) { + td_verror(td, errno); + return 1; + } - td->real_file_size = st.st_size; + td->real_file_size = st.st_size; - if (!td->file_size || td->file_size > td->real_file_size) - td->file_size = td->real_file_size; + if (!td->file_size || td->file_size > td->real_file_size) + td->file_size = td->real_file_size; + } td->file_size -= td->file_offset; return 0; @@ -1068,13 +1073,13 @@ static int get_file_size(struct thread_data *td) return ret; if (td->file_offset > td->real_file_size) { - fprintf(f_err, "%s: offset extends end (%Lu > %Lu)\n", td->name, td->file_offset, td->real_file_size); + log_err("%s: offset extends end (%Lu > %Lu)\n", td->name, td->file_offset, td->real_file_size); return 1; } td->io_size = td->file_size; if (td->io_size == 0) { - fprintf(f_err, "%s: no io blocks\n", td->name); + log_err("%s: no io blocks\n", td->name); td_verror(td, EINVAL); return 1; } @@ -1167,13 +1172,12 @@ static int setup_file(struct thread_data *td) td_verror(td, ENOENT); return 1; } - if (create_file(td, td->file_size, 0)) + if (create_file(td, td->file_size)) + return 1; + } else if (td->filetype == FIO_TYPE_FILE && + st.st_size < (off_t) td->file_size) { + if (create_file(td, td->file_size)) return 1; - } else if (td->filetype == FIO_TYPE_FILE) { - if (st.st_size < (off_t) td->file_size) { - if (create_file(td, td->file_size - st.st_size, 1)) - return 1; - } } if (td->odirect) @@ -1253,7 +1257,7 @@ static int switch_ioscheduler(struct thread_data *td) sprintf(tmp2, "[%s]", td->ioscheduler); if (!strstr(tmp, tmp2)) { - fprintf(f_err, "fio: io scheduler %s not found\n", td->ioscheduler); + log_err("fio: io scheduler %s not found\n", td->ioscheduler); td_verror(td, EINVAL); fclose(f); return 1; @@ -1461,7 +1465,7 @@ static void check_str_update(struct thread_data *td) c = 'P'; break; default: - fprintf(f_err, "state %d\n", td->runstate); + log_err("state %d\n", td->runstate); } run_str[td->thread_number - 1] = c; @@ -1549,7 +1553,7 @@ static int thread_eta(struct thread_data *td, unsigned long elapsed) else if (t_eta) eta_sec = t_eta; else - eta_sec = INT_MAX; + eta_sec = 0; } else { /* * thread is already done or waiting for fsync @@ -1567,6 +1571,9 @@ static void print_thread_status(void) char eta_str[32]; double perc = 0.0; + if (temp_stall_ts || terse_output) + return; + eta_secs = malloc(thread_number * sizeof(int)); memset(eta_secs, 0, thread_number * sizeof(int)); @@ -1705,8 +1712,10 @@ static void run_threads(void) mlocked_mem = fio_pin_memory(); - printf("Starting %d thread%s\n", thread_number, thread_number > 1 ? "s" : ""); - fflush(stdout); + if (!terse_output) { + printf("Starting %d thread%s\n", thread_number, thread_number > 1 ? "s" : ""); + fflush(stdout); + } signal(SIGINT, sig_handler); signal(SIGALRM, sig_handler); @@ -1800,7 +1809,6 @@ static void run_threads(void) * Wait for the started threads to transition to * TD_INITIALIZED. */ - printf("fio: Waiting for threads to initialize...\n"); gettimeofday(&this_start, NULL); left = this_jobs; while (left) { @@ -1826,7 +1834,7 @@ static void run_threads(void) } if (left) { - fprintf(f_err, "fio: %d jobs failed to start\n", left); + log_err("fio: %d jobs failed to start\n", left); for (i = 0; i < this_jobs; i++) { td = map[i]; if (!td) @@ -1839,7 +1847,6 @@ static void run_threads(void) /* * start created threads (TD_INITIALIZED -> TD_RUNNING). */ - printf("fio: Go for launch\n"); for (i = 0; i < thread_number; i++) { td = &threads[i]; @@ -1876,7 +1883,7 @@ int main(int argc, char *argv[]) return 1; if (!thread_number) { - fprintf(f_err, "Nothing to do\n"); + log_err("Nothing to do\n"); return 1; }