From: Jens Axboe Date: Thu, 16 Jan 2020 22:44:16 +0000 (-0700) Subject: Merge branch 'master' of https://github.com/bvanassche/fio X-Git-Tag: fio-3.18~12 X-Git-Url: https://git.kernel.dk/?p=fio.git;a=commitdiff_plain;h=2d8ca3fe2b3f3abc6d0ab50b7ad371b5dd7307e5;hp=d38cb35facfe50d694939796fb164e01562b8dd5 Merge branch 'master' of https://github.com/bvanassche/fio * 'master' of https://github.com/bvanassche/fio: t/read-to-pipe-async: Complain if pthread_detach() fails t/read-to-pipe-async: Do not divide by zero t/memlock: Verify 'threads' argument server: Make it explicit that the setsockopt() return value is ignored blktrace: Fix memory leaks in error paths blktrace: Check value of 'merge_buf' pointer before using it blktrace: Pass a positive error code to td_verror() --- diff --git a/blktrace.c b/blktrace.c index 8a246613..64a610a9 100644 --- a/blktrace.c +++ b/blktrace.c @@ -28,8 +28,11 @@ static int refill_fifo(struct thread_data *td, struct fifo *fifo, int fd) ret = read(fd, buf, total); if (ret < 0) { - td_verror(td, errno, "read blktrace file"); - return -1; + int read_err = errno; + + assert(read_err > 0); + td_verror(td, read_err, "read blktrace file"); + return -read_err; } if (ret > 0) @@ -486,7 +489,7 @@ bool load_blktrace(struct thread_data *td, const char *filename, int need_swap) } ret = discard_pdu(td, fifo, fd, &t); if (ret < 0) { - td_verror(td, ret, "blktrace lseek"); + td_verror(td, -ret, "blktrace lseek"); goto err; } else if (t.pdu_len != ret) { log_err("fio: discarded %d of %d\n", ret, t.pdu_len); @@ -663,7 +666,7 @@ read_skip: t_get_ddir(t) == DDIR_INVAL) { ret = discard_pdu(td, bc->fifo, bc->fd, t); if (ret < 0) { - td_verror(td, ret, "blktrace lseek"); + td_verror(td, -ret, "blktrace lseek"); return ret; } else if (t->pdu_len != ret) { log_err("fio: discarded %d of %d\n", ret, @@ -716,9 +719,11 @@ int merge_blktrace_iologs(struct thread_data *td) /* setup output file */ merge_fp = fopen(td->o.merge_blktrace_file, "w"); merge_buf = malloc(128 * 1024); + if (!merge_buf) + goto err_out_file; ret = setvbuf(merge_fp, merge_buf, _IOFBF, 128 * 1024); if (ret) - goto err_out_file; + goto err_merge_buf; /* setup input files */ str = ptr = strdup(td->o.read_iolog_file); @@ -728,6 +733,7 @@ int merge_blktrace_iologs(struct thread_data *td) if (bcs[i].fd < 0) { log_err("fio: could not open file: %s\n", name); ret = bcs[i].fd; + free(str); goto err_file; } bcs[i].fifo = fifo_alloc(TRACE_FIFO_SIZE); @@ -735,11 +741,13 @@ int merge_blktrace_iologs(struct thread_data *td) if (!is_blktrace(name, &bcs[i].swap)) { log_err("fio: file is not a blktrace: %s\n", name); + free(str); goto err_file; } ret = read_trace(td, &bcs[i]); if (ret < 0) { + free(str); goto err_file; } else if (!ret) { merge_finish_file(bcs, i, &nr_logs); @@ -755,7 +763,7 @@ int merge_blktrace_iologs(struct thread_data *td) /* skip over the pdu */ ret = discard_pdu(td, bc->fifo, bc->fd, &bc->t); if (ret < 0) { - td_verror(td, ret, "blktrace lseek"); + td_verror(td, -ret, "blktrace lseek"); goto err_file; } else if (bc->t.pdu_len != ret) { log_err("fio: discarded %d of %d\n", ret, @@ -781,10 +789,11 @@ err_file: fifo_free(bcs[i].fifo); close(bcs[i].fd); } +err_merge_buf: + free(merge_buf); err_out_file: fflush(merge_fp); fclose(merge_fp); - free(merge_buf); err_param: free(bcs); diff --git a/server.c b/server.c index b7347b43..1a070e56 100644 --- a/server.c +++ b/server.c @@ -2154,7 +2154,8 @@ static int fio_init_server_ip(void) /* * Not fatal if fails, so just ignore it if that happens */ - setsockopt(sk, SOL_SOCKET, SO_REUSEPORT, &opt, sizeof(opt)); + if (setsockopt(sk, SOL_SOCKET, SO_REUSEPORT, &opt, sizeof(opt))) { + } #endif if (use_ipv6) { diff --git a/t/memlock.c b/t/memlock.c index ebedb91d..418dc3c4 100644 --- a/t/memlock.c +++ b/t/memlock.c @@ -43,6 +43,10 @@ int main(int argc, char *argv[]) mib = strtoul(argv[1], NULL, 10); threads = strtoul(argv[2], NULL, 10); + if (threads < 1 || threads > 65536) { + printf("%s: invalid 'threads' argument\n", argv[0]); + return 1; + } pthreads = calloc(threads, sizeof(pthread_t)); td.mib = mib; diff --git a/t/read-to-pipe-async.c b/t/read-to-pipe-async.c index bc7986f7..586e3c95 100644 --- a/t/read-to-pipe-async.c +++ b/t/read-to-pipe-async.c @@ -392,10 +392,13 @@ static void queue_work(struct reader_thread *rt, struct work_item *work) pthread_cond_signal(&rt->thread.cond); } else { int ret = pthread_create(&work->thread, NULL, reader_one_off, work); - if (ret) + if (ret) { fprintf(stderr, "pthread_create=%d\n", ret); - else - pthread_detach(work->thread); + } else { + ret = pthread_detach(work->thread); + if (ret) + fprintf(stderr, "pthread_detach=%d\n", ret); + } } } @@ -581,6 +584,7 @@ int main(int argc, char *argv[]) struct reader_thread *rt; struct writer_thread *wt; unsigned long rate; + uint64_t elapsed; struct stat sb; size_t bytes; off_t off; @@ -684,9 +688,11 @@ int main(int argc, char *argv[]) show_latencies(&wt->s, "WRITERS"); bytes /= 1024; - rate = (bytes * 1000UL * 1000UL) / utime_since(&s, &re); + elapsed = utime_since(&s, &re); + rate = elapsed ? (bytes * 1000UL * 1000UL) / elapsed : 0; fprintf(stderr, "Read rate (KiB/sec) : %lu\n", rate); - rate = (bytes * 1000UL * 1000UL) / utime_since(&s, &we); + elapsed = utime_since(&s, &we); + rate = elapsed ? (bytes * 1000UL * 1000UL) / elapsed : 0; fprintf(stderr, "Write rate (KiB/sec): %lu\n", rate); close(fd);