Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0bb97947 authored by Jens Axboe's avatar Jens Axboe
Browse files

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: default avatarRomain Francoise <romain@orebokech.com>
Signed-off-by: default avatarJens Axboe <axboe@fb.com>
parent ae11f7ef
Loading
Loading
Loading
Loading
+14 −1
Original line number Diff line number Diff line
@@ -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 @@ static int cfq_init_queue(struct request_queue *q, struct elevator_type *e)
	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),
+2 −0
Original line number Diff line number Diff line
@@ -810,6 +810,8 @@ int elv_register_queue(struct request_queue *q)
		}
		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;
}
+2 −0
Original line number Diff line number Diff line
@@ -39,6 +39,7 @@ typedef void (elevator_deactivate_req_fn) (struct request_queue *, struct reques
typedef int (elevator_init_fn) (struct request_queue *,
				struct elevator_type *e);
typedef void (elevator_exit_fn) (struct elevator_queue *);
typedef void (elevator_registered_fn) (struct request_queue *);

struct elevator_ops
{
@@ -68,6 +69,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)