linux-block.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Bart Van Assche <bvanassche@acm.org>
To: Jens Axboe <axboe@kernel.dk>
Cc: linux-block@vger.kernel.org, Jaegeuk Kim <jaegeuk@kernel.org>,
	Christoph Hellwig <hch@lst.de>,
	Bart Van Assche <bvanassche@acm.org>,
	Damien Le Moal <damien.lemoal@opensource.wdc.com>,
	Ming Lei <ming.lei@redhat.com>
Subject: [PATCH v5 09/11] block: mq-deadline: Track the dispatch position
Date: Tue, 16 May 2023 15:33:18 -0700	[thread overview]
Message-ID: <20230516223323.1383342-10-bvanassche@acm.org> (raw)
In-Reply-To: <20230516223323.1383342-1-bvanassche@acm.org>

Track the position (sector_t) of the most recently dispatched request
instead of tracking a pointer to the next request to dispatch. This
patch is the basis for patch "Handle requeued requests correctly".
Without this patch it would be significantly more complicated to make
sure that zoned writes are dispatched in LBA order per zone.

Reviewed-by: Christoph Hellwig <hch@lst.de>
Cc: Damien Le Moal <damien.lemoal@opensource.wdc.com>
Cc: Ming Lei <ming.lei@redhat.com>
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
---
 block/mq-deadline.c | 45 +++++++++++++++++++++++++++++++--------------
 1 file changed, 31 insertions(+), 14 deletions(-)

diff --git a/block/mq-deadline.c b/block/mq-deadline.c
index 06af9c28a3bf..6d0b99042c96 100644
--- a/block/mq-deadline.c
+++ b/block/mq-deadline.c
@@ -74,8 +74,8 @@ struct dd_per_prio {
 	struct list_head dispatch;
 	struct rb_root sort_list[DD_DIR_COUNT];
 	struct list_head fifo_list[DD_DIR_COUNT];
-	/* Next request in FIFO order. Read, write or both are NULL. */
-	struct request *next_rq[DD_DIR_COUNT];
+	/* Position of the most recently dispatched request. */
+	sector_t latest_pos[DD_DIR_COUNT];
 	struct io_stats_per_prio stats;
 };
 
@@ -156,6 +156,25 @@ deadline_latter_request(struct request *rq)
 	return NULL;
 }
 
