| From 6afb9af3dd7734d0f6bd090fba947ffaec43482b Mon Sep 17 00:00:00 2001 |
| From: dongjiuzhu1 <dongjiuzhu1@xiaomi.com> |
| Date: Mon, 5 Jun 2023 14:44:53 +0800 |
| Subject: [PATCH 06/10] external/fio: reinit global var issue when run multiple |
| times |
| |
| Signed-off-by: dongjiuzhu1 <dongjiuzhu1@xiaomi.com> |
| --- |
| init.c | 386 +++++++++++++++++++++++++----------------------------- |
| smalloc.c | 4 + |
| 2 files changed, 186 insertions(+), 204 deletions(-) |
| |
| diff --git fio/init.c fio/init.c |
| index de9d9d27..9dcad491 100644 |
| --- fio/init.c |
| +++ fio/init.c |
| @@ -96,214 +96,191 @@ static bool did_arg; |
| * Command line options. These will contain the above, plus a few |
| * extra that only pertain to fio itself and not jobs. |
| */ |
| -static struct option l_opts[FIO_NR_OPTIONS] = { |
| - { |
| - .name = (char *) "output", |
| - .has_arg = required_argument, |
| - .val = 'o' | FIO_CLIENT_FLAG, |
| - }, |
| - { |
| - .name = (char *) "latency-log", |
| - .has_arg = required_argument, |
| - .val = 'l' | FIO_CLIENT_FLAG, |
| - }, |
| - { |
| - .name = (char *) "bandwidth-log", |
| - .has_arg = no_argument, |
| - .val = 'b' | FIO_CLIENT_FLAG, |
| - }, |
| - { |
| - .name = (char *) "minimal", |
| - .has_arg = no_argument, |
| - .val = 'm' | FIO_CLIENT_FLAG, |
| - }, |
| - { |
| - .name = (char *) "output-format", |
| - .has_arg = required_argument, |
| - .val = 'F' | FIO_CLIENT_FLAG, |
| - }, |
| - { |
| - .name = (char *) "append-terse", |
| - .has_arg = optional_argument, |
| - .val = 'f', |
| - }, |
| - { |
| - .name = (char *) "version", |
| - .has_arg = no_argument, |
| - .val = 'v' | FIO_CLIENT_FLAG, |
| - }, |
| - { |
| - .name = (char *) "help", |
| - .has_arg = no_argument, |
| - .val = 'h' | FIO_CLIENT_FLAG, |
| - }, |
| - { |
| - .name = (char *) "cmdhelp", |
| - .has_arg = optional_argument, |
| - .val = 'c' | FIO_CLIENT_FLAG, |
| - }, |
| - { |
| - .name = (char *) "enghelp", |
| - .has_arg = optional_argument, |
| - .val = 'i' | FIO_CLIENT_FLAG, |
| - }, |
| - { |
| - .name = (char *) "showcmd", |
| - .has_arg = no_argument, |
| - .val = 's' | FIO_CLIENT_FLAG, |
| - }, |
| - { |
| - .name = (char *) "readonly", |
| - .has_arg = no_argument, |
| - .val = 'r' | FIO_CLIENT_FLAG, |
| - }, |
| - { |
| - .name = (char *) "eta", |
| - .has_arg = required_argument, |
| - .val = 'e' | FIO_CLIENT_FLAG, |
| - }, |
| - { |
| - .name = (char *) "eta-interval", |
| - .has_arg = required_argument, |
| - .val = 'O' | FIO_CLIENT_FLAG, |
| - }, |
| - { |
| - .name = (char *) "eta-newline", |
| - .has_arg = required_argument, |
| - .val = 'E' | FIO_CLIENT_FLAG, |
| - }, |
| - { |
| - .name = (char *) "debug", |
| - .has_arg = required_argument, |
| - .val = 'd' | FIO_CLIENT_FLAG, |
| - }, |
| - { |
| - .name = (char *) "parse-only", |
| - .has_arg = no_argument, |
| - .val = 'P' | FIO_CLIENT_FLAG, |
| - }, |
| - { |
| - .name = (char *) "section", |
| - .has_arg = required_argument, |
| - .val = 'x' | FIO_CLIENT_FLAG, |
| - }, |
| +static struct option l_opts[FIO_NR_OPTIONS]; |
| +static void fio_init_global(void) |
| +{ |
| + int i = 0; |
| + |
| + l_opts[i].name = (char *) "output", |
| + l_opts[i].has_arg = required_argument, |
| + l_opts[i++].val = 'o' | FIO_CLIENT_FLAG, |
| + |
| + l_opts[i].name = (char *) "latency-log", |
| + l_opts[i].has_arg = required_argument, |
| + l_opts[i++].val = 'l' | FIO_CLIENT_FLAG, |
| + |
| + l_opts[i].name = (char *) "bandwidth-log", |
| + l_opts[i].has_arg = no_argument, |
| + l_opts[i++].val = 'b' | FIO_CLIENT_FLAG, |
| + |
| + l_opts[i].name = (char *) "minimal", |
| + l_opts[i].has_arg = no_argument, |
| + l_opts[i++].val = 'm' | FIO_CLIENT_FLAG, |
| + |
| + l_opts[i].name = (char *) "output-format", |
| + l_opts[i].has_arg = required_argument, |
| + l_opts[i++].val = 'F' | FIO_CLIENT_FLAG, |
| + |
| + l_opts[i].name = (char *) "append-terse", |
| + l_opts[i].has_arg = optional_argument, |
| + l_opts[i++].val = 'f', |
| + |
| + l_opts[i].name = (char *) "version", |
| + l_opts[i].has_arg = no_argument, |
| + l_opts[i++].val = 'v' | FIO_CLIENT_FLAG, |
| + |
| + l_opts[i].name = (char *) "help", |
| + l_opts[i].has_arg = no_argument, |
| + l_opts[i++].val = 'h' | FIO_CLIENT_FLAG, |
| + |
| + l_opts[i].name = (char *) "cmdhelp", |
| + l_opts[i].has_arg = optional_argument, |
| + l_opts[i++].val = 'c' | FIO_CLIENT_FLAG, |
| + |
| + l_opts[i].name = (char *) "enghelp", |
| + l_opts[i].has_arg = optional_argument, |
| + l_opts[i++].val = 'i' | FIO_CLIENT_FLAG, |
| + |
| + l_opts[i].name = (char *) "showcmd", |
| + l_opts[i].has_arg = no_argument, |
| + l_opts[i++].val = 's' | FIO_CLIENT_FLAG, |
| + |
| + l_opts[i].name = (char *) "readonly", |
| + l_opts[i].has_arg = no_argument, |
| + l_opts[i++].val = 'r' | FIO_CLIENT_FLAG, |
| + |
| + l_opts[i].name = (char *) "eta", |
| + l_opts[i].has_arg = required_argument, |
| + l_opts[i++].val = 'e' | FIO_CLIENT_FLAG, |
| + |
| + l_opts[i].name = (char *) "eta-interval", |
| + l_opts[i].has_arg = required_argument, |
| + l_opts[i++].val = 'O' | FIO_CLIENT_FLAG, |
| + |
| + l_opts[i].name = (char *) "eta-newline", |
| + l_opts[i].has_arg = required_argument, |
| + l_opts[i++].val = 'E' | FIO_CLIENT_FLAG, |
| + |
| + l_opts[i].name = (char *) "debug", |
| + l_opts[i].has_arg = required_argument, |
| + l_opts[i++].val = 'd' | FIO_CLIENT_FLAG, |
| + |
| + l_opts[i].name = (char *) "parse-only", |
| + l_opts[i].has_arg = no_argument, |
| + l_opts[i++].val = 'P' | FIO_CLIENT_FLAG, |
| + |
| + l_opts[i].name = (char *) "section", |
| + l_opts[i].has_arg = required_argument, |
| + l_opts[i++].val = 'x' | FIO_CLIENT_FLAG, |
| + |
| #ifdef CONFIG_ZLIB |
| - { |
| - .name = (char *) "inflate-log", |
| - .has_arg = required_argument, |
| - .val = 'X' | FIO_CLIENT_FLAG, |
| - }, |
| + l_opts[i].name = (char *) "inflate-log", |
| + l_opts[i].has_arg = required_argument, |
| + l_opts[i++].val = 'X' | FIO_CLIENT_FLAG, |
| #endif |
| - { |
| - .name = (char *) "alloc-size", |
| - .has_arg = required_argument, |
| - .val = 'a' | FIO_CLIENT_FLAG, |
| - }, |
| - { |
| - .name = (char *) "profile", |
| - .has_arg = required_argument, |
| - .val = 'p' | FIO_CLIENT_FLAG, |
| - }, |
| - { |
| - .name = (char *) "warnings-fatal", |
| - .has_arg = no_argument, |
| - .val = 'w' | FIO_CLIENT_FLAG, |
| - }, |
| - { |
| - .name = (char *) "max-jobs", |
| - .has_arg = required_argument, |
| - .val = 'j' | FIO_CLIENT_FLAG, |
| - }, |
| - { |
| - .name = (char *) "terse-version", |
| - .has_arg = required_argument, |
| - .val = 'V' | FIO_CLIENT_FLAG, |
| - }, |
| - { |
| - .name = (char *) "server", |
| - .has_arg = optional_argument, |
| - .val = 'S', |
| - }, |
| + |
| + l_opts[i].name = (char *) "alloc-size", |
| + l_opts[i].has_arg = required_argument, |
| + l_opts[i++].val = 'a' | FIO_CLIENT_FLAG, |
| + |
| + l_opts[i].name = (char *) "profile", |
| + l_opts[i].has_arg = required_argument, |
| + l_opts[i++].val = 'p' | FIO_CLIENT_FLAG, |
| + |
| + l_opts[i].name = (char *) "warnings-fatal", |
| + l_opts[i].has_arg = no_argument, |
| + l_opts[i++].val = 'w' | FIO_CLIENT_FLAG, |
| + |
| + l_opts[i].name = (char *) "max-jobs", |
| + l_opts[i].has_arg = required_argument, |
| + l_opts[i++].val = 'j' | FIO_CLIENT_FLAG, |
| + |
| + l_opts[i].name = (char *) "terse-version", |
| + l_opts[i].has_arg = required_argument, |
| + l_opts[i++].val = 'V' | FIO_CLIENT_FLAG, |
| + |
| + l_opts[i].name = (char *) "server", |
| + l_opts[i].has_arg = optional_argument, |
| + l_opts[i++].val = 'S', |
| + |
| #ifdef WIN32 |
| - { |
| - .name = (char *) "server-internal", |
| - .has_arg = required_argument, |
| - .val = 'N', |
| - }, |
| + l_opts[i].name = (char *) "server-internal", |
| + l_opts[i].has_arg = required_argument, |
| + l_opts[i++].val = 'N', |
| #endif |
| - { .name = (char *) "daemonize", |
| - .has_arg = required_argument, |
| - .val = 'D', |
| - }, |
| - { |
| - .name = (char *) "client", |
| - .has_arg = required_argument, |
| - .val = 'C', |
| - }, |
| - { |
| - .name = (char *) "remote-config", |
| - .has_arg = required_argument, |
| - .val = 'R', |
| - }, |
| - { |
| - .name = (char *) "cpuclock-test", |
| - .has_arg = no_argument, |
| - .val = 'T', |
| - }, |
| - { |
| - .name = (char *) "crctest", |
| - .has_arg = optional_argument, |
| - .val = 'G', |
| - }, |
| - { |
| - .name = (char *) "memcpytest", |
| - .has_arg = optional_argument, |
| - .val = 'M', |
| - }, |
| - { |
| - .name = (char *) "idle-prof", |
| - .has_arg = required_argument, |
| - .val = 'I', |
| - }, |
| - { |
| - .name = (char *) "status-interval", |
| - .has_arg = required_argument, |
| - .val = 'L' | FIO_CLIENT_FLAG, |
| - }, |
| - { |
| - .name = (char *) "trigger-file", |
| - .has_arg = required_argument, |
| - .val = 'W', |
| - }, |
| - { |
| - .name = (char *) "trigger-timeout", |
| - .has_arg = required_argument, |
| - .val = 'B', |
| - }, |
| - { |
| - .name = (char *) "trigger", |
| - .has_arg = required_argument, |
| - .val = 'H', |
| - }, |
| - { |
| - .name = (char *) "trigger-remote", |
| - .has_arg = required_argument, |
| - .val = 'J', |
| - }, |
| - { |
| - .name = (char *) "aux-path", |
| - .has_arg = required_argument, |
| - .val = 'K', |
| - }, |
| - { |
| - .name = (char *) "merge-blktrace-only", |
| - .has_arg = no_argument, |
| - .val = 'A' | FIO_CLIENT_FLAG, |
| - }, |
| - { |
| - .name = NULL, |
| - }, |
| -}; |
| + |
| + l_opts[i].name = (char *) "daemonize", |
| + l_opts[i].has_arg = required_argument, |
| + l_opts[i++].val = 'D', |
| + |
| + l_opts[i].name = (char *) "client", |
| + l_opts[i].has_arg = required_argument, |
| + l_opts[i++].val = 'C', |
| + |
| + l_opts[i].name = (char *) "remote-config", |
| + l_opts[i].has_arg = required_argument, |
| + l_opts[i++].val = 'R', |
| + |
| + l_opts[i].name = (char *) "cpuclock-test", |
| + l_opts[i].has_arg = no_argument, |
| + l_opts[i++].val = 'T', |
| + |
| + l_opts[i].name = (char *) "crctest", |
| + l_opts[i].has_arg = optional_argument, |
| + l_opts[i++].val = 'G', |
| + |
| + l_opts[i].name = (char *) "memcpytest", |
| + l_opts[i].has_arg = optional_argument, |
| + l_opts[i++].val = 'M', |
| + |
| + l_opts[i].name = (char *) "idle-prof", |
| + l_opts[i].has_arg = required_argument, |
| + l_opts[i++].val = 'I', |
| + |
| + l_opts[i].name = (char *) "status-interval", |
| + l_opts[i].has_arg = required_argument, |
| + l_opts[i++].val = 'L' | FIO_CLIENT_FLAG, |
| + |
| + l_opts[i].name = (char *) "trigger-file", |
| + l_opts[i].has_arg = required_argument, |
| + l_opts[i++].val = 'W', |
| + |
| + l_opts[i].name = (char *) "trigger-timeout", |
| + l_opts[i].has_arg = required_argument, |
| + l_opts[i++].val = 'B', |
| + |
| + l_opts[i].name = (char *) "trigger", |
| + l_opts[i].has_arg = required_argument, |
| + l_opts[i++].val = 'H', |
| + |
| + l_opts[i].name = (char *) "trigger-remote", |
| + l_opts[i].has_arg = required_argument, |
| + l_opts[i++].val = 'J', |
| + |
| + l_opts[i].name = (char *) "aux-path", |
| + l_opts[i].has_arg = required_argument, |
| + l_opts[i++].val = 'K', |
| + |
| + l_opts[i].name = (char *) "merge-blktrace-only", |
| + l_opts[i].has_arg = no_argument, |
| + l_opts[i++].val = 'A' | FIO_CLIENT_FLAG, |
| + |
| + l_opts[i].name = NULL, |
| + |
| + thread_number = 0; |
| + nr_segments = 0; |
| + cur_segment = 0; |
| + stat_number = 0; |
| + |
| + did_arg = false; |
| + ini_file = NULL; |
| + nr_clients = 0; |
| + thread_number = 0; |
| + prev_group_jobs = 0; |
| + memset(&def_thread, 0, sizeof(def_thread)); |
| + memset(segments, 0, sizeof(segments)); |
| + memset(cmd_optstr, 0, sizeof(cmd_optstr)); |
| +} |
| |
| void free_threads_shm(void) |
| { |
| @@ -3044,6 +3021,7 @@ int fio_init_options(void) |
| f_out = stdout; |
| f_err = stderr; |
| |
| + fio_init_global(); |
| fio_options_fill_optstring(); |
| fio_options_dup_and_init(l_opts); |
| |
| diff --git fio/smalloc.c fio/smalloc.c |
| index 142e03d2..a93290eb 100644 |
| --- fio/smalloc.c |
| +++ fio/smalloc.c |
| @@ -215,6 +215,10 @@ void sinit(void) |
| bool ret; |
| int i; |
| |
| + mp = NULL; |
| + nr_pools = 0; |
| + smalloc_pool_size = INITIAL_SIZE; |
| + |
| /* |
| * sinit() can be called more than once if alloc-size is |
| * set. But we want to allocate space for the struct pool |
| -- |
| 2.34.1 |
| |