From: Bart Van Assche
mainline inclusion
from mainline-5.15-rc1
commit 90b7198001f23ea37d3b46dc631bdaa2357a20b1
category: performance
issue: #I4NRS5
CVE: NA
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?i...
Signed-off-by: Yu Changchun
---------------------------
elevator_get_default() uses the following algorithm to select an I/O
scheduler from inside add_disk():
- In case of a single hardware queue or if sharing hardware queues across
multiple request queues (BLK_MQ_F_TAG_HCTX_SHARED), use mq-deadline.
- Otherwise, use 'none'.
This is a good choice for most but not for all block drivers. Make it
possible to override the selection of mq-deadline with a new flag,
namely BLK_MQ_F_NO_SCHED_BY_DEFAULT.
Cc: Christoph Hellwig
Cc: Ming Lei
Cc: Tetsuo Handa
Cc: Martijn Coenen
Cc: Jaegeuk Kim
Signed-off-by: Bart Van Assche
Link: https://lore.kernel.org/r/20210805174200.3250718-2-bvanassche@acm.org
Signed-off-by: Jens Axboe
Conflicts:
block/elevator.c
Signed-off-by: yangerkun
Reviewed-by: Jason Yan
Signed-off-by: Chen Jun
Signed-off-by: Zheng Zengkai
Signed-off-by: Yu Changchun
---
block/elevator.c | 3 +++
include/linux/blk-mq.h | 6 ++++++
2 files changed, 9 insertions(+)
diff --git a/block/elevator.c b/block/elevator.c
index 2a525863d4e9..4ce6b22813a1 100644
--- a/block/elevator.c
+++ b/block/elevator.c
@@ -624,6 +624,9 @@ static inline bool elv_support_iosched(struct request_queue *q)
*/
static struct elevator_type *elevator_get_default(struct request_queue *q)
{
+ if (q->tag_set && q->tag_set->flags & BLK_MQ_F_NO_SCHED_BY_DEFAULT)
+ return NULL;
+
if (q->nr_hw_queues != 1)
return NULL;
diff --git a/include/linux/blk-mq.h b/include/linux/blk-mq.h
index 92bbc9a72355..eee2c8a16601 100644
--- a/include/linux/blk-mq.h
+++ b/include/linux/blk-mq.h
@@ -399,7 +399,13 @@ enum {
BLK_MQ_F_STACKING = 1 << 2,
BLK_MQ_F_TAG_HCTX_SHARED = 1 << 3,
BLK_MQ_F_BLOCKING = 1 << 5,
+ /* Do not allow an I/O scheduler to be configured. */
BLK_MQ_F_NO_SCHED = 1 << 6,
+ /*
+ * Select 'none' during queue registration in case of a single hwq
+ * or shared hwqs instead of 'mq-deadline'.
+ */
+ BLK_MQ_F_NO_SCHED_BY_DEFAULT = 1 << 7,
BLK_MQ_F_ALLOC_POLICY_START_BIT = 8,
BLK_MQ_F_ALLOC_POLICY_BITS = 1,
--
2.25.1