+/* Return the first request for which blk_rq_pos() >= pos. */
+static inline struct request *deadline_from_pos(struct dd_per_prio *per_prio,
+				enum dd_data_dir data_dir, sector_t pos)
+{
+	struct rb_node *node = per_prio->sort_list[data_dir].rb_node;
+	struct request *rq, *res = NULL;
+
+	while (node) {
+		rq = rb_entry_rq(node);
+		if (blk_rq_pos(rq) >= pos) {
+			res = rq;
+			node = node->rb_left;
+		} else {
+			node = node->rb_right;
+		}
+	}
+	return res;
+}
+
 static void
 deadline_add_rq_rb(struct dd_per_prio *per_prio, struct request *rq)
 {
@@ -167,11 +186,6 @@ deadline_add_rq_rb(struct dd_per_prio *per_prio, struct request *rq)
 static inline void
 deadline_del_rq_rb(struct dd_per_prio *per_prio, struct request *rq)
 {
-	const enum dd_data_dir data_dir = rq_data_dir(rq);
-
-	if (per_prio->next_rq[data_dir] == rq)
-		per_prio->next_rq[data_dir] = deadline_latter_request(rq);
-
 	elv_rb_del(deadline_rb_root(per_prio, rq), rq);
 }
 
@@ -251,10 +265,6 @@ static void
 deadline_move_request(struct deadline_data *dd, struct dd_per_prio *per_prio,
 		      struct request *rq)
 {
-	const enum dd_data_dir data_dir = rq_data_dir(rq);
-
-	per_prio->next_rq[data_dir] = deadline_latter_request(rq);
-
 	/*
 	 * take it off the sort and fifo list
 	 */
@@ -363,7 +373,8 @@ deadline_next_request(struct deadline_data *dd, struct dd_per_prio *per_prio,
 	struct request *rq;
 	unsigned long flags;
 
-	rq = per_prio->next_rq[data_dir];
+	rq = deadline_from_pos(per_prio, data_dir,
+			       per_prio->latest_pos[data_dir]);
 	if (!rq)
 		return NULL;
 
@@ -426,6 +437,7 @@ static struct request *__dd_dispatch_request(struct deadline_data *dd,
 		if (started_after(dd, rq, latest_start))
 			return NULL;
 		list_del_init(&rq->queuelist);
+		data_dir = rq_data_dir(rq);
 		goto done;
 	}
 
@@ -433,9 +445,11 @@ static struct request *__dd_dispatch_request(struct deadline_data *dd,
 	 * batches are currently reads XOR writes
 	 */
 	rq = deadline_next_request(dd, per_prio, dd->last_dir);
-	if (rq && dd->batching < dd->fifo_batch)
+	if (rq && dd->batching < dd->fifo_batch) {
 		/* we have a next request are still entitled to batch */
+		data_dir = rq_data_dir(rq);
 		goto dispatch_request;
+	}
 
 	/*
 	 * at this point we are not running a batch. select the appropriate
@@ -513,6 +527,7 @@ static struct request *__dd_dispatch_request(struct deadline_data *dd,
 done:
 	ioprio_class = dd_rq_ioclass(rq);
 	prio = ioprio_class_to_prio[ioprio_class];
+	dd->per_prio[prio].latest_pos[data_dir] = blk_rq_pos(rq);
 	dd->per_prio[prio].stats.dispatched++;
 	/*
 	 * If the request needs its target zone locked, do it.
@@ -1026,8 +1041,10 @@ static int deadline_##name##_next_rq_show(void *data,			\
 	struct request_queue *q = data;					\
 	struct deadline_data *dd = q->elevator->elevator_data;		\
 	struct dd_per_prio *per_prio = &dd->per_prio[prio];		\
-	struct request *rq = per_prio->next_rq[data_dir];		\
+	struct request *rq;						\
 									\
+	rq = deadline_from_pos(per_prio, data_dir,			\
+			       per_prio->latest_pos[data_dir]);		\
 	if (rq)								\
 		__blk_mq_debugfs_rq_show(m, rq);			\
 	return 0;							\

  parent reply	other threads:[~2023-05-16 22:33 UTC|newest]

Thread overview: 50+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-05-16 22:33 [PATCH v5 00/11] mq-deadline: Improve support for zoned block devices Bart Van Assche
2023-05-16 22:33 ` [PATCH v5 01/11] block: Simplify blk_req_needs_zone_write_lock() Bart Van Assche
2023-05-16 23:23   ` Damien Le Moal
2023-05-17  7:36   ` Hannes Reinecke
2023-05-17 10:00   ` Johannes Thumshirn
2023-05-16 22:33 ` [PATCH v5 02/11] block: Fix the type of the second bdev_op_is_zoned_write() argument Bart Van Assche
2023-05-16 23:26   ` Damien Le Moal
2023-05-17  7:37   ` Hannes Reinecke
2023-05-16 22:33 ` [PATCH v5 03/11] block: Introduce op_is_zoned_write() Bart Van Assche
2023-05-16 23:30   ` Damien Le Moal
2023-05-17  0:00     ` Bart Van Assche
2023-05-17  6:45       ` Christoph Hellwig
2023-05-17  6:47         ` Damien Le Moal
2023-05-17  7:37   ` Hannes Reinecke
2023-05-16 22:33 ` [PATCH v5 04/11] block: Introduce blk_rq_is_seq_zoned_write() Bart Van Assche
2023-05-17  0:01   ` Damien Le Moal
2023-05-17  7:38   ` Hannes Reinecke
2023-05-17 10:02   ` Johannes Thumshirn
2023-05-16 22:33 ` [PATCH v5 05/11] block: mq-deadline: Clean up deadline_check_fifo() Bart Van Assche
2023-05-17  1:02   ` Damien Le Moal
2023-05-17 15:01     ` Bart Van Assche
2023-05-17 22:07       ` Damien Le Moal
2023-05-17  7:39   ` Hannes Reinecke
2023-05-16 22:33 ` [PATCH v5 06/11] block: mq-deadline: Simplify deadline_skip_seq_writes() Bart Van Assche
2023-05-17  7:40   ` Hannes Reinecke
2023-05-16 22:33 ` [PATCH v5 07/11] block: mq-deadline: Improve deadline_skip_seq_writes() Bart Van Assche
2023-05-17  1:06   ` Damien Le Moal
2023-05-17 16:30     ` Bart Van Assche
2023-05-17 22:15       ` Damien Le Moal
2023-05-18 18:48         ` Bart Van Assche
2023-05-17  7:41   ` Hannes Reinecke
2023-05-17  7:55     ` Damien Le Moal
2023-05-16 22:33 ` [PATCH v5 08/11] block: mq-deadline: Reduce lock contention Bart Van Assche
2023-05-17  1:07   ` Damien Le Moal
2023-05-17  6:46   ` Christoph Hellwig
2023-05-17  7:42   ` Hannes Reinecke
2023-05-16 22:33 ` Bart Van Assche [this message]
2023-05-17  1:13   ` [PATCH v5 09/11] block: mq-deadline: Track the dispatch position Damien Le Moal
2023-05-17  7:45   ` Hannes Reinecke
2023-05-16 22:33 ` [PATCH v5 10/11] block: mq-deadline: Handle requeued requests correctly Bart Van Assche
2023-05-17  1:22   ` Damien Le Moal
2023-05-17 16:28     ` Bart Van Assche
2023-05-17 22:05       ` Damien Le Moal
2023-05-18 12:58       ` Damien Le Moal
2023-05-17  7:46   ` Hannes Reinecke
2023-05-16 22:33 ` [PATCH v5 11/11] block: mq-deadline: Fix handling of at-head zoned writes Bart Van Assche
2023-05-17  1:24   ` Damien Le Moal
2023-05-17  7:47   ` Hannes Reinecke
2023-05-17  7:53     ` Damien Le Moal
2023-05-17 17:13     ` 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=20230516223323.1383342-10-bvanassche@acm.org \
    --to=bvanassche@acm.org \
    --cc=axboe@kernel.dk \
    --cc=damien.lemoal@opensource.wdc.com \
    --cc=hch@lst.de \
    --cc=jaegeuk@kernel.org \
    --cc=linux-block@vger.kernel.org \
    --cc=ming.lei@redhat.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;
as well as URLs for NNTP newsgroup(s).