aboutsummaryrefslogtreecommitdiffstats
path: root/block
diff options
context:
space:
mode:
authorJens Axboe <axboe@fb.com>2015-06-10 08:01:20 -0600
committerZiyan <jaraidaniel@gmail.com>2016-01-08 10:44:43 +0100
commit9f407fff1b2464c272419651d82f10cc658d372f (patch)
tree1a2d0498265934ebbebd88a1b59adc33f1499b4a /block
parent87d9ce64dc77a1f03c9514a3ac973e008b9abe0c (diff)
downloadkernel_samsung_tuna-9f407fff1b2464c272419651d82f10cc658d372f.zip
kernel_samsung_tuna-9f407fff1b2464c272419651d82f10cc658d372f.tar.gz
kernel_samsung_tuna-9f407fff1b2464c272419651d82f10cc658d372f.tar.bz2
cfq-iosched: fix the setting of IOPS mode on SSDs
A previous commit wanted to make CFQ default to IOPS mode on non-rotational storage, however it did so when the queue was initialized and the non-rotational flag is only set later on in the probe. Add an elevator hook that gets called off the add_disk() path, at that point we know that feature probing has finished, and we can reliably check for the various flags that drivers can set. Change-Id: Ieaf0beed1efc0ace7e61766e725647c6509e9852 Fixes: 41c0126b ("block: Make CFQ default to IOPS mode on SSDs") Tested-by: Romain Francoise <romain@orebokech.com> Signed-off-by: Jens Axboe <axboe@fb.com>
Diffstat (limited to 'block')
-rw-r--r--block/cfq-iosched.c15
-rw-r--r--block/elevator.c2
2 files changed, 16 insertions, 1 deletions
diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c
index 7ad779c..172a072 100644
--- a/block/cfq-iosched.c
+++ b/block/cfq-iosched.c
@@ -3785,7 +3785,7 @@ static void *cfq_init_queue(struct request_queue *q)
cfqd->cfq_slice[0] = cfq_slice_async;
cfqd->cfq_slice[1] = cfq_slice_sync;
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;
@@ -3797,6 +3797,18 @@ static void *cfq_init_queue(struct request_queue *q)
return cfqd;
}
+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 -->
*/
@@ -3909,6 +3921,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),
diff --git a/block/elevator.c b/block/elevator.c
index 001d08a..64e394c 100644
--- a/block/elevator.c
+++ b/block/elevator.c
@@ -857,6 +857,8 @@ int __elv_register_queue(struct request_queue *q, struct elevator_queue *e)
}
kobject_uevent(&e->kobj, KOBJ_ADD);
e->registered = 1;
+ if (e->type->ops.elevator_registered_fn)
+ e->type->ops.elevator_registered_fn(q);
}
return error;
}