diff options
author | Jens Axboe <axboe@fb.com> | 2015-06-10 08:01:20 -0600 |
---|---|---|
committer | Ziyan <jaraidaniel@gmail.com> | 2016-01-08 10:44:43 +0100 |
commit | 9f407fff1b2464c272419651d82f10cc658d372f (patch) | |
tree | 1a2d0498265934ebbebd88a1b59adc33f1499b4a /block | |
parent | 87d9ce64dc77a1f03c9514a3ac973e008b9abe0c (diff) | |
download | kernel_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.c | 15 | ||||
-rw-r--r-- | block/elevator.c | 2 |
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; } |