path: root/block/bfq-iosched.c
diff options
authorPaolo Valente <>2017-12-20 12:38:31 +0100
committerJens Axboe <>2018-01-05 09:26:06 -0700
commit05e90283561648301e30232fe0c91bd345ceba03 (patch)
treeeaa740f53e70ef02fa1ec9c8d7db8fe5e00d40bb /block/bfq-iosched.c
parentf0ba5ea2fe45c0ad24a7dedae84a97f7aa046494 (diff)
block, bfq: add missing rq_pos_tree update on rq removal
If two processes do I/O close to each other, then BFQ merges the bfq_queues associated with these processes, to get a more sequential I/O, and thus a higher throughput. In this respect, to detect whether two processes are doing I/O close to each other, BFQ keeps a list of the head-of-line I/O requests of all active bfq_queues. The list is ordered by initial sectors, and implemented through a red-black tree (rq_pos_tree). Unfortunately, the update of the rq_pos_tree was incomplete, because the tree was not updated on the removal of the head-of-line I/O request of a bfq_queue, in case the queue did not remain empty. This commit adds the missing update. Signed-off-by: Paolo Valente <> Signed-off-by: Angelo Ruocco <> Signed-off-by: Jens Axboe <>
Diffstat (limited to 'block/bfq-iosched.c')
1 files changed, 2 insertions, 0 deletions
diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c
index 0f48583..fa395a2 100644
--- a/block/bfq-iosched.c
+++ b/block/bfq-iosched.c
@@ -1627,6 +1627,8 @@ static void bfq_remove_request(struct request_queue *q,
rb_erase(&bfqq->pos_node, bfqq->pos_root);
bfqq->pos_root = NULL;
+ } else {
+ bfq_pos_tree_add_move(bfqd, bfqq);
if (rq->cmd_flags & REQ_META)