diff options
author | Jens Axboe <axboe@fb.com> | 2015-06-10 10:01:20 -0400 |
---|---|---|
committer | Jens Axboe <axboe@fb.com> | 2015-06-10 10:01:20 -0400 |
commit | 0bb979472a7401022109e81dd89d777adea58710 (patch) | |
tree | 27cf4730d269d037ad5b0db1f89d5ecf788cb3d0 /block/cfq-iosched.c | |
parent | ae11f7efda05dc568521924c890c80d0be908d43 (diff) |
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.
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/cfq-iosched.c')
-rw-r--r-- | block/cfq-iosched.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c index c808ad87652d..d1d0cb235cd2 100644 --- a/block/cfq-iosched.c +++ b/block/cfq-iosched.c | |||
@@ -4508,7 +4508,7 @@ static int cfq_init_queue(struct request_queue *q, struct elevator_type *e) | |||
4508 | cfqd->cfq_slice[1] = cfq_slice_sync; | 4508 | cfqd->cfq_slice[1] = cfq_slice_sync; |
4509 | cfqd->cfq_target_latency = cfq_target_latency; | 4509 | cfqd->cfq_target_latency = cfq_target_latency; |
4510 | cfqd->cfq_slice_async_rq = cfq_slice_async_rq; | 4510 | cfqd->cfq_slice_async_rq = cfq_slice_async_rq; |
4511 | cfqd->cfq_slice_idle = blk_queue_nonrot(q) ? 0 : cfq_slice_idle; | 4511 | cfqd->cfq_slice_idle = cfq_slice_idle; |
4512 | cfqd->cfq_group_idle = cfq_group_idle; | 4512 | cfqd->cfq_group_idle = cfq_group_idle; |
4513 | cfqd->cfq_latency = 1; | 4513 | cfqd->cfq_latency = 1; |
4514 | cfqd->hw_tag = -1; | 4514 | cfqd->hw_tag = -1; |
@@ -4525,6 +4525,18 @@ out_free: | |||
4525 | return ret; | 4525 | return ret; |
4526 | } | 4526 | } |
4527 | 4527 | ||
4528 | static void cfq_registered_queue(struct request_queue *q) | ||
4529 | { | ||
4530 | struct elevator_queue *e = q->elevator; | ||
4531 | struct cfq_data *cfqd = e->elevator_data; | ||
4532 | |||
4533 | /* | ||
4534 | * Default to IOPS mode with no idling for SSDs | ||
4535 | */ | ||
4536 | if (blk_queue_nonrot(q)) | ||
4537 | cfqd->cfq_slice_idle = 0; | ||
4538 | } | ||
4539 | |||
4528 | /* | 4540 | /* |
4529 | * sysfs parts below --> | 4541 | * sysfs parts below --> |
4530 | */ | 4542 | */ |
@@ -4640,6 +4652,7 @@ static struct elevator_type iosched_cfq = { | |||
4640 | .elevator_may_queue_fn = cfq_may_queue, | 4652 | .elevator_may_queue_fn = cfq_may_queue, |
4641 | .elevator_init_fn = cfq_init_queue, | 4653 | .elevator_init_fn = cfq_init_queue, |
4642 | .elevator_exit_fn = cfq_exit_queue, | 4654 | .elevator_exit_fn = cfq_exit_queue, |
4655 | .elevator_registered_fn = cfq_registered_queue, | ||
4643 | }, | 4656 | }, |
4644 | .icq_size = sizeof(struct cfq_io_cq), | 4657 | .icq_size = sizeof(struct cfq_io_cq), |
4645 | .icq_align = __alignof__(struct cfq_io_cq), | 4658 | .icq_align = __alignof__(struct cfq_io_cq), |