From: Jan Kara <jack@suse.cz>
To: Jens Axboe <axboe@kernel.dk>
Cc: <linux-block@vger.kernel.org>,
Paolo Valente <paolo.valente@linaro.org>, Jan Kara <jack@suse.cz>
Subject: [PATCH 1/8] block: Provide icq in request allocation data
Date: Tue, 23 Nov 2021 11:29:13 +0100 [thread overview]
Message-ID: <20211123103158.17284-1-jack@suse.cz> (raw)
In-Reply-To: <20211123101109.20879-1-jack@suse.cz>
Currently we lookup ICQ only after the request is allocated. However BFQ
will want to decide how many scheduler tags it allows a given bfq queue
(effectively a process) to consume based on cgroup weight. So lookup ICQ
earlier and provide it in struct blk_mq_alloc_data so that BFQ can use
it.
Acked-by: Paolo Valente <paolo.valente@linaro.org>
Signed-off-by: Jan Kara <jack@suse.cz>
---
block/blk-mq-sched.c | 18 ++++++++++--------
block/blk-mq-sched.h | 3 ++-
block/blk-mq.c | 8 ++++----
block/blk-mq.h | 1 +
4 files changed, 17 insertions(+), 13 deletions(-)
diff --git a/block/blk-mq-sched.c b/block/blk-mq-sched.c
index ba21449439cc..c4015b82a003 100644
--- a/block/blk-mq-sched.c
+++ b/block/blk-mq-sched.c
@@ -18,9 +18,8 @@
#include "blk-mq-tag.h"
#include "blk-wbt.h"
-void blk_mq_sched_assign_ioc(struct request *rq)
+struct io_cq *blk_mq_sched_lookup_icq(struct request_queue *q)
{
- struct request_queue *q = rq->q;
struct io_context *ioc;
struct io_cq *icq;
@@ -29,17 +28,20 @@ void blk_mq_sched_assign_ioc(struct request *rq)
*/
ioc = current->io_context;
if (!ioc)
- return;
+ return NULL;
spin_lock_irq(&q->queue_lock);
icq = ioc_lookup_icq(ioc, q);
spin_unlock_irq(&q->queue_lock);
+ if (icq)
+ return icq;
+ return ioc_create_icq(ioc, q, GFP_ATOMIC);
+}
- if (!icq) {
- icq = ioc_create_icq(ioc, q, GFP_ATOMIC);
- if (!icq)
- return;
- }
+void blk_mq_sched_assign_ioc(struct request *rq, struct io_cq *icq)
+{
+ if (!icq)
+ return;
get_io_context(icq->ioc);
rq->elv.icq = icq;
}
diff --git a/block/blk-mq-sched.h b/block/blk-mq-sched.h
index 25d1034952b6..40be707f69d7 100644
--- a/block/blk-mq-sched.h
+++ b/block/blk-mq-sched.h
@@ -8,7 +8,8 @@
#define MAX_SCHED_RQ (16 * BLKDEV_DEFAULT_RQ)
-void blk_mq_sched_assign_ioc(struct request *rq);
+struct io_cq *blk_mq_sched_lookup_icq(struct request_queue *q);
+void blk_mq_sched_assign_ioc(struct request *rq, struct io_cq *icq);
bool blk_mq_sched_try_merge(struct request_queue *q, struct bio *bio,
unsigned int nr_segs, struct request **merged_request);
diff --git a/block/blk-mq.c b/block/blk-mq.c
index 8799fa73ef34..69b224c76d7c 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -388,9 +388,7 @@ static struct request *blk_mq_rq_ctx_init(struct blk_mq_alloc_data *data,
if (!op_is_flush(data->cmd_flags) &&
e->type->ops.prepare_request) {
- if (e->type->icq_cache)
- blk_mq_sched_assign_ioc(rq);
-
+ blk_mq_sched_assign_ioc(rq, data->icq);
e->type->ops.prepare_request(rq);
rq->rq_flags |= RQF_ELVPRIV;
}
@@ -449,7 +447,9 @@ static struct request *__blk_mq_alloc_requests(struct blk_mq_alloc_data *data)
struct elevator_queue *e = q->elevator;
data->rq_flags |= RQF_ELV;
-
+ if (!op_is_flush(data->cmd_flags) && e->type->icq_cache &&
+ e->type->ops.prepare_request)
+ data->icq = blk_mq_sched_lookup_icq(q);
/*
* Flush/passthrough requests are special and go directly to the
* dispatch list. Don't include reserved tags in the
diff --git a/block/blk-mq.h b/block/blk-mq.h
index afcf9931a489..4e9cf92ca587 100644
--- a/block/blk-mq.h
+++ b/block/blk-mq.h
@@ -152,6 +152,7 @@ static inline struct blk_mq_ctx *blk_mq_get_ctx(struct request_queue *q)
struct blk_mq_alloc_data {
/* input parameter */
struct request_queue *q;
+ struct io_cq *icq;
blk_mq_req_flags_t flags;
unsigned int shallow_depth;
unsigned int cmd_flags;
--
2.26.2
next prev parent reply other threads:[~2021-11-23 10:32 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-11-23 10:29 [PATCH 0/8 v4] bfq: Limit number of allocated scheduler tags per cgroup Jan Kara
2021-11-23 10:29 ` Jan Kara [this message]
2021-11-23 16:06 ` [PATCH 1/8] block: Provide icq in request allocation data Jens Axboe
2021-11-23 22:30 ` Jan Kara
2021-11-23 23:10 ` Jens Axboe
2021-11-23 10:29 ` [PATCH 2/8] bfq: Track number of allocated requests in bfq_entity Jan Kara
2021-11-23 10:29 ` [PATCH 3/8] bfq: Store full bitmap depth in bfq_data Jan Kara
2021-11-23 10:29 ` [PATCH 4/8] bfq: Limit number of requests consumed by each cgroup Jan Kara
2021-11-23 10:29 ` [PATCH 5/8] bfq: Limit waker detection in time Jan Kara
2021-11-23 10:29 ` [PATCH 6/8] bfq: Provide helper to generate bfqq name Jan Kara
2021-11-23 10:29 ` [PATCH 7/8] bfq: Log waker detections Jan Kara
2021-11-23 10:29 ` [PATCH 8/8] bfq: Do not let waker requests skip proper accounting Jan Kara
-- strict thread matches above, loose matches on Subject: below --
2021-10-06 17:31 [PATCH 0/8 v3] bfq: Limit number of allocated scheduler tags per cgroup Jan Kara
2021-10-06 17:31 ` [PATCH 1/8] block: Provide icq in request allocation data Jan Kara
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=20211123103158.17284-1-jack@suse.cz \
--to=jack@suse.cz \
--cc=axboe@kernel.dk \
--cc=linux-block@vger.kernel.org \
--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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.