Skip to content

Commit

Permalink
cfq-iosched: fix the setting of IOPS mode on SSDs
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Jens Axboe <[email protected]>
  • Loading branch information
axboe authored and airend committed Sep 18, 2015
1 parent a6876c8 commit 87ae938
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 1 deletion.
15 changes: 14 additions & 1 deletion block/cfq-iosched.c
Original file line number Diff line number Diff line change
Expand Up @@ -3744,7 +3744,7 @@ static void *cfq_init_queue(struct request_queue *q)
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;
Expand All @@ -3756,6 +3756,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 -->
*/
Expand Down Expand Up @@ -3871,6 +3883,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),
Expand Down
2 changes: 2 additions & 0 deletions block/elevator.c
Original file line number Diff line number Diff line change
Expand Up @@ -919,6 +919,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;
}
Expand Down
2 changes: 2 additions & 0 deletions include/linux/elevator.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ typedef void (elevator_deactivate_req_fn) (struct request_queue *, struct reques

typedef void *(elevator_init_fn) (struct request_queue *);
typedef void (elevator_exit_fn) (struct elevator_queue *);
typedef void (elevator_registered_fn) (struct request_queue *);

struct elevator_ops
{
Expand Down Expand Up @@ -70,6 +71,7 @@ struct elevator_ops

elevator_init_fn *elevator_init_fn;
elevator_exit_fn *elevator_exit_fn;
elevator_registered_fn *elevator_registered_fn;
};

#define ELV_NAME_MAX (16)
Expand Down

0 comments on commit 87ae938

Please sign in to comment.