From 913028e97ceedcf2cf1ec6ec32228b3c50e7337c Mon Sep 17 00:00:00 2001 From: Denis Pronin Date: Fri, 28 Jul 2023 01:26:22 +0300 Subject: [PATCH] correctly free thread_data options at the topmost parent process for non-threaded mode: since thread_data::eo is a pointer within shared memory between the topmost fio parent process and its children let the fio parent process set the pointer to NULL as just it frees its copy of 'eo' as memory previously allocated by means of 'malloc' meaning that each child and the parent process itself must free it for threaded mode we leave it as it has always been also we do not need to check td->io_ops for being able to free td->eo in fio_options_free() Signed-off-by: Denis Pronin --- backend.c | 4 ---- ioengines.c | 3 ++- options.c | 4 ++-- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/backend.c b/backend.c index 5f074039..b21c3664 100644 --- a/backend.c +++ b/backend.c @@ -2494,10 +2494,7 @@ 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; @@ -2506,7 +2503,6 @@ reap: _exit(ret); } else if (__td_index == fio_debug_jobno) *fio_debug_jobp = pid; - free(eo); free(fd); fd = NULL; } diff --git a/ioengines.c b/ioengines.c index 36172725..fd8c9d1a 100644 --- a/ioengines.c +++ b/ioengines.c @@ -238,7 +238,8 @@ void free_ioengine(struct thread_data *td) if (td->eo && td->io_ops->options) { options_free(td->io_ops->options, td->eo); free(td->eo); - td->eo = NULL; + if (td->o.use_thread) + td->eo = NULL; } if (td->io_ops->dlhandle) { diff --git a/options.c b/options.c index 48aa0d7b..9432a0fb 100644 --- a/options.c +++ b/options.c @@ -5829,9 +5829,9 @@ void fio_options_free(struct thread_data *td) options_free(fio_options, &td->o); if (td->eo && td->io_ops && td->io_ops->options) { options_free(td->io_ops->options, td->eo); - free(td->eo); - td->eo = NULL; } + free(td->eo); + td->eo = NULL; } void fio_dump_options_free(struct thread_data *td) -- 2.25.1