fio: Introduce the log_prio option
[fio.git] / iolog.c
diff --git a/iolog.c b/iolog.c
index cf264916a9ecd83f7b3079bd186573441dba65fb..1aeb7a76b2b6ca21ab8bd3d5c18e5ec200669fcb 100644 (file)
--- a/iolog.c
+++ b/iolog.c
@@ -151,7 +151,8 @@ int read_iolog_get(struct thread_data *td, struct io_u *io_u)
 
        while (!flist_empty(&td->io_log_list)) {
                int ret;
-               if (td->o.read_iolog_chunked) {
+
+               if (!td->io_log_blktrace && td->o.read_iolog_chunked) {
                        if (td->io_log_checkmark == td->io_log_current) {
                                if (!read_iolog2(td))
                                        return 1;
@@ -706,10 +707,13 @@ bool init_iolog(struct thread_data *td)
                 * Check if it's a blktrace file and load that if possible.
                 * Otherwise assume it's a normal log file and load that.
                 */
-               if (is_blktrace(fname, &need_swap))
+               if (is_blktrace(fname, &need_swap)) {
+                       td->io_log_blktrace = 1;
                        ret = load_blktrace(td, fname, need_swap);
-               else
+               } else {
+                       td->io_log_blktrace = 0;
                        ret = init_iolog_read(td, fname);
+               }
        } else if (td->o.write_iolog_file)
                ret = init_iolog_write(td);
        else
@@ -733,6 +737,7 @@ void setup_log(struct io_log **log, struct log_params *p,
        INIT_FLIST_HEAD(&l->io_logs);
        l->log_type = p->log_type;
        l->log_offset = p->log_offset;
+       l->log_prio = p->log_prio;
        l->log_gz = p->log_gz;
        l->log_gz_store = p->log_gz_store;
        l->avg_msec = p->avg_msec;
@@ -765,6 +770,8 @@ void setup_log(struct io_log **log, struct log_params *p,
 
        if (l->log_offset)
                l->log_ddir_mask = LOG_OFFSET_SAMPLE_BIT;
+       if (l->log_prio)
+               l->log_ddir_mask |= LOG_PRIO_SAMPLE_BIT;
 
        INIT_FLIST_HEAD(&l->chunk_list);
 
@@ -891,33 +898,55 @@ static void flush_hist_samples(FILE *f, int hist_coarseness, void *samples,
 void flush_samples(FILE *f, void *samples, uint64_t sample_size)
 {
        struct io_sample *s;
-       int log_offset;
+       int log_offset, log_prio;
        uint64_t i, nr_samples;
+       unsigned int prio_val;
+       const char *fmt;
 
        if (!sample_size)
                return;
 
        s = __get_sample(samples, 0, 0);
        log_offset = (s->__ddir & LOG_OFFSET_SAMPLE_BIT) != 0;
+       log_prio = (s->__ddir & LOG_PRIO_SAMPLE_BIT) != 0;
+
+       if (log_offset) {
+               if (log_prio)
+                       fmt = "%lu, %" PRId64 ", %u, %llu, %llu, 0x%04x\n";
+               else
+                       fmt = "%lu, %" PRId64 ", %u, %llu, %llu, %u\n";
+       } else {
+               if (log_prio)
+                       fmt = "%lu, %" PRId64 ", %u, %llu, 0x%04x\n";
+               else
+                       fmt = "%lu, %" PRId64 ", %u, %llu, %u\n";
+       }
 
        nr_samples = sample_size / __log_entry_sz(log_offset);
 
        for (i = 0; i < nr_samples; i++) {
                s = __get_sample(samples, log_offset, i);
 
+               if (log_prio)
+                       prio_val = s->priority;
+               else
+                       prio_val = ioprio_value_is_class_rt(s->priority);
+
                if (!log_offset) {
-                       fprintf(f, "%lu, %" PRId64 ", %u, %llu, %u\n",
-                                       (unsigned long) s->time,
-                                       s->data.val,
-                                       io_sample_ddir(s), (unsigned long long) s->bs, s->priority_bit);
+                       fprintf(f, fmt,
+                               (unsigned long) s->time,
+                               s->data.val,
+                               io_sample_ddir(s), (unsigned long long) s->bs,
+                               prio_val);
                } else {
                        struct io_sample_offset *so = (void *) s;
 
-                       fprintf(f, "%lu, %" PRId64 ", %u, %llu, %llu, %u\n",
-                                       (unsigned long) s->time,
-                                       s->data.val,
-                                       io_sample_ddir(s), (unsigned long long) s->bs,
-                                       (unsigned long long) so->offset, s->priority_bit);
+                       fprintf(f, fmt,
+                               (unsigned long) s->time,
+                               s->data.val,
+                               io_sample_ddir(s), (unsigned long long) s->bs,
+                               (unsigned long long) so->offset,
+                               prio_val);
                }
        }
 }