cfq-iosched: fix the setting of IOPS mode on SSDs
[cascardo/linux.git] / block / cfq-iosched.c
index c808ad8..d1d0cb2 100644 (file)
@@ -4508,7 +4508,7 @@ static int cfq_init_queue(struct request_queue *q, struct elevator_type *e)
        cfqd->cfq_slice[1] = cfq_slice_sync;
        cfqd->cfq_target_latency = cfq_target_latency;
        cfqd->cfq_slice_async_rq = cfq_slice_async_rq;
-       cfqd->cfq_slice_idle = blk_queue_nonrot(q) ? 0 : cfq_slice_idle;
+       cfqd->cfq_slice_idle = cfq_slice_idle;
        cfqd->cfq_group_idle = cfq_group_idle;
        cfqd->cfq_latency = 1;
        cfqd->hw_tag = -1;
@@ -4525,6 +4525,18 @@ out_free:
        return ret;
 }
 
+static void cfq_registered_queue(struct request_queue *q)
+{
+       struct elevator_queue *e = q->elevator;
+       struct cfq_data *cfqd = e->elevator_data;
+
+       /*
+        * Default to IOPS mode with no idling for SSDs
+        */
+       if (blk_queue_nonrot(q))
+               cfqd->cfq_slice_idle = 0;
+}
+
 /*
  * sysfs parts below -->
  */
@@ -4640,6 +4652,7 @@ static struct elevator_type iosched_cfq = {
                .elevator_may_queue_fn =        cfq_may_queue,
                .elevator_init_fn =             cfq_init_queue,
                .elevator_exit_fn =             cfq_exit_queue,
+               .elevator_registered_fn =       cfq_registered_queue,
        },
        .icq_size       =       sizeof(struct cfq_io_cq),
        .icq_align      =       __alignof__(struct cfq_io_cq),