X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=init.c;h=4d336fa3eb6c08888a9cd7d0d2a3394d40b90479;hp=1a0f7385dfcbe5fe994ba8757f8e22b254b92ed4;hb=380065aa652b87093d6bbd240e70db30bd6f193d;hpb=01f06b63ba67d3bc7fa11766d9f13d229c4cec5c diff --git a/init.c b/init.c index 1a0f7385..4d336fa3 100644 --- a/init.c +++ b/init.c @@ -16,8 +16,10 @@ #include "fio.h" #include "parse.h" +#include "smalloc.h" +#include "filehash.h" -static char fio_version_string[] = "fio 1.18.1"; +static char fio_version_string[] = "fio 1.19"; #define FIO_RANDSEED (0xb1899bedUL) @@ -466,7 +468,7 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num) f->real_file_size = -1ULL; } - td->mutex = fio_sem_init(0); + td->mutex = fio_mutex_init(0); td->ts.clat_stat[0].min_val = td->ts.clat_stat[1].min_val = ULONG_MAX; td->ts.slat_stat[0].min_val = td->ts.slat_stat[1].min_val = ULONG_MAX; @@ -742,15 +744,20 @@ static void free_shm(void) threads = NULL; shmctl(shm_id, IPC_RMID, &sbuf); } + + scleanup(); } /* * The thread area is shared between the main process and the job * threads/processes. So setup a shared memory segment that will hold - * all the job info. + * all the job info. We use the end of the region for keeping track of + * open files across jobs, for file sharing. */ static int setup_thread_area(void) { + void *hash; + /* * 1024 is too much on some machines, scale max_jobs if * we get a failure that looks like too large a shm segment @@ -758,6 +765,8 @@ static int setup_thread_area(void) do { size_t size = max_jobs * sizeof(struct thread_data); + size += file_hash_size; + shm_id = shmget(0, size, IPC_CREAT | 0600); if (shm_id != -1) break; @@ -779,6 +788,8 @@ static int setup_thread_area(void) } memset(threads, 0, max_jobs * sizeof(struct thread_data)); + hash = (void *) threads + max_jobs * sizeof(struct thread_data); + file_hash_init(hash); atexit(free_shm); return 0; } @@ -811,10 +822,12 @@ struct debug_level debug_levels[] = { { .name = "mem", .shift = FD_MEM, }, { .name = "blktrace", .shift = FD_BLKTRACE }, { .name = "verify", .shift = FD_VERIFY }, + { .name = "random", .shift = FD_RANDOM }, + { .name = "parse", .shift = FD_PARSE }, { }, }; -static void set_debug(const char *string) +static int set_debug(const char *string) { struct debug_level *dl; char *p = (char *) string; @@ -830,10 +843,10 @@ static void set_debug(const char *string) log_info("%s,", dl->name); } log_info("all\n"); - return; + return 1; } else if (!strcmp(string, "all")) { fio_debug = ~0UL; - return; + return 0; } while ((opt = strsep(&p, ",")) != NULL) { @@ -852,18 +865,20 @@ static void set_debug(const char *string) if (!found) log_err("fio: debug mask %s not found\n", opt); } + return 0; } #else static void set_debug(const char *string) { log_err("fio: debug tracing not included in build\n"); + return 1; } #endif static int parse_cmd_line(int argc, char *argv[]) { struct thread_data *td = NULL; - int c, ini_idx = 0, lidx, ret, dont_add_job = 0, bad_options = 0; + int c, ini_idx = 0, lidx, ret = 0, do_exit = 0, exit_val = 0; while ((c = getopt_long_only(argc, argv, "", long_options, &lidx)) != -1) { switch (c) { @@ -908,12 +923,14 @@ static int parse_cmd_line(int argc, char *argv[]) eta_print = FIO_ETA_NEVER; break; case 'd': - set_debug(optarg); + if (set_debug(optarg)) + do_exit++; break; case 'x': if (!strcmp(optarg, "global")) { log_err("fio: can't use global as only section\n"); - bad_options++; + do_exit++; + exit_val = 1; break; } if (job_section) @@ -948,27 +965,23 @@ static int parse_cmd_line(int argc, char *argv[]) } ret = fio_cmd_option_parse(td, opt, val); - if (ret) - dont_add_job = 1; break; } default: - bad_options++; + do_exit++; + exit_val = 1; break; } } - if (bad_options) - exit(1); + if (do_exit) + exit(exit_val); if (td) { - if (dont_add_job) - put_job(td); - else { + if (!ret) ret = add_job(td, td->o.name ?: "fio", 0); - if (ret) - put_job(td); - } + if (ret) + put_job(td); } while (optind < argc) {