iowatcher: Use queue events if issue not available
authorJan Kara <jack@suse.cz>
Thu, 5 May 2016 15:17:07 +0000 (17:17 +0200)
committerJens Axboe <axboe@fb.com>
Thu, 5 May 2016 15:20:18 +0000 (09:20 -0600)
Currently queue depth and latency graphs are generated from ISSUE and
COMPLETE events. For traces which miss the ISSUE events (e.g. from
device mapper) use QUEUE events instead. The result won't be as great
but it still conveys some useful information.

Signed-off-by: Jan Kara <jack@suse.cz>
Signed-off-by: Jens Axboe <axboe@fb.com>
iowatcher/blkparse.c

index ef33d5be79a10e5780f01983724e20cc3900130b..78a16e5944c3d7439aec62f4c4573ff0b9c6e323 100644 (file)
@@ -1097,8 +1097,17 @@ void add_pending_io(struct trace *trace, struct graph_line_data *gld)
                return;
 
        if (action == __BLK_TA_QUEUE) {
-               if (trace->found_issue || trace->found_completion)
-                       hash_queued_io(trace->io);
+               if (trace->found_issue || trace->found_completion) {
+                       pio = hash_queued_io(trace->io);
+                       /*
+                        * When there are no ISSUE events count depth and
+                        * latency at least from queue events
+                        */
+                       if (pio && !trace->found_issue) {
+                               pio->dispatch_time = io->time;
+                               goto account_io;
+                       }
+               }
                return;
        }
        if (action == __BLK_TA_REQUEUE) {
@@ -1118,6 +1127,7 @@ void add_pending_io(struct trace *trace, struct graph_line_data *gld)
                free(pio);
        }
 
+account_io:
        ios_in_flight++;
 
        seconds = SECONDS(io->time);