cfq-iosched: fix the slice residual sign
authorJens Axboe <jens.axboe@oracle.com>
Tue, 6 Oct 2009 18:53:44 +0000 (20:53 +0200)
committerJens Axboe <jens.axboe@oracle.com>
Tue, 6 Oct 2009 19:09:32 +0000 (21:09 +0200)
We should subtract the slice residual from the rb tree key, since
a negative residual count indicates that the cfqq overran its slice
the last time. Hence we want to add the overrun time, to position
it a bit further away in the service tree.

Reported-by: Corrado Zoccolo <czoccolo@gmail.com>
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
block/cfq-iosched.c

index 5c3cee9..4ab33d8 100644 (file)
@@ -507,8 +507,14 @@ static void cfq_service_tree_add(struct cfq_data *cfqd, struct cfq_queue *cfqq,
                } else
                        rb_key += jiffies;
        } else if (!add_front) {
                } else
                        rb_key += jiffies;
        } else if (!add_front) {
+               /*
+                * Get our rb key offset. Subtract any residual slice
+                * value carried from last service. A negative resid
+                * count indicates slice overrun, and this should position
+                * the next service time further away in the tree.
+                */
                rb_key = cfq_slice_offset(cfqd, cfqq) + jiffies;
                rb_key = cfq_slice_offset(cfqd, cfqq) + jiffies;
-               rb_key += cfqq->slice_resid;
+               rb_key -= cfqq->slice_resid;
                cfqq->slice_resid = 0;
        } else {
                rb_key = -HZ;
                cfqq->slice_resid = 0;
        } else {
                rb_key = -HZ;