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 >= 4G block sizes
[fio.git]
/
backend.c
diff --git
a/backend.c
b/backend.c
index a2a0b3da61458f4e6171c868f2fb07b4b77faa38..3c45e7898728669c4abe211d5be4004532dbe802 100644
(file)
--- a/
backend.c
+++ b/
backend.c
@@
-50,7
+50,7
@@
static struct fio_sem *startup_sem;
static struct flist_head *cgroup_list;
static struct fio_sem *startup_sem;
static struct flist_head *cgroup_list;
-static
char
*cgroup_mnt;
+static
struct cgroup_mnt
*cgroup_mnt;
static int exit_value;
static volatile int fio_abort;
static unsigned int nr_process = 0;
static int exit_value;
static volatile int fio_abort;
static unsigned int nr_process = 0;
@@
-268,7
+268,7
@@
static void cleanup_pending_aio(struct thread_data *td)
static bool fio_io_sync(struct thread_data *td, struct fio_file *f)
{
struct io_u *io_u = __get_io_u(td);
static bool fio_io_sync(struct thread_data *td, struct fio_file *f)
{
struct io_u *io_u = __get_io_u(td);
-
int
ret;
+
enum fio_q_status
ret;
if (!io_u)
return true;
if (!io_u)
return true;
@@
-283,16
+283,13
@@
static bool fio_io_sync(struct thread_data *td, struct fio_file *f)
requeue:
ret = td_io_queue(td, io_u);
requeue:
ret = td_io_queue(td, io_u);
- if (ret < 0) {
- td_verror(td, io_u->error, "td_io_queue");
- put_io_u(td, io_u);
- return true;
- } else if (ret == FIO_Q_QUEUED) {
- if (td_io_commit(td))
- return true;
+ switch (ret) {
+ case FIO_Q_QUEUED:
+ td_io_commit(td);
if (io_u_queued_complete(td, 1) < 0)
return true;
if (io_u_queued_complete(td, 1) < 0)
return true;
- } else if (ret == FIO_Q_COMPLETED) {
+ break;
+ case FIO_Q_COMPLETED:
if (io_u->error) {
td_verror(td, io_u->error, "td_io_queue");
return true;
if (io_u->error) {
td_verror(td, io_u->error, "td_io_queue");
return true;
@@
-300,9
+297,9
@@
requeue:
if (io_u_sync_complete(td, io_u) < 0)
return true;
if (io_u_sync_complete(td, io_u) < 0)
return true;
- } else if (ret == FIO_Q_BUSY) {
- if (td_io_commit(td))
-
return true
;
+ break;
+ case FIO_Q_BUSY:
+
td_io_commit(td)
;
goto requeue;
}
goto requeue;
}
@@
-435,9
+432,7
@@
static int wait_for_completions(struct thread_data *td, struct timespec *time)
if ((full && !min_evts) || !td->o.iodepth_batch_complete_min)
min_evts = 1;
if ((full && !min_evts) || !td->o.iodepth_batch_complete_min)
min_evts = 1;
- if (time && (__should_check_rate(td, DDIR_READ) ||
- __should_check_rate(td, DDIR_WRITE) ||
- __should_check_rate(td, DDIR_TRIM)))
+ if (time && __should_check_rate(td))
fio_gettime(time, NULL);
do {
fio_gettime(time, NULL);
do {
@@
-453,22
+448,20
@@
int io_queue_event(struct thread_data *td, struct io_u *io_u, int *ret,
enum fio_ddir ddir, uint64_t *bytes_issued, int from_verify,
struct timespec *comp_time)
{
enum fio_ddir ddir, uint64_t *bytes_issued, int from_verify,
struct timespec *comp_time)
{
- int ret2;
-
switch (*ret) {
case FIO_Q_COMPLETED:
if (io_u->error) {
*ret = -io_u->error;
clear_io_u(td, io_u);
} else if (io_u->resid) {
switch (*ret) {
case FIO_Q_COMPLETED:
if (io_u->error) {
*ret = -io_u->error;
clear_io_u(td, io_u);
} else if (io_u->resid) {
-
int
bytes = io_u->xfer_buflen - io_u->resid;
+
long long
bytes = io_u->xfer_buflen - io_u->resid;
struct fio_file *f = io_u->file;
if (bytes_issued)
*bytes_issued += bytes;
if (!from_verify)
struct fio_file *f = io_u->file;
if (bytes_issued)
*bytes_issued += bytes;
if (!from_verify)
- trim_io_piece(
td,
io_u);
+ trim_io_piece(io_u);
/*
* zero read, fail
/*
* zero read, fail
@@
-494,9
+487,7
@@
int io_queue_event(struct thread_data *td, struct io_u *io_u, int *ret,
requeue_io_u(td, &io_u);
} else {
sync_done:
requeue_io_u(td, &io_u);
} else {
sync_done:
- if (comp_time && (__should_check_rate(td, DDIR_READ) ||
- __should_check_rate(td, DDIR_WRITE) ||
- __should_check_rate(td, DDIR_TRIM)))
+ if (comp_time && __should_check_rate(td))
fio_gettime(comp_time, NULL);
*ret = io_u_sync_complete(td, io_u);
fio_gettime(comp_time, NULL);
*ret = io_u_sync_complete(td, io_u);
@@
-530,9
+521,7
@@
sync_done:
if (!from_verify)
unlog_io_piece(td, io_u);
requeue_io_u(td, &io_u);
if (!from_verify)
unlog_io_piece(td, io_u);
requeue_io_u(td, &io_u);
- ret2 = td_io_commit(td);
- if (ret2 < 0)
- *ret = ret2;
+ td_io_commit(td);
break;
default:
assert(*ret < 0);
break;
default:
assert(*ret < 0);
@@
-594,7
+583,7
@@
static bool in_flight_overlap(struct io_u_queue *q, struct io_u *io_u)
if (x1 < y2 && y1 < x2) {
overlap = true;
if (x1 < y2 && y1 < x2) {
overlap = true;
- dprint(FD_IO, "in-flight overlap: %llu/%l
u, %llu/%
lu\n",
+ dprint(FD_IO, "in-flight overlap: %llu/%l
lu, %llu/%l
lu\n",
x1, io_u->buflen,
y1, check_io_u->buflen);
break;
x1, io_u->buflen,
y1, check_io_u->buflen);
break;
@@
-605,7
+594,7
@@
static bool in_flight_overlap(struct io_u_queue *q, struct io_u *io_u)
return overlap;
}
return overlap;
}
-static
int
io_u_submit(struct thread_data *td, struct io_u *io_u)
+static
enum fio_q_status
io_u_submit(struct thread_data *td, struct io_u *io_u)
{
/*
* Check for overlap if the user asked us to, and we have
{
/*
* Check for overlap if the user asked us to, and we have
@@
-899,6
+888,8
@@
static void handle_thinktime(struct thread_data *td, enum fio_ddir ddir)
over = (usperop - total) / usperop * -bs;
td->rate_io_issue_bytes[ddir] += (missed - over);
over = (usperop - total) / usperop * -bs;
td->rate_io_issue_bytes[ddir] += (missed - over);
+ /* adjust for rate_process=poisson */
+ td->last_usec[ddir] += total;
}
}
}
}
@@
-1042,8
+1033,8
@@
static void do_io(struct thread_data *td, uint64_t *bytes_done)
log_io_piece(td, io_u);
if (td->o.io_submit_mode == IO_MODE_OFFLOAD) {
log_io_piece(td, io_u);
if (td->o.io_submit_mode == IO_MODE_OFFLOAD) {
- const unsigned long blen = io_u->xfer_buflen;
- const enum fio_ddir ddir = acct_ddir(io_u);
+ const unsigned long
long
blen = io_u->xfer_buflen;
+ const enum fio_ddir
__
ddir = acct_ddir(io_u);
if (td->error)
break;
if (td->error)
break;
@@
-1051,14
+1042,14
@@
static void do_io(struct thread_data *td, uint64_t *bytes_done)
workqueue_enqueue(&td->io_wq, &io_u->work);
ret = FIO_Q_QUEUED;
workqueue_enqueue(&td->io_wq, &io_u->work);
ret = FIO_Q_QUEUED;
- if (ddir_rw(ddir)) {
- td->io_issues[ddir]++;
- td->io_issue_bytes[ddir] += blen;
- td->rate_io_issue_bytes[ddir] += blen;
+ if (ddir_rw(
__
ddir)) {
+ td->io_issues[
__
ddir]++;
+ td->io_issue_bytes[
__
ddir] += blen;
+ td->rate_io_issue_bytes[
__
ddir] += blen;
}
if (should_check_rate(td))
}
if (should_check_rate(td))
- td->rate_next_io_time[
ddir] = usec_for_io(td,
ddir);
+ td->rate_next_io_time[
__ddir] = usec_for_io(td, __
ddir);
} else {
ret = io_u_submit(td, io_u);
} else {
ret = io_u_submit(td, io_u);
@@
-1208,7
+1199,7
@@
static void cleanup_io_u(struct thread_data *td)
static int init_io_u(struct thread_data *td)
{
struct io_u *io_u;
static int init_io_u(struct thread_data *td)
{
struct io_u *io_u;
- unsigned
int
max_bs, min_write;
+ unsigned
long long
max_bs, min_write;
int cl_align, i, max_units;
int data_xfer = 1, err;
char *p;
int cl_align, i, max_units;
int data_xfer = 1, err;
char *p;
@@
-1243,7
+1234,7
@@
static int init_io_u(struct thread_data *td)
td->orig_buffer_size += page_mask + td->o.mem_align;
if (td->o.mem_type == MEM_SHMHUGE || td->o.mem_type == MEM_MMAPHUGE) {
td->orig_buffer_size += page_mask + td->o.mem_align;
if (td->o.mem_type == MEM_SHMHUGE || td->o.mem_type == MEM_MMAPHUGE) {
- unsigned long bs;
+ unsigned long
long
bs;
bs = td->orig_buffer_size + td->o.hugepage_size - 1;
td->orig_buffer_size = bs & ~(td->o.hugepage_size - 1);
bs = td->orig_buffer_size + td->o.hugepage_size - 1;
td->orig_buffer_size = bs & ~(td->o.hugepage_size - 1);
@@
-1538,7
+1529,7
@@
static void *thread_main(void *data)
} else
td->pid = gettid();
} else
td->pid = gettid();
- fio_local_clock_init(
o->use_thread
);
+ fio_local_clock_init();
dprint(FD_PROCESS, "jobs pid=%d started\n", (int) td->pid);
dprint(FD_PROCESS, "jobs pid=%d started\n", (int) td->pid);
@@
-1677,7
+1668,7
@@
static void *thread_main(void *data)
* 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.
*/
- if (init_iolog(td))
+ if (
!
init_iolog(td))
goto err;
if (init_io_u(td))
goto err;
if (init_io_u(td))
@@
-1895,7
+1886,7
@@
err:
close_and_free_files(td);
cleanup_io_u(td);
close_ioengine(td);
close_and_free_files(td);
cleanup_io_u(td);
close_ioengine(td);
- cgroup_shutdown(td,
&
cgroup_mnt);
+ cgroup_shutdown(td, cgroup_mnt);
verify_free_state(td);
if (td->zone_state_index) {
verify_free_state(td);
if (td->zone_state_index) {
@@
-2517,7
+2508,6
@@
int fio_backend(struct sk_out *sk_out)
cgroup_kill(cgroup_list);
sfree(cgroup_list);
}
cgroup_kill(cgroup_list);
sfree(cgroup_list);
}
- sfree(cgroup_mnt);
fio_sem_remove(startup_sem);
stat_exit();
fio_sem_remove(startup_sem);
stat_exit();