projects
/
fio.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge branch 'master' into gfio
[fio.git]
/
backend.c
diff --git
a/backend.c
b/backend.c
index 319bd253342e164405d04cc5d1506a1e6f29337e..3a471521d6931508335f9ede44b3ab5aae1598f1 100644
(file)
--- a/
backend.c
+++ b/
backend.c
@@
-87,6
+87,11
@@
static void sig_int(int sig)
}
}
}
}
+static void sig_show_status(int sig)
+{
+ show_running_run_stats();
+}
+
static void set_sig_handlers(void)
{
struct sigaction act;
static void set_sig_handlers(void)
{
struct sigaction act;
@@
-101,6
+106,11
@@
static void set_sig_handlers(void)
act.sa_flags = SA_RESTART;
sigaction(SIGTERM, &act, NULL);
act.sa_flags = SA_RESTART;
sigaction(SIGTERM, &act, NULL);
+ memset(&act, 0, sizeof(act));
+ act.sa_handler = sig_show_status;
+ act.sa_flags = SA_RESTART;
+ sigaction(SIGUSR1, &act, NULL);
+
if (is_backend) {
memset(&act, 0, sizeof(act));
act.sa_handler = sig_int;
if (is_backend) {
memset(&act, 0, sizeof(act));
act.sa_handler = sig_int;
@@
-958,10
+968,12
@@
static void *thread_main(void *data)
{
unsigned long long elapsed;
struct thread_data *td = data;
{
unsigned long long elapsed;
struct thread_data *td = data;
+ struct thread_options *o = &td->o;
pthread_condattr_t attr;
int clear_state;
pthread_condattr_t attr;
int clear_state;
+ int ret;
- if (!
td->o.
use_thread) {
+ if (!
o->
use_thread) {
setsid();
td->pid = getpid();
} else
setsid();
td->pid = getpid();
} else
@@
-1004,11
+1016,11
@@
static void *thread_main(void *data)
* A new gid requires privilege, so we need to do this before setting
* the uid.
*/
* A new gid requires privilege, so we need to do this before setting
* the uid.
*/
- if (
td->o.gid != -1U && setgid(td->o.
gid)) {
+ if (
o->gid != -1U && setgid(o->
gid)) {
td_verror(td, errno, "setgid");
goto err;
}
td_verror(td, errno, "setgid");
goto err;
}
- if (
td->o.uid != -1U && setuid(td->o.
uid)) {
+ if (
o->uid != -1U && setuid(o->
uid)) {
td_verror(td, errno, "setuid");
goto err;
}
td_verror(td, errno, "setuid");
goto err;
}
@@
-1017,18
+1029,24
@@
static void *thread_main(void *data)
* If we have a gettimeofday() thread, make sure we exclude that
* thread from this job
*/
* If we have a gettimeofday() thread, make sure we exclude that
* thread from this job
*/
- if (
td->o.
gtod_cpu)
- fio_cpu_clear(&
td->o.cpumask, td->o.
gtod_cpu);
+ if (
o->
gtod_cpu)
+ fio_cpu_clear(&
o->cpumask, o->
gtod_cpu);
/*
* Set affinity first, in case it has an impact on the memory
* allocations.
*/
/*
* Set affinity first, in case it has an impact on the memory
* allocations.
*/
- if (td->o.cpumask_set && fio_setaffinity(td->pid, td->o.cpumask) == -1) {
- td_verror(td, errno, "cpu_set_affinity");
- goto err;
+ if (o->cpumask_set) {
+ ret = fio_setaffinity(td->pid, o->cpumask);
+ if (ret == -1) {
+ td_verror(td, errno, "cpu_set_affinity");
+ goto err;
+ }
}
}
+ if (fio_pin_memory(td))
+ goto err;
+
/*
* May alter parameters that init_io_u() will use, so we need to
* do this first.
/*
* May alter parameters that init_io_u() will use, so we need to
* do this first.
@@
-1039,29
+1057,30
@@
static void *thread_main(void *data)
if (init_io_u(td))
goto err;
if (init_io_u(td))
goto err;
- if (
td->o.
verify_async && verify_async_init(td))
+ if (
o->
verify_async && verify_async_init(td))
goto err;
goto err;
- if (td->ioprio_set) {
- if (ioprio_set(IOPRIO_WHO_PROCESS, 0, td->ioprio) == -1) {
+ if (o->ioprio) {
+ ret = ioprio_set(IOPRIO_WHO_PROCESS, 0, o->ioprio_class, o->ioprio);
+ if (ret == -1) {
td_verror(td, errno, "ioprio_set");
goto err;
}
}
td_verror(td, errno, "ioprio_set");
goto err;
}
}
- if (
td->o.
cgroup_weight && cgroup_setup(td, cgroup_list, &cgroup_mnt))
+ if (
o->
cgroup_weight && cgroup_setup(td, cgroup_list, &cgroup_mnt))
goto err;
errno = 0;
goto err;
errno = 0;
- if (nice(
td->o.
nice) == -1 && errno != 0) {
+ if (nice(
o->
nice) == -1 && errno != 0) {
td_verror(td, errno, "nice");
goto err;
}
td_verror(td, errno, "nice");
goto err;
}
- if (
td->o.
ioscheduler && switch_ioscheduler(td))
+ if (
o->
ioscheduler && switch_ioscheduler(td))
goto err;
goto err;
- if (!
td->o.
create_serialize && setup_files(td))
+ if (!
o->
create_serialize && setup_files(td))
goto err;
if (td_io_init(td))
goto err;
if (td_io_init(td))
@@
-1070,16
+1089,16
@@
static void *thread_main(void *data)
if (init_random_map(td))
goto err;
if (init_random_map(td))
goto err;
- if (td->o.exec_prerun) {
- if (exec_string(td->o.exec_prerun))
- goto err;
- }
+ if (o->exec_prerun && exec_string(o->exec_prerun))
+ goto err;
- if (
td->o.
pre_read) {
+ if (
o->
pre_read) {
if (pre_read_files(td) < 0)
goto err;
}
if (pre_read_files(td) < 0)
goto err;
}
+ fio_verify_init(td);
+
fio_gettime(&td->epoch, NULL);
getrusage(RUSAGE_SELF, &td->ru_start);
fio_gettime(&td->epoch, NULL);
getrusage(RUSAGE_SELF, &td->ru_start);
@@
-1142,6
+1161,8
@@
static void *thread_main(void *data)
td->ts.io_bytes[0] = td->io_bytes[0];
td->ts.io_bytes[1] = td->io_bytes[1];
td->ts.io_bytes[0] = td->io_bytes[0];
td->ts.io_bytes[1] = td->io_bytes[1];
+ fio_unpin_memory(td);
+
fio_mutex_down(writeout_mutex);
if (td->bw_log) {
if (td->o.bw_log_file) {
fio_mutex_down(writeout_mutex);
if (td->bw_log) {
if (td->o.bw_log_file) {
@@
-1199,8
+1220,8
@@
err:
cleanup_io_u(td);
cgroup_shutdown(td, &cgroup_mnt);
cleanup_io_u(td);
cgroup_shutdown(td, &cgroup_mnt);
- if (
td->o.
cpumask_set) {
- int ret = fio_cpuset_exit(&
td->o.
cpumask);
+ if (
o->
cpumask_set) {
+ int ret = fio_cpuset_exit(&
o->
cpumask);
td_verror(td, ret, "fio_cpuset_exit");
}
td_verror(td, ret, "fio_cpuset_exit");
}
@@
-1298,6
+1319,7
@@
static void reap_threads(unsigned int *nr_running, unsigned int *t_rate,
if (errno == ECHILD) {
log_err("fio: pid=%d disappeared %d\n",
(int) td->pid, td->runstate);
if (errno == ECHILD) {
log_err("fio: pid=%d disappeared %d\n",
(int) td->pid, td->runstate);
+ td->sig = ECHILD;
td_set_runstate(td, TD_REAPED);
goto reaped;
}
td_set_runstate(td, TD_REAPED);
goto reaped;
}
@@
-1309,6
+1331,7
@@
static void reap_threads(unsigned int *nr_running, unsigned int *t_rate,
if (sig != SIGTERM)
log_err("fio: pid=%d, got signal=%d\n",
(int) td->pid, sig);
if (sig != SIGTERM)
log_err("fio: pid=%d, got signal=%d\n",
(int) td->pid, sig);
+ td->sig = sig;
td_set_runstate(td, TD_REAPED);
goto reaped;
}
td_set_runstate(td, TD_REAPED);
goto reaped;
}
@@
-1352,9
+1375,6
@@
static void run_threads(void)
unsigned long spent;
unsigned int i, todo, nr_running, m_rate, t_rate, nr_started;
unsigned long spent;
unsigned int i, todo, nr_running, m_rate, t_rate, nr_started;
- if (fio_pin_memory())
- return;
-
if (fio_gtod_offload && fio_start_gtod_thread())
return;
if (fio_gtod_offload && fio_start_gtod_thread())
return;
@@
-1577,7
+1597,6
@@
static void run_threads(void)
}
update_io_ticks();
}
update_io_ticks();
- fio_unpin_memory();
}
static void *disk_thread_main(void *data)
}
static void *disk_thread_main(void *data)
@@
-1665,6
+1684,7
@@
int fio_backend(void)
for_each_td(td, i)
fio_options_free(td);
for_each_td(td, i)
fio_options_free(td);
+ free_disk_util();
cgroup_kill(cgroup_list);
sfree(cgroup_list);
sfree(cgroup_mnt);
cgroup_kill(cgroup_list);
sfree(cgroup_list);
sfree(cgroup_mnt);