eta: Fix ramp time ETA
[fio.git] / iolog.c
diff --git a/iolog.c b/iolog.c
index d4213dbec5bb282d0fba9c8cfb317a660273d722..f0ce3b25002d0d01e5a671068f32199af9502017 100644 (file)
--- a/iolog.c
+++ b/iolog.c
@@ -346,7 +346,7 @@ static int read_iolog2(struct thread_data *td, FILE *f)
        unsigned long long offset;
        unsigned int bytes;
        int reads, writes, waits, fileno = 0, file_action = 0; /* stupid gcc */
-       char *fname, *act;
+       char *rfname, *fname, *act;
        char *str, *p;
        enum fio_ddir rw;
 
@@ -357,7 +357,7 @@ static int read_iolog2(struct thread_data *td, FILE *f)
         * for doing verifications.
         */
        str = malloc(4096);
-       fname = malloc(256+16);
+       rfname = fname = malloc(256+16);
        act = malloc(256+16);
 
        reads = writes = waits = 0;
@@ -365,8 +365,12 @@ static int read_iolog2(struct thread_data *td, FILE *f)
                struct io_piece *ipo;
                int r;
 
-               r = sscanf(p, "%256s %256s %llu %u", fname, act, &offset,
+               r = sscanf(p, "%256s %256s %llu %u", rfname, act, &offset,
                                                                        &bytes);
+
+               if (td->o.replay_redirect)
+                       fname = td->o.replay_redirect;
+
                if (r == 4) {
                        /*
                         * Check action first
@@ -421,6 +425,8 @@ static int read_iolog2(struct thread_data *td, FILE *f)
                                continue;
                        writes++;
                } else if (rw == DDIR_WAIT) {
+                       if (td->o.no_stall)
+                               continue;
                        waits++;
                } else if (rw == DDIR_INVAL) {
                } else if (!ddir_sync(rw)) {
@@ -451,7 +457,7 @@ static int read_iolog2(struct thread_data *td, FILE *f)
 
        free(str);
        free(act);
-       free(fname);
+       free(rfname);
 
        if (writes && read_only) {
                log_err("fio: <%s> skips replay of %d writes due to"
@@ -674,14 +680,19 @@ void free_log(struct io_log *log)
        sfree(log);
 }
 
-static inline unsigned long hist_sum(int j, int stride, unsigned int *io_u_plat,
+inline unsigned long hist_sum(int j, int stride, unsigned int *io_u_plat,
                unsigned int *io_u_plat_last)
 {
        unsigned long sum;
        int k;
 
-       for (k = sum = 0; k < stride; k++)
-               sum += io_u_plat[j + k] - io_u_plat_last[j + k];
+       if (io_u_plat_last) {
+               for (k = sum = 0; k < stride; k++)
+                       sum += io_u_plat[j + k] - io_u_plat_last[j + k];
+       } else {
+               for (k = sum = 0; k < stride; k++)
+                       sum += io_u_plat[j + k];
+       }
 
        return sum;
 }
@@ -709,7 +720,7 @@ static void flush_hist_samples(FILE *f, int hist_coarseness, void *samples,
        for (i = 0; i < nr_samples; i++) {
                s = __get_sample(samples, log_offset, i);
 
-               entry = (struct io_u_plat_entry *) s->val;
+               entry = (struct io_u_plat_entry *) (uintptr_t) s->val;
                io_u_plat = entry->io_u_plat;
 
                entry_before = flist_first_entry(&entry->list, struct io_u_plat_entry, list);
@@ -1060,11 +1071,11 @@ void flush_log(struct io_log *log, bool do_append)
                cur_log = flist_first_entry(&log->io_logs, struct io_logs, list);
                flist_del_init(&cur_log->list);
                
-               if (log == log->td->clat_hist_log)
+               if (log->td && log == log->td->clat_hist_log)
                        flush_hist_samples(f, log->hist_coarseness, cur_log->log,
-                                          cur_log->nr_samples * log_entry_sz(log));
+                                          log_sample_sz(log, cur_log));
                else
-                       flush_samples(f, cur_log->log, cur_log->nr_samples * log_entry_sz(log));
+                       flush_samples(f, cur_log->log, log_sample_sz(log, cur_log));
                
                sfree(cur_log);
        }
@@ -1148,7 +1159,8 @@ static int gz_work(struct iolog_flush_data *data)
                                data->log->filename);
        do {
                if (c)
-                       dprint(FD_COMPRESS, "seq=%d, chunk=%lu\n", seq, c->len);
+                       dprint(FD_COMPRESS, "seq=%d, chunk=%lu\n", seq,
+                               (unsigned long) c->len);
                c = get_new_chunk(seq);
                stream.avail_out = GZ_CHUNK;
                stream.next_out = c->buf;
@@ -1185,7 +1197,7 @@ static int gz_work(struct iolog_flush_data *data)
        total -= c->len;
        c->len = GZ_CHUNK - stream.avail_out;
        total += c->len;
-       dprint(FD_COMPRESS, "seq=%d, chunk=%lu\n", seq, c->len);
+       dprint(FD_COMPRESS, "seq=%d, chunk=%lu\n", seq, (unsigned long) c->len);
 
        if (ret != Z_STREAM_END) {
                do {
@@ -1196,7 +1208,8 @@ static int gz_work(struct iolog_flush_data *data)
                        c->len = GZ_CHUNK - stream.avail_out;
                        total += c->len;
                        flist_add_tail(&c->list, &list);
-                       dprint(FD_COMPRESS, "seq=%d, chunk=%lu\n", seq, c->len);
+                       dprint(FD_COMPRESS, "seq=%d, chunk=%lu\n", seq,
+                               (unsigned long) c->len);
                } while (ret != Z_STREAM_END);
        }