diff options
author | Gwendal Grignou <gwendal@chromium.org> | 2017-08-18 15:00:22 -0700 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2017-11-07 11:25:38 -0700 |
commit | 8fc451c6b0b9a7db7c376ea6865c35321e561f00 (patch) | |
tree | ecbc1551e497e0b60e3ddf88b106e2fc9df4815c | |
parent | 07d76e12aa46fa0bad4b736d581ec5aca62264f7 (diff) | |
download | blktrace-8fc451c6b0b9a7db7c376ea6865c35321e561f00.tar.gz |
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>
-rw-r--r-- | btt/dip_rb.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/btt/dip_rb.c b/btt/dip_rb.c index 2aa7ffc..6efef6c 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); } } |