projects
/
fio.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix for crash with more than ~500 jobs
[fio.git]
/
backend.c
diff --git
a/backend.c
b/backend.c
index a9885c6042f75e93a40bb073f2c215999c0d5eb6..f4bc553b0a5ee9dab880685f1844221975d4c64f 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;
@@
-558,7
+568,8
@@
static void do_io(struct thread_data *td)
td_set_runstate(td, TD_RUNNING);
while ((td->o.read_iolog_file && !flist_empty(&td->io_log_list)) ||
td_set_runstate(td, TD_RUNNING);
while ((td->o.read_iolog_file && !flist_empty(&td->io_log_list)) ||
- (!flist_empty(&td->trim_list)) || !io_bytes_exceeded(td)) {
+ (!flist_empty(&td->trim_list)) || !io_bytes_exceeded(td) ||
+ td->o.time_based) {
struct timeval comp_time;
unsigned long bytes_done[2] = { 0, 0 };
int min_evts = 0;
struct timeval comp_time;
unsigned long bytes_done[2] = { 0, 0 };
int min_evts = 0;
@@
-1293,6
+1304,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;
}
@@
-1304,6
+1316,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;
}
@@
-1660,6
+1673,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);