From: Jens Axboe <axboe@kernel.dk>
To: Romain Francoise <romain@orebokech.com>,
Tahsin Erdogan <tahsin@google.com>
Cc: linux-kernel@vger.kernel.org
Subject: Re: [PATCH] block: Make CFQ default to IOPS mode on SSDs
Date: Tue, 09 Jun 2015 11:42:29 -0600 [thread overview]
Message-ID: <55772585.30707@kernel.dk> (raw)
In-Reply-To: <873821kww7.fsf@orebokech.com>
[-- Attachment #1: Type: text/plain, Size: 1523 bytes --]
On 06/09/2015 04:18 AM, Romain Francoise wrote:
> Hi,
>
> On Tue, May 19, 2015 at 01:55:21PM -0700, Tahsin Erdogan wrote:
>> --- a/block/cfq-iosched.c
>> +++ b/block/cfq-iosched.c
>> @@ -4460,7 +4460,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 = cfq_slice_idle;
>> + cfqd->cfq_slice_idle = blk_queue_nonrot(q) ? 0 : cfq_slice_idle;
>> cfqd->cfq_group_idle = cfq_group_idle;
>> cfqd->cfq_latency = 1;
>> cfqd->hw_tag = -1;
>
> Did you test this patch with regular AHCI SSD devices? Applying it on
> top of v4.1-rc7 makes no difference, slice_idle is still initialized to
> 8 in my setup, while rotational is 0.
>
> Isn't the elevator initialized long before the non-rotational flag is
> actually set on the device (which probably happens after it's probed on
> the scsi bus)?
You are absolutely correct. What happens is that the queue is allocated
and initialized, and cfq checks the flag. But the flag is set later in
the process, when we have finished probing the device checked if it's
rotational or not.
There are a few options to handle this. The attached might work, not
tested at all. Basically it adds an io sched registration hook, that is
called when we are adding the disk on the queue. Non-rotational
detection should be done at that point.
Does that work for you?
--
Jens Axboe
[-- Attachment #2: elv-register.patch --]
[-- Type: text/x-patch, Size: 2290 bytes --]
diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c
index c808ad87652d..af8918eb7cd5 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)
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,15 @@ out_free:
return ret;
}
+static void cfq_registered_queue(struct request_queue *q)
+{
+ struct elevator_queue *e = q->elevator;
+ struct cfq_data *cfqd = e->elevator_data;
+
+ if (blk_queue_nonrot(q))
+ cfqd->cfq_slice_idle = 0;
+}
+
/*
* sysfs parts below -->
*/
@@ -4640,6 +4649,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 59794d0d38e3..5f0452734a40 100644
--- a/block/elevator.c
+++ b/block/elevator.c
@@ -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;
}
diff --git a/include/linux/elevator.h b/include/linux/elevator.h
index 45a91474487d..638b324f0291 100644
--- a/include/linux/elevator.h
+++ b/include/linux/elevator.h
@@ -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)
next prev parent reply other threads:[~2015-06-09 18:05 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-05-19 20:55 [PATCH] block: Make CFQ default to IOPS mode on SSDs Tahsin Erdogan
2015-05-27 20:14 ` Tahsin Erdogan
2015-06-05 22:58 ` Tahsin Erdogan
2015-06-06 1:20 ` Jens Axboe
2015-06-09 10:18 ` Romain Francoise
2015-06-09 17:42 ` Jens Axboe [this message]
2015-06-09 21:54 ` Tahsin Erdogan
2015-06-10 6:44 ` Romain Francoise
2015-06-10 14:03 ` Jens Axboe
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=55772585.30707@kernel.dk \
--to=axboe@kernel.dk \
--cc=linux-kernel@vger.kernel.org \
--cc=romain@orebokech.com \
--cc=tahsin@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox