From: Jens Axboe <axboe@fb.com>
To: <axboe@kernel.dk>, <linux-block@vger.kernel.org>,
<linux-kernel@vger.kernel.org>
Cc: <paolo.valente@linaro.org>, <osandov@fb.com>, Jens Axboe <axboe@fb.com>
Subject: [PATCH 8/8] blk-mq-sched: allow setting of default IO scheduler
Date: Fri, 16 Dec 2016 17:12:16 -0700 [thread overview]
Message-ID: <1481933536-12844-9-git-send-email-axboe@fb.com> (raw)
In-Reply-To: <1481933536-12844-1-git-send-email-axboe@fb.com>
Add Kconfig entries to manage what devices get assigned an MQ
scheduler, and add a blk-mq flag for drivers to opt out of scheduling.
The latter is useful for admin type queues that still allocate a blk-mq
queue and tag set, but aren't use for normal IO.
Signed-off-by: Jens Axboe <axboe@fb.com>
---
block/Kconfig.iosched | 43 +++++++++++++++++++++++++++++++++++++------
block/blk-mq-sched.c | 19 +++++++++++++++++++
block/blk-mq-sched.h | 2 ++
block/blk-mq.c | 3 +++
block/elevator.c | 5 ++++-
drivers/nvme/host/pci.c | 1 +
include/linux/blk-mq.h | 1 +
7 files changed, 67 insertions(+), 7 deletions(-)
diff --git a/block/Kconfig.iosched b/block/Kconfig.iosched
index 490ef2850fae..96216cf18560 100644
--- a/block/Kconfig.iosched
+++ b/block/Kconfig.iosched
@@ -32,12 +32,6 @@ config IOSCHED_CFQ
This is the default I/O scheduler.
-config MQ_IOSCHED_DEADLINE
- tristate "MQ deadline I/O scheduler"
- default y
- ---help---
- MQ version of the deadline IO scheduler.
-
config CFQ_GROUP_IOSCHED
bool "CFQ Group Scheduling support"
depends on IOSCHED_CFQ && BLK_CGROUP
@@ -69,6 +63,43 @@ config DEFAULT_IOSCHED
default "cfq" if DEFAULT_CFQ
default "noop" if DEFAULT_NOOP
+config MQ_IOSCHED_DEADLINE
+ tristate "MQ deadline I/O scheduler"
+ default y
+ ---help---
+ MQ version of the deadline IO scheduler.
+
+config MQ_IOSCHED_NONE
+ bool
+ default y
+
+choice
+ prompt "Default MQ I/O scheduler"
+ default MQ_IOSCHED_NONE
+ help
+ Select the I/O scheduler which will be used by default for all
+ blk-mq managed block devices.
+
+ config DEFAULT_MQ_DEADLINE
+ bool "MQ Deadline" if MQ_IOSCHED_DEADLINE=y
+
+ config DEFAULT_MQ_NONE
+ bool "None"
+
+endchoice
+
+config DEFAULT_MQ_IOSCHED
+ string
+ default "mq-deadline" if DEFAULT_MQ_DEADLINE
+ default "none" if DEFAULT_MQ_NONE
+
+config MQ_IOSCHED_ONLY_SQ
+ bool "Enable blk-mq IO scheduler only for single queue devices"
+ default y
+ help
+ Say Y here, if you only want to enable IO scheduling on block
+ devices that have a single queue registered.
+
endmenu
endif
diff --git a/block/blk-mq-sched.c b/block/blk-mq-sched.c
index b7e1839d4785..1f06efcdaa2d 100644
--- a/block/blk-mq-sched.c
+++ b/block/blk-mq-sched.c
@@ -432,3 +432,22 @@ void blk_mq_sched_request_inserted(struct request *rq)
trace_block_rq_insert(rq->q, rq);
}
EXPORT_SYMBOL_GPL(blk_mq_sched_request_inserted);
+
+int blk_mq_sched_init(struct request_queue *q)
+{
+ int ret;
+
+#if defined(CONFIG_DEFAULT_MQ_NONE)
+ return 0;
+#endif
+#if defined(CONFIG_MQ_IOSCHED_ONLY_SQ)
+ if (q->nr_hw_queues > 1)
+ return 0;
+#endif
+
+ mutex_lock(&q->sysfs_lock);
+ ret = elevator_init(q, NULL);
+ mutex_unlock(&q->sysfs_lock);
+
+ return ret;
+}
diff --git a/block/blk-mq-sched.h b/block/blk-mq-sched.h
index 1d1a4e9ce6ca..826f3e6991e3 100644
--- a/block/blk-mq-sched.h
+++ b/block/blk-mq-sched.h
@@ -37,6 +37,8 @@ bool blk_mq_sched_try_insert_merge(struct request_queue *q, struct request *rq);
void blk_mq_sched_dispatch_requests(struct blk_mq_hw_ctx *hctx);
+int blk_mq_sched_init(struct request_queue *q);
+
static inline bool
blk_mq_sched_bio_merge(struct request_queue *q, struct bio *bio)
{
diff --git a/block/blk-mq.c b/block/blk-mq.c
index 032dca4a27bf..0d8ea45b8562 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -2105,6 +2105,9 @@ struct request_queue *blk_mq_init_allocated_queue(struct blk_mq_tag_set *set,
INIT_LIST_HEAD(&q->requeue_list);
spin_lock_init(&q->requeue_lock);
+ if (!(set->flags & BLK_MQ_F_NO_SCHED))
+ blk_mq_sched_init(q);
+
if (q->nr_hw_queues > 1)
blk_queue_make_request(q, blk_mq_make_request);
else
diff --git a/block/elevator.c b/block/elevator.c
index e6b523360231..eb34c26f675f 100644
--- a/block/elevator.c
+++ b/block/elevator.c
@@ -219,7 +219,10 @@ int elevator_init(struct request_queue *q, char *name)
}
if (!e) {
- e = elevator_get(CONFIG_DEFAULT_IOSCHED, false);
+ if (q->mq_ops)
+ e = elevator_get(CONFIG_DEFAULT_MQ_IOSCHED, false);
+ else
+ e = elevator_get(CONFIG_DEFAULT_IOSCHED, false);
if (!e) {
printk(KERN_ERR
"Default I/O scheduler not found. " \
diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c
index d6e6bce93d0c..063410d9b3cc 100644
--- a/drivers/nvme/host/pci.c
+++ b/drivers/nvme/host/pci.c
@@ -1188,6 +1188,7 @@ static int nvme_alloc_admin_tags(struct nvme_dev *dev)
dev->admin_tagset.timeout = ADMIN_TIMEOUT;
dev->admin_tagset.numa_node = dev_to_node(dev->dev);
dev->admin_tagset.cmd_size = nvme_cmd_size(dev);
+ dev->admin_tagset.flags = BLK_MQ_F_NO_SCHED;
dev->admin_tagset.driver_data = dev;
if (blk_mq_alloc_tag_set(&dev->admin_tagset))
diff --git a/include/linux/blk-mq.h b/include/linux/blk-mq.h
index e3159be841ff..9255ccb043f2 100644
--- a/include/linux/blk-mq.h
+++ b/include/linux/blk-mq.h
@@ -152,6 +152,7 @@ enum {
BLK_MQ_F_SG_MERGE = 1 << 2,
BLK_MQ_F_DEFER_ISSUE = 1 << 4,
BLK_MQ_F_BLOCKING = 1 << 5,
+ BLK_MQ_F_NO_SCHED = 1 << 6,
BLK_MQ_F_ALLOC_POLICY_START_BIT = 8,
BLK_MQ_F_ALLOC_POLICY_BITS = 1,
--
2.7.4
next prev parent reply other threads:[~2016-12-17 0:14 UTC|newest]
Thread overview: 69+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-12-17 0:12 [PATCHSET v4] blk-mq-scheduling framework Jens Axboe
2016-12-17 0:12 ` [PATCH 1/8] block: move existing elevator ops to union Jens Axboe
2016-12-17 0:12 ` [PATCH 2/8] blk-mq: make mq_ops a const pointer Jens Axboe
2016-12-17 0:12 ` [PATCH 3/8] block: move rq_ioc() to blk.h Jens Axboe
2016-12-20 10:12 ` Paolo Valente
2016-12-20 15:46 ` Jens Axboe
2016-12-20 22:14 ` Jens Axboe
2016-12-17 0:12 ` [PATCH 4/8] blk-mq: un-export blk_mq_free_hctx_request() Jens Axboe
2016-12-17 0:12 ` [PATCH 5/8] blk-mq: export some helpers we need to the scheduling framework Jens Axboe
2016-12-17 0:12 ` [PATCH 6/8] blk-mq-sched: add framework for MQ capable IO schedulers Jens Axboe
2016-12-20 11:55 ` Paolo Valente
2016-12-20 15:45 ` Jens Axboe
2016-12-21 2:22 ` Jens Axboe
2016-12-22 15:20 ` Paolo Valente
2016-12-22 9:59 ` Paolo Valente
2016-12-22 11:13 ` Paolo Valente
2017-01-17 2:47 ` Jens Axboe
2017-01-17 10:13 ` Paolo Valente
2017-01-17 12:38 ` Jens Axboe
2016-12-23 10:12 ` Paolo Valente
2017-01-17 2:47 ` Jens Axboe
2017-01-17 9:17 ` Paolo Valente
2016-12-17 0:12 ` [PATCH 7/8] mq-deadline: add blk-mq adaptation of the deadline IO scheduler Jens Axboe
2016-12-20 9:34 ` Paolo Valente
2016-12-20 15:46 ` Jens Axboe
2016-12-21 11:59 ` Bart Van Assche
2016-12-21 14:22 ` Jens Axboe
2016-12-22 16:07 ` Paolo Valente
2017-01-17 2:47 ` Jens Axboe
2016-12-22 16:49 ` Paolo Valente
2017-01-17 2:47 ` Jens Axboe
2017-01-20 11:07 ` Paolo Valente
2017-01-20 14:26 ` Jens Axboe
2017-01-20 13:14 ` Paolo Valente
2017-01-20 13:18 ` Paolo Valente
2017-01-20 14:28 ` Jens Axboe
2017-01-20 14:28 ` Jens Axboe
2017-02-01 11:11 ` Paolo Valente
2017-02-02 5:19 ` Jens Axboe
2017-02-02 9:19 ` Paolo Valente
2017-02-02 15:30 ` Jens Axboe
2017-02-02 21:15 ` Paolo Valente
2017-02-02 21:32 ` Jens Axboe
2017-02-07 17:27 ` Paolo Valente
2017-02-01 11:56 ` Paolo Valente
2017-02-02 5:20 ` Jens Axboe
2017-02-16 10:46 ` Paolo Valente
2017-02-16 15:35 ` Jens Axboe
2016-12-17 0:12 ` Jens Axboe [this message]
2016-12-19 11:32 ` [PATCHSET v4] blk-mq-scheduling framework Paolo Valente
2016-12-19 15:20 ` Jens Axboe
2016-12-19 15:33 ` Jens Axboe
2016-12-19 18:21 ` Paolo Valente
2016-12-19 21:05 ` Jens Axboe
2016-12-22 15:28 ` Paolo Valente
2017-01-17 2:47 ` Jens Axboe
2017-01-17 10:49 ` Paolo Valente
2017-01-18 16:14 ` Paolo Valente
2017-01-18 16:21 ` Jens Axboe
2017-01-23 17:04 ` Paolo Valente
2017-01-23 17:42 ` Jens Axboe
2017-01-25 8:46 ` Paolo Valente
2017-01-25 16:13 ` Jens Axboe
2017-01-26 14:23 ` Paolo Valente
2016-12-22 16:23 ` Bart Van Assche
2016-12-22 16:52 ` Omar Sandoval
2016-12-22 16:57 ` Bart Van Assche
2016-12-22 17:12 ` Omar Sandoval
2016-12-22 17:39 ` Bart Van Assche
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=1481933536-12844-9-git-send-email-axboe@fb.com \
--to=axboe@fb.com \
--cc=axboe@kernel.dk \
--cc=linux-block@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=osandov@fb.com \
--cc=paolo.valente@linaro.org \
/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
Powered by JetHome