From: Jens Axboe <axboe@kernel.dk>
To: linux-block@vger.kernel.org
Cc: Jens Axboe <axboe@kernel.dk>, Christoph Hellwig <hch@infradead.org>
Subject: [PATCH 1/4] block: provide helpers for rq_list manipulation
Date: Wed, 13 Oct 2021 10:49:34 -0600 [thread overview]
Message-ID: <20211013164937.985367-2-axboe@kernel.dk> (raw)
In-Reply-To: <20211013164937.985367-1-axboe@kernel.dk>
Instead of open-coding the list additions, traversal, and removal,
provide a basic set of helpers.
Suggested-by: Christoph Hellwig <hch@infradead.org>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
---
block/blk-mq.c | 21 +++++----------------
include/linux/blk-mq.h | 25 +++++++++++++++++++++++++
2 files changed, 30 insertions(+), 16 deletions(-)
diff --git a/block/blk-mq.c b/block/blk-mq.c
index 6dfd3aaa6073..46a91e5fabc5 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -426,10 +426,10 @@ static struct request *__blk_mq_alloc_requests(struct blk_mq_alloc_data *data)
tag = tag_offset + i;
tags &= ~(1UL << i);
rq = blk_mq_rq_ctx_init(data, tag, alloc_time_ns);
- rq->rq_next = *data->cached_rq;
- *data->cached_rq = rq;
+ rq_list_add_tail(data->cached_rq, rq);
}
data->nr_tags -= nr;
+ return rq_list_pop(data->cached_rq);
} else {
/*
* Waiting allocations only fail because of an inactive hctx.
@@ -453,14 +453,6 @@ static struct request *__blk_mq_alloc_requests(struct blk_mq_alloc_data *data)
return blk_mq_rq_ctx_init(data, tag, alloc_time_ns);
}
-
- if (data->cached_rq) {
- rq = *data->cached_rq;
- *data->cached_rq = rq->rq_next;
- return rq;
- }
-
- return NULL;
}
struct request *blk_mq_alloc_request(struct request_queue *q, unsigned int op,
@@ -603,11 +595,9 @@ EXPORT_SYMBOL_GPL(blk_mq_free_request);
void blk_mq_free_plug_rqs(struct blk_plug *plug)
{
- while (plug->cached_rq) {
- struct request *rq;
+ struct request *rq;
- rq = plug->cached_rq;
- plug->cached_rq = rq->rq_next;
+ while ((rq = rq_list_pop(&plug->cached_rq)) != NULL) {
percpu_ref_get(&rq->q->q_usage_counter);
blk_mq_free_request(rq);
}
@@ -2264,8 +2254,7 @@ void blk_mq_submit_bio(struct bio *bio)
plug = blk_mq_plug(q, bio);
if (plug && plug->cached_rq) {
- rq = plug->cached_rq;
- plug->cached_rq = rq->rq_next;
+ rq = rq_list_pop(&plug->cached_rq);
INIT_LIST_HEAD(&rq->queuelist);
} else {
struct blk_mq_alloc_data data = {
diff --git a/include/linux/blk-mq.h b/include/linux/blk-mq.h
index a9c1d0882550..c05560524841 100644
--- a/include/linux/blk-mq.h
+++ b/include/linux/blk-mq.h
@@ -473,6 +473,31 @@ struct blk_mq_tag_set {
struct list_head tag_list;
};
+#define rq_list_add_tail(listptr, rq) do { \
+ (rq)->rq_next = *(listptr); \
+ *(listptr) = rq; \
+} while (0)
+
+#define rq_list_pop(listptr) \
+({ \
+ struct request *__req = NULL; \
+ if ((listptr) && *(listptr)) { \
+ __req = *(listptr); \
+ *(listptr) = __req->rq_next; \
+ } \
+ __req; \
+})
+
+#define rq_list_peek(listptr) \
+({ \
+ struct request *__req = NULL; \
+ if ((listptr) && *(listptr)) \
+ __req = *(listptr); \
+ __req; \
+})
+
+#define rq_list_next(rq) (rq)->rq_next
+
/**
* struct blk_mq_queue_data - Data about a request inserted in a queue
*
--
2.33.0
next prev parent reply other threads:[~2021-10-13 16:49 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-10-13 16:49 [PATCHSET 0/4] Various block optimizations Jens Axboe
2021-10-13 16:49 ` Jens Axboe [this message]
2021-10-13 17:11 ` [PATCH 1/4] block: provide helpers for rq_list manipulation Christoph Hellwig
2021-10-13 17:47 ` Jens Axboe
2021-10-13 16:49 ` [PATCH 2/4] block: inline fast path of driver tag allocation Jens Axboe
2021-10-13 17:22 ` Christoph Hellwig
2021-10-13 17:46 ` Jens Axboe
2021-10-13 17:57 ` Christoph Hellwig
2021-10-13 18:07 ` Jens Axboe
2021-10-13 16:49 ` [PATCH 3/4] block: don't bother iter advancing a fully done bio Jens Axboe
2021-10-13 17:26 ` Christoph Hellwig
2021-10-13 17:46 ` Jens Axboe
2021-10-13 16:49 ` [PATCH 4/4] block: move update request helpers into blk-mq.c Jens Axboe
2021-10-13 17:32 ` Christoph Hellwig
2021-10-13 17:46 ` Jens Axboe
2021-10-13 17:54 ` Christoph Hellwig
2021-10-13 17:57 ` Jens Axboe
2021-10-14 5:00 ` Christoph Hellwig
2021-10-14 15:14 ` 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=20211013164937.985367-2-axboe@kernel.dk \
--to=axboe@kernel.dk \
--cc=hch@infradead.org \
--cc=linux-block@vger.kernel.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.