projects
/
fio.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Add support for compiling for ESX
[fio.git]
/
init.c
diff --git
a/init.c
b/init.c
index c3996a76c12840e3ab3cf6514e5d5dce611a1077..d44eb5b1eaa2fb086afe25b3a6bda335320decf7 100644
(file)
--- a/
init.c
+++ b/
init.c
@@
-24,6
+24,7
@@
#include "profile.h"
#include "server.h"
#include "idletime.h"
#include "profile.h"
#include "server.h"
#include "idletime.h"
+#include "filelock.h"
#include "lib/getopt.h"
#include "lib/strcasestr.h"
#include "lib/getopt.h"
#include "lib/strcasestr.h"
@@
-37,7
+38,7
@@
const char fio_version_string[] = FIO_VERSION;
static char **ini_file;
static int max_jobs = FIO_MAX_JOBS;
static int dump_cmdline;
static char **ini_file;
static int max_jobs = FIO_MAX_JOBS;
static int dump_cmdline;
-static
int
def_timeout;
+static
long long
def_timeout;
static int parse_only;
static struct thread_data def_thread;
static int parse_only;
static struct thread_data def_thread;
@@
-237,15
+238,19
@@
static struct option l_opts[FIO_NR_OPTIONS] = {
void free_threads_shm(void)
{
void free_threads_shm(void)
{
- struct shmid_ds sbuf;
-
if (threads) {
void *tp = threads;
if (threads) {
void *tp = threads;
+#ifndef CONFIG_NO_SHM
+ struct shmid_ds sbuf;
threads = NULL;
shmdt(tp);
shmctl(shm_id, IPC_RMID, &sbuf);
shm_id = -1;
threads = NULL;
shmdt(tp);
shmctl(shm_id, IPC_RMID, &sbuf);
shm_id = -1;
+#else
+ threads = NULL;
+ free(tp);
+#endif
}
}
}
}
@@
-259,6
+264,7
@@
static void free_shm(void)
}
options_free(fio_options, &def_thread);
}
options_free(fio_options, &def_thread);
+ fio_filelock_exit();
scleanup();
}
scleanup();
}
@@
-285,6
+291,7
@@
static int setup_thread_area(void)
size += file_hash_size;
size += sizeof(unsigned int);
size += file_hash_size;
size += sizeof(unsigned int);
+#ifndef CONFIG_NO_SHM
shm_id = shmget(0, size, IPC_CREAT | 0600);
if (shm_id != -1)
break;
shm_id = shmget(0, size, IPC_CREAT | 0600);
if (shm_id != -1)
break;
@@
-292,10
+299,16
@@
static int setup_thread_area(void)
perror("shmget");
break;
}
perror("shmget");
break;
}
+#else
+ threads = malloc(size);
+ if (threads)
+ break;
+#endif
max_jobs >>= 1;
} while (max_jobs);
max_jobs >>= 1;
} while (max_jobs);
+#ifndef CONFIG_NO_SHM
if (shm_id == -1)
return 1;
if (shm_id == -1)
return 1;
@@
-304,6
+317,7
@@
static int setup_thread_area(void)
perror("shmat");
return 1;
}
perror("shmat");
return 1;
}
+#endif
memset(threads, 0, max_jobs * sizeof(struct thread_data));
hash = (void *) threads + max_jobs * sizeof(struct thread_data);
memset(threads, 0, max_jobs * sizeof(struct thread_data));
hash = (void *) threads + max_jobs * sizeof(struct thread_data);
@@
-316,6
+330,14
@@
static int setup_thread_area(void)
return 0;
}
return 0;
}
+static void set_cmd_options(struct thread_data *td)
+{
+ struct thread_options *o = &td->o;
+
+ if (!o->timeout)
+ o->timeout = def_timeout;
+}
+
/*
* Return a free job structure.
*/
/*
* Return a free job structure.
*/
@@
-324,8
+346,10
@@
static struct thread_data *get_new_job(int global, struct thread_data *parent,
{
struct thread_data *td;
{
struct thread_data *td;
- if (global)
+ if (global) {
+ set_cmd_options(&def_thread);
return &def_thread;
return &def_thread;
+ }
if (setup_thread_area()) {
log_err("error: failed to setup shm segment\n");
return NULL;
if (setup_thread_area()) {
log_err("error: failed to setup shm segment\n");
return NULL;
@@
-352,9
+376,10
@@
static struct thread_data *get_new_job(int global, struct thread_data *parent,
td->thread_number = thread_number;
td->thread_number = thread_number;
- if (!parent
|| !parent
->o.group_reporting)
+ if (!parent->o.group_reporting)
stat_number++;
stat_number++;
+ set_cmd_options(td);
return td;
}
return td;
}
@@
-924,11
+949,12
@@
static struct fpre_keyword {
{ .keyword = NULL, },
};
{ .keyword = NULL, },
};
-static char *make_filename(char *buf, struct thread_options *o,
+static char *make_filename(char *buf, s
ize_t buf_size,s
truct thread_options *o,
const char *jobname, int jobnum, int filenum)
{
struct fpre_keyword *f;
char copy[PATH_MAX];
const char *jobname, int jobnum, int filenum)
{
struct fpre_keyword *f;
char copy[PATH_MAX];
+ size_t dst_left = PATH_MAX - 1;
if (!o->filename_format || !strlen(o->filename_format)) {
sprintf(buf, "%s.%d.%d", jobname, jobnum, filenum);
if (!o->filename_format || !strlen(o->filename_format)) {
sprintf(buf, "%s.%d.%d", jobname, jobnum, filenum);
@@
-938,7
+964,9
@@
static char *make_filename(char *buf, struct thread_options *o,
for (f = &fpre_keywords[0]; f->keyword; f++)
f->strlen = strlen(f->keyword);
for (f = &fpre_keywords[0]; f->keyword; f++)
f->strlen = strlen(f->keyword);
- strcpy(buf, o->filename_format);
+ buf[buf_size - 1] = '\0';
+ strncpy(buf, o->filename_format, buf_size - 1);
+
memset(copy, 0, sizeof(copy));
for (f = &fpre_keywords[0]; f->keyword; f++) {
do {
memset(copy, 0, sizeof(copy));
for (f = &fpre_keywords[0]; f->keyword; f++) {
do {
@@
-956,27
+984,49
@@
static char *make_filename(char *buf, struct thread_options *o,
if (pre_len) {
strncpy(dst, buf, pre_len);
dst += pre_len;
if (pre_len) {
strncpy(dst, buf, pre_len);
dst += pre_len;
+ dst_left -= pre_len;
}
switch (f->key) {
}
switch (f->key) {
- case FPRE_JOBNAME:
- dst += sprintf(dst, "%s", jobname);
+ case FPRE_JOBNAME: {
+ int ret;
+
+ ret = snprintf(dst, dst_left, "%s", jobname);
+ if (ret < 0)
+ break;
+ dst += ret;
+ dst_left -= ret;
break;
break;
- case FPRE_JOBNUM:
- dst += sprintf(dst, "%d", jobnum);
+ }
+ case FPRE_JOBNUM: {
+ int ret;
+
+ ret = snprintf(dst, dst_left, "%d", jobnum);
+ if (ret < 0)
+ break;
+ dst += ret;
+ dst_left -= ret;
break;
break;
- case FPRE_FILENUM:
- dst += sprintf(dst, "%d", filenum);
+ }
+ case FPRE_FILENUM: {
+ int ret;
+
+ ret = snprintf(dst, dst_left, "%d", filenum);
+ if (ret < 0)
+ break;
+ dst += ret;
+ dst_left -= ret;
break;
break;
+ }
default:
assert(0);
break;
}
if (post_start)
default:
assert(0);
break;
}
if (post_start)
- str
cpy(dst, buf + post_star
t);
+ str
ncpy(dst, buf + post_start, dst_lef
t);
- str
cpy(buf, copy
);
+ str
ncpy(buf, copy, buf_size - 1
);
} while (1);
}
} while (1);
}
@@
-1036,7
+1086,7
@@
static int add_job(struct thread_data *td, const char *jobname, int job_add_num,
add_file(td, jobname, job_add_num, 0);
else {
for (i = 0; i < o->nr_files; i++)
add_file(td, jobname, job_add_num, 0);
else {
for (i = 0; i < o->nr_files; i++)
- add_file(td, make_filename(fname, o, jobname, job_add_num, i), job_add_num, 0);
+ add_file(td, make_filename(fname,
sizeof(fname),
o, jobname, job_add_num, i), job_add_num, 0);
}
}
}
}
@@
-1422,9
+1472,6
@@
int parse_jobs_ini(char *file, int is_buf, int stonewall_flag, int type)
i++;
}
i++;
}
- for (i = 0; i < num_opts; i++)
- free(opts[i]);
-
free(string);
free(name);
free(opts);
free(string);
free(name);
free(opts);
@@
-1438,8
+1485,8
@@
static int fill_def_thread(void)
memset(&def_thread, 0, sizeof(def_thread));
fio_getaffinity(getpid(), &def_thread.o.cpumask);
memset(&def_thread, 0, sizeof(def_thread));
fio_getaffinity(getpid(), &def_thread.o.cpumask);
- def_thread.o.timeout = def_timeout;
def_thread.o.error_dump = 1;
def_thread.o.error_dump = 1;
+
/*
* fill default options
*/
/*
* fill default options
*/
@@
-1681,8
+1728,6
@@
int parse_cmd_line(int argc, char *argv[], int client_type)
optind = 1;
while ((c = getopt_long_only(argc, argv, ostr, l_opts, &lidx)) != -1) {
optind = 1;
while ((c = getopt_long_only(argc, argv, ostr, l_opts, &lidx)) != -1) {
- did_arg = 1;
-
if ((c & FIO_CLIENT_FLAG) || client_flag_set(c)) {
parse_cmd_client(cur_client, argv[optind - 1]);
c &= ~FIO_CLIENT_FLAG;
if ((c & FIO_CLIENT_FLAG) || client_flag_set(c)) {
parse_cmd_client(cur_client, argv[optind - 1]);
c &= ~FIO_CLIENT_FLAG;
@@
-1693,7
+1738,11
@@
int parse_cmd_line(int argc, char *argv[], int client_type)
smalloc_pool_size = atoi(optarg);
break;
case 't':
smalloc_pool_size = atoi(optarg);
break;
case 't':
- def_timeout = atoi(optarg);
+ if (check_str_time(optarg, &def_timeout, 1)) {
+ log_err("fio: failed parsing time %s\n", optarg);
+ do_exit++;
+ exit_val = 1;
+ }
break;
case 'l':
write_lat_log = 1;
break;
case 'l':
write_lat_log = 1;
@@
-1702,6
+1751,9
@@
int parse_cmd_line(int argc, char *argv[], int client_type)
write_bw_log = 1;
break;
case 'o':
write_bw_log = 1;
break;
case 'o':
+ if (f_out && f_out != stdout)
+ fclose(f_out);
+
f_out = fopen(optarg, "w+");
if (!f_out) {
perror("fopen output");
f_out = fopen(optarg, "w+");
if (!f_out) {
perror("fopen output");
@@
-1732,30
+1784,35
@@
int parse_cmd_line(int argc, char *argv[], int client_type)
append_terse_output = 1;
break;
case 'h':
append_terse_output = 1;
break;
case 'h':
+ did_arg = 1;
if (!cur_client) {
usage(argv[0]);
do_exit++;
}
break;
case 'c':
if (!cur_client) {
usage(argv[0]);
do_exit++;
}
break;
case 'c':
+ did_arg = 1;
if (!cur_client) {
fio_show_option_help(optarg);
do_exit++;
}
break;
case 'i':
if (!cur_client) {
fio_show_option_help(optarg);
do_exit++;
}
break;
case 'i':
+ did_arg = 1;
if (!cur_client) {
fio_show_ioengine_help(optarg);
do_exit++;
}
break;
case 's':
if (!cur_client) {
fio_show_ioengine_help(optarg);
do_exit++;
}
break;
case 's':
+ did_arg = 1;
dump_cmdline = 1;
break;
case 'r':
read_only = 1;
break;
case 'v':
dump_cmdline = 1;
break;
case 'r':
read_only = 1;
break;
case 'v':
+ did_arg = 1;
if (!cur_client) {
log_info("%s\n", fio_version_string);
do_exit++;
if (!cur_client) {
log_info("%s\n", fio_version_string);
do_exit++;
@@
-1792,6
+1849,7
@@
int parse_cmd_line(int argc, char *argv[], int client_type)
do_exit++;
break;
case 'P':
do_exit++;
break;
case 'P':
+ did_arg = 1;
parse_only = 1;
break;
case 'x': {
parse_only = 1;
break;
case 'x': {
@@
-1811,6
+1869,9
@@
int parse_cmd_line(int argc, char *argv[], int client_type)
break;
}
case 'p':
break;
}
case 'p':
+ did_arg = 1;
+ if (exec_profile)
+ free(exec_profile);
exec_profile = strdup(optarg);
break;
case FIO_GETOPT_JOB: {
exec_profile = strdup(optarg);
break;
case FIO_GETOPT_JOB: {
@@
-1820,8
+1881,9
@@
int parse_cmd_line(int argc, char *argv[], int client_type)
if (!strncmp(opt, "name", 4) && td) {
ret = add_job(td, td->o.name ?: "fio", 0, 0, client_type);
if (ret)
if (!strncmp(opt, "name", 4) && td) {
ret = add_job(td, td->o.name ?: "fio", 0, 0, client_type);
if (ret)
-
return 0
;
+
goto out_free
;
td = NULL;
td = NULL;
+ did_arg = 1;
}
if (!td) {
int is_section = !strncmp(opt, "name", 4);
}
if (!td) {
int is_section = !strncmp(opt, "name", 4);
@@
-1834,8
+1896,14
@@
int parse_cmd_line(int argc, char *argv[], int client_type)
continue;
td = get_new_job(global, &def_thread, 1);
continue;
td = get_new_job(global, &def_thread, 1);
- if (!td || ioengine_load(td))
- return 0;
+ if (!td || ioengine_load(td)) {
+ if (td) {
+ put_job(td);
+ td = NULL;
+ }
+ do_exit++;
+ break;
+ }
fio_options_set_ioengine_opts(l_opts, td);
}
fio_options_set_ioengine_opts(l_opts, td);
}
@@
-1856,8
+1924,14
@@
int parse_cmd_line(int argc, char *argv[], int client_type)
if (!ret && !strcmp(opt, "ioengine")) {
free_ioengine(td);
if (!ret && !strcmp(opt, "ioengine")) {
free_ioengine(td);
- if (ioengine_load(td))
- return 0;
+ if (ioengine_load(td)) {
+ if (td) {
+ put_job(td);
+ td = NULL;
+ }
+ do_exit++;
+ break;
+ }
fio_options_set_ioengine_opts(l_opts, td);
}
break;
fio_options_set_ioengine_opts(l_opts, td);
}
break;
@@
-1865,6
+1939,10
@@
int parse_cmd_line(int argc, char *argv[], int client_type)
case FIO_GETOPT_IOENGINE: {
const char *opt = l_opts[lidx].name;
char *val = optarg;
case FIO_GETOPT_IOENGINE: {
const char *opt = l_opts[lidx].name;
char *val = optarg;
+
+ if (!td)
+ break;
+
ret = fio_cmd_ioengine_option_parse(td, opt, val);
break;
}
ret = fio_cmd_ioengine_option_parse(td, opt, val);
break;
}
@@
-1880,6
+1958,8
@@
int parse_cmd_line(int argc, char *argv[], int client_type)
}
break;
case 'S':
}
break;
case 'S':
+ did_arg = 1;
+#ifndef CONFIG_NO_SHM
if (nr_clients) {
log_err("fio: can't be both client and server\n");
do_exit++;
if (nr_clients) {
log_err("fio: can't be both client and server\n");
do_exit++;
@@
-1890,19
+1970,28
@@
int parse_cmd_line(int argc, char *argv[], int client_type)
fio_server_set_arg(optarg);
is_backend = 1;
backend = 1;
fio_server_set_arg(optarg);
is_backend = 1;
backend = 1;
+#else
+ log_err("fio: client/server requires SHM support\n");
+ do_exit++;
+ exit_val = 1;
+#endif
break;
case 'D':
break;
case 'D':
+ if (pid_file)
+ free(pid_file);
pid_file = strdup(optarg);
break;
case 'I':
if ((ret = fio_idle_prof_parse_opt(optarg))) {
/* exit on error and calibration only */
pid_file = strdup(optarg);
break;
case 'I':
if ((ret = fio_idle_prof_parse_opt(optarg))) {
/* exit on error and calibration only */
+ did_arg = 1;
do_exit++;
do_exit++;
- if (ret == -1)
+ if (ret == -1)
exit_val = 1;
}
break;
case 'C':
exit_val = 1;
}
break;
case 'C':
+ did_arg = 1;
if (is_backend) {
log_err("fio: can't be both client and server\n");
do_exit++;
if (is_backend) {
log_err("fio: can't be both client and server\n");
do_exit++;
@@
-1929,10
+2018,12
@@
int parse_cmd_line(int argc, char *argv[], int client_type)
}
break;
case 'T':
}
break;
case 'T':
+ did_arg = 1;
do_exit++;
exit_val = fio_monotonic_clocktest();
break;
case 'G':
do_exit++;
exit_val = fio_monotonic_clocktest();
break;
case 'G':
+ did_arg = 1;
do_exit++;
exit_val = fio_crctest(optarg);
break;
do_exit++;
exit_val = fio_crctest(optarg);
break;
@@
-1963,18
+2054,20
@@
int parse_cmd_line(int argc, char *argv[], int client_type)
if (do_exit && !(is_backend || nr_clients))
exit(exit_val);
if (do_exit && !(is_backend || nr_clients))
exit(exit_val);
- if (nr_clients && fio_clients_connect()) {
- do_exit++;
- exit_val = 1;
- return -1;
- }
+ if (nr_clients && fio_clients_connect())
+ exit(1);
if (is_backend && backend)
return fio_start_server(pid_file);
if (is_backend && backend)
return fio_start_server(pid_file);
+ else if (pid_file)
+ free(pid_file);
if (td) {
if (td) {
- if (!ret)
+ if (!ret)
{
ret = add_job(td, td->o.name ?: "fio", 0, 0, client_type);
ret = add_job(td, td->o.name ?: "fio", 0, 0, client_type);
+ if (ret)
+ did_arg = 1;
+ }
}
while (!ret && optind < argc) {
}
while (!ret && optind < argc) {
@@
-1984,6
+2077,10
@@
int parse_cmd_line(int argc, char *argv[], int client_type)
optind++;
}
optind++;
}
+out_free:
+ if (pid_file)
+ free(pid_file);
+
return ini_idx;
}
return ini_idx;
}
@@
-2019,7
+2116,7
@@
int parse_options(int argc, char *argv[])
if (job_files > 0) {
for (i = 0; i < job_files; i++) {
if (job_files > 0) {
for (i = 0; i < job_files; i++) {
- if (fill_def_thread())
+ if (
i &&
fill_def_thread())
return 1;
if (nr_clients) {
if (fio_clients_send_ini(ini_file[i]))
return 1;
if (nr_clients) {
if (fio_clients_send_ini(ini_file[i]))