From: "Michael S. Tsirkin" <mst@redhat.com>
To: Christoph Hellwig <hch@lst.de>
Cc: Jens Axboe <axboe@kernel.dk>, Jason Wang <jasowang@redhat.com>,
Keith Busch <kbusch@kernel.org>, Sagi Grimberg <sagi@grimberg.me>,
Pavel Begunkov <asml.silence@gmail.com>,
linux-block@vger.kernel.org, virtualization@lists.linux.dev,
linux-nvme@lists.infradead.org, io-uring@vger.kernel.org
Subject: Re: [PATCH 2/6] virtio_blk: reverse request order in virtio_queue_rqs
Date: Wed, 13 Nov 2024 18:25:13 -0500 [thread overview]
Message-ID: <20241113182448-mutt-send-email-mst@kernel.org> (raw)
In-Reply-To: <20241113152050.157179-3-hch@lst.de>
On Wed, Nov 13, 2024 at 04:20:42PM +0100, Christoph Hellwig wrote:
> blk_mq_flush_plug_list submits requests in the reverse order that they
> were submitted, which leads to a rather suboptimal I/O pattern especially
> in rotational devices. Fix this by rewriting nvme_queue_rqs so that it
> always pops the requests from the passed in request list, and then adds
> them to the head of a local submit list. This actually simplifies the
> code a bit as it removes the complicated list splicing, at the cost of
> extra updates of the rq_next pointer. As that should be cache hot
> anyway it should be an easy price to pay.
>
> Fixes: 0e9911fa768f ("virtio-blk: support mq_ops->queue_rqs()")
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---
> drivers/block/virtio_blk.c | 46 +++++++++++++++++---------------------
> 1 file changed, 21 insertions(+), 25 deletions(-)
>
> diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c
> index 0e99a4714928..b25f7c06a28e 100644
> --- a/drivers/block/virtio_blk.c
> +++ b/drivers/block/virtio_blk.c
> @@ -471,18 +471,18 @@ static bool virtblk_prep_rq_batch(struct request *req)
> return virtblk_prep_rq(req->mq_hctx, vblk, req, vbr) == BLK_STS_OK;
> }
>
> -static bool virtblk_add_req_batch(struct virtio_blk_vq *vq,
> +static void virtblk_add_req_batch(struct virtio_blk_vq *vq,
> struct request **rqlist)
> {
> + struct request *req;
> unsigned long flags;
> - int err;
> bool kick;
>
> spin_lock_irqsave(&vq->lock, flags);
>
> - while (!rq_list_empty(*rqlist)) {
> - struct request *req = rq_list_pop(rqlist);
> + while ((req = rq_list_pop(rqlist))) {
> struct virtblk_req *vbr = blk_mq_rq_to_pdu(req);
> + int err;
>
> err = virtblk_add_req(vq->vq, vbr);
> if (err) {
> @@ -495,37 +495,33 @@ static bool virtblk_add_req_batch(struct virtio_blk_vq *vq,
> kick = virtqueue_kick_prepare(vq->vq);
> spin_unlock_irqrestore(&vq->lock, flags);
>
> - return kick;
> + if (kick)
> + virtqueue_notify(vq->vq);
> }
>
> static void virtio_queue_rqs(struct request **rqlist)
> {
> - struct request *req, *next, *prev = NULL;
> + struct request *submit_list = NULL;
> struct request *requeue_list = NULL;
> + struct request **requeue_lastp = &requeue_list;
> + struct virtio_blk_vq *vq = NULL;
> + struct request *req;
>
> - rq_list_for_each_safe(rqlist, req, next) {
> - struct virtio_blk_vq *vq = get_virtio_blk_vq(req->mq_hctx);
> - bool kick;
> -
> - if (!virtblk_prep_rq_batch(req)) {
> - rq_list_move(rqlist, &requeue_list, req, prev);
> - req = prev;
> - if (!req)
> - continue;
> - }
> + while ((req = rq_list_pop(rqlist))) {
> + struct virtio_blk_vq *this_vq = get_virtio_blk_vq(req->mq_hctx);
>
> - if (!next || req->mq_hctx != next->mq_hctx) {
> - req->rq_next = NULL;
> - kick = virtblk_add_req_batch(vq, rqlist);
> - if (kick)
> - virtqueue_notify(vq->vq);
> + if (vq && vq != this_vq)
> + virtblk_add_req_batch(vq, &submit_list);
> + vq = this_vq;
>
> - *rqlist = next;
> - prev = NULL;
> - } else
> - prev = req;
> + if (virtblk_prep_rq_batch(req))
> + rq_list_add(&submit_list, req); /* reverse order */
> + else
> + rq_list_add_tail(&requeue_lastp, req);
> }
>
> + if (vq)
> + virtblk_add_req_batch(vq, &submit_list);
> *rqlist = requeue_list;
> }
looks ok from virtio POV
Acked-by: Michael S. Tsirkin <mst@redhat.com>
> --
> 2.45.2
next prev parent reply other threads:[~2024-11-13 23:25 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-11-13 15:20 don't reorder requests passed to ->queue_rqs Christoph Hellwig
2024-11-13 15:20 ` [PATCH 1/6] nvme-pci: reverse request order in nvme_queue_rqs Christoph Hellwig
2024-11-13 19:10 ` Keith Busch
2024-11-13 15:20 ` [PATCH 2/6] virtio_blk: reverse request order in virtio_queue_rqs Christoph Hellwig
2024-11-13 19:03 ` Keith Busch
2024-11-13 19:05 ` Jens Axboe
2024-11-13 23:25 ` Michael S. Tsirkin [this message]
2024-11-13 15:20 ` [PATCH 3/6] block: remove rq_list_move Christoph Hellwig
2024-11-13 15:20 ` [PATCH 4/6] block: add a rq_list type Christoph Hellwig
2024-11-14 20:11 ` Nathan Chancellor
2024-11-15 9:10 ` Christoph Hellwig
2024-11-15 12:49 ` Jens Axboe
2024-11-15 19:38 ` Jens Axboe
2024-11-16 0:56 ` Nathan Chancellor
2024-11-13 15:20 ` [PATCH 5/6] block: don't reorder requests in blk_add_rq_to_plug Christoph Hellwig
2024-11-13 15:20 ` [PATCH 6/6] block: don't reorder requests in blk_mq_add_to_batch Christoph Hellwig
2024-11-13 18:33 ` don't reorder requests passed to ->queue_rqs Bart Van Assche
2024-11-13 18:39 ` Jens Axboe
2024-11-13 18:46 ` Jens Axboe
2024-11-13 20:36 ` Chaitanya Kulkarni
2024-11-13 20:51 ` Jens Axboe
2024-11-13 22:23 ` Chaitanya Kulkarni
2024-11-13 22:27 ` Jens Axboe
2024-11-14 4:16 ` Christoph Hellwig
2024-11-14 15:14 ` Jens Axboe
2024-11-18 15:23 ` Christoph Hellwig
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=20241113182448-mutt-send-email-mst@kernel.org \
--to=mst@redhat.com \
--cc=asml.silence@gmail.com \
--cc=axboe@kernel.dk \
--cc=hch@lst.de \
--cc=io-uring@vger.kernel.org \
--cc=jasowang@redhat.com \
--cc=kbusch@kernel.org \
--cc=linux-block@vger.kernel.org \
--cc=linux-nvme@lists.infradead.org \
--cc=sagi@grimberg.me \
--cc=virtualization@lists.linux.dev \
/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.