cfq-iosched: Respect ioprio_class when preempting
authorDivyesh Shah <dpshah@google.com>
Thu, 7 Jan 2010 02:58:20 +0000 (18:58 -0800)
committerJens Axboe <jens.axboe@oracle.com>
Mon, 11 Jan 2010 15:16:18 +0000 (16:16 +0100)
In cfq_should_preempt(), we currently allow some cases where a non-RT request
can preempt an ongoing RT cfqq timeslice. This should not happen.
Examples include:

o A sync_noidle wl type non-RT request pre-empting a sync_noidle wl type cfqq
  on which we are idling.
o Once we have per-cgroup async queues, a non-RT sync request pre-empting a RT
  async cfqq.

Signed-off-by: Divyesh Shah<dpshah@google.com>
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
block/cfq-iosched.c

index 918c7fd9aeb1f9c662606a754ddfafa511193897..ee130f14d1fc9228214fb7d0acbd3d4f4a85acdd 100644 (file)
@@ -3076,6 +3076,12 @@ cfq_should_preempt(struct cfq_data *cfqd, struct cfq_queue *new_cfqq,
        if (cfq_class_idle(cfqq))
                return true;
 
+       /*
+        * Don't allow a non-RT request to preempt an ongoing RT cfqq timeslice.
+        */
+       if (cfq_class_rt(cfqq) && !cfq_class_rt(new_cfqq))
+               return false;
+
        /*
         * if the new request is sync, but the currently running queue is
         * not, let the sync request have priority.