diff options
Diffstat (limited to 'sys-block/blktrace/files/blktrace-1.2.0-overlapping-io-stats.patch')
-rw-r--r-- | sys-block/blktrace/files/blktrace-1.2.0-overlapping-io-stats.patch | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/sys-block/blktrace/files/blktrace-1.2.0-overlapping-io-stats.patch b/sys-block/blktrace/files/blktrace-1.2.0-overlapping-io-stats.patch new file mode 100644 index 000000000000..11c495efbc0c --- /dev/null +++ b/sys-block/blktrace/files/blktrace-1.2.0-overlapping-io-stats.patch @@ -0,0 +1,68 @@ +http://git.kernel.dk/?p=blktrace.git;a=commit;h=8fc451c6b0b9a7db7c376ea6865c35321e561f00 + +From 8fc451c6b0b9a7db7c376ea6865c35321e561f00 Mon Sep 17 00:00:00 2001 +From: Gwendal Grignou <gwendal@chromium.org> +Date: Fri, 18 Aug 2017 15:00:22 -0700 +Subject: [PATCH] btt: Fix overlapping IO stats. + +Keep scanning the tree for overlapping IO otherwise Q2G and process +traces will be incorrect. + +Let assume we have 2 IOs: + +A A+a +|---------------------------------------| + B B+b + |-----------------| + +In the red/black tree we have: + + o -> [A,A+a] + / \ + left right + / \ + [...]o o -> [B, B+b] + +In the current code, if we would not be able to find [B+b] in the tree: +B is greater than A, so we won't go left +B+b is smaller than A+a, so we are not going right either. + +When we have a [X, X+x] IO to look for: +We need to check for right when either: + X+x >= A+a (for merged IO) +and + X > A (for overlapping IO) + +TEST=Check with a trace with overlapping IO: Q2C and Q2G are expected. + +Signed-off-by: Gwendal Grignou <gwendal@chromium.org> +Signed-off-by: Jens Axboe <axboe@kernel.dk> +--- + btt/dip_rb.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/btt/dip_rb.c b/btt/dip_rb.c +index 2aa7ffcc763b..6efef6c03b8f 100644 +--- a/btt/dip_rb.c ++++ b/btt/dip_rb.c +@@ -57,7 +57,7 @@ struct io *rb_find_sec(struct rb_root *root, __u64 sec) + __iop = rb_entry(n, struct io, rb_node); + if (sec < BIT_START(__iop)) + n = n->rb_left; +- else if (sec >= BIT_END(__iop)) ++ else if (sec > BIT_START(__iop)) + n = n->rb_right; + else + return __iop; +@@ -82,7 +82,7 @@ void rb_foreach(struct rb_node *n, struct io *iop, + } + if (iop_s < this_s) + rb_foreach(n->rb_left, iop, fnc, head); +- if (this_e < iop_e) ++ if ((this_e < iop_e) || (this_s < iop_s)) + rb_foreach(n->rb_right, iop, fnc, head); + } + } +-- +2.15.1 + |