Merge branch 'read_iolog-from-unix-socket' of https://github.com/aclamk/fio
[fio.git] / backend.c
index 3774df58442e086715e8e8c7c0a63bbf04a4b220..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 char *cgroup_mnt;
+static struct cgroup_mnt *cgroup_mnt;
 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);
-       int ret;
+       enum fio_q_status ret;
 
        if (!io_u)
                return true;
@@ -432,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 (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 {
@@ -456,14 +454,14 @@ int io_queue_event(struct thread_data *td, struct io_u *io_u, int *ret,
                        *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)
-                               trim_io_piece(td, io_u);
+                               trim_io_piece(io_u);
 
                        /*
                         * zero read, fail
@@ -489,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:
-                       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);
@@ -587,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;
-                               dprint(FD_IO, "in-flight overlap: %llu/%lu, %llu/%lu\n",
+                               dprint(FD_IO, "in-flight overlap: %llu/%llu, %llu/%llu\n",
                                                x1, io_u->buflen,
                                                y1, check_io_u->buflen);
                                break;
@@ -598,7 +594,7 @@ static bool in_flight_overlap(struct io_u_queue *q, struct io_u *io_u)
        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
@@ -892,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);
+               /* adjust for rate_process=poisson */
+               td->last_usec[ddir] += total;
        }
 }
 
@@ -1035,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) {
-                       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;
@@ -1044,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;
 
-                       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))
-                               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);
@@ -1201,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;
-       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;
@@ -1236,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) {
-               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);
@@ -1531,7 +1529,7 @@ static void *thread_main(void *data)
        } 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);
 
@@ -1670,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.
         */
-       if (init_iolog(td))
+       if (!init_iolog(td))
                goto err;
 
        if (init_io_u(td))
@@ -1888,7 +1886,7 @@ err:
        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) {
@@ -2510,7 +2508,6 @@ int fio_backend(struct sk_out *sk_out)
                cgroup_kill(cgroup_list);
                sfree(cgroup_list);
        }
-       sfree(cgroup_mnt);
 
        fio_sem_remove(startup_sem);
        stat_exit();