All of lore.kernel.org
 help / color / mirror / Atom feed
From: Oleksandr Natalenko <oleksandr@natalenko.name>
To: Jens Axboe <axboe@kernel.dk>, Ming Lei <ming.lei@redhat.com>
Cc: linux-block@vger.kernel.org, Christoph Hellwig <hch@lst.de>,
	Ming Lei <ming.lei@redhat.com>
Subject: Re: [PATCH] block: return ELEVATOR_DISCARD_MERGE if possible
Date: Thu, 29 Jul 2021 09:17:28 +0200	[thread overview]
Message-ID: <67816551.sp8fIUDole@natalenko.name> (raw)
In-Reply-To: <20210729034226.1591070-1-ming.lei@redhat.com>

On čtvrtek 29. července 2021 5:42:26 CEST Ming Lei wrote:
> When merging one bio to request, if they are discard IO and the queue
> supports multi-range discard, we need to return ELEVATOR_DISCARD_MERGE
> because both block core and related drivers(nvme, virtio-blk) doesn't
> handle mixed discard io merge(traditional IO merge together with
> discard merge) well.
> 
> Fix the issue by returning ELEVATOR_DISCARD_MERGE in this situation,
> so both blk-mq and drivers just need to handle multi-range discard.
> 
> Reported-by: Oleksandr Natalenko <oleksandr@natalenko.name>
> Signed-off-by: Ming Lei <ming.lei@redhat.com>
> ---
>  block/bfq-iosched.c      |  3 +++
>  block/blk-merge.c        | 16 ----------------
>  block/elevator.c         |  3 +++
>  block/mq-deadline-main.c |  2 ++
>  include/linux/blkdev.h   | 16 ++++++++++++++++
>  5 files changed, 24 insertions(+), 16 deletions(-)
> 
> diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c
> index 727955918563..673a634eadd9 100644
> --- a/block/bfq-iosched.c
> +++ b/block/bfq-iosched.c
> @@ -2361,6 +2361,9 @@ static int bfq_request_merge(struct request_queue *q,
> struct request **req, __rq = bfq_find_rq_fmerge(bfqd, bio, q);
>  	if (__rq && elv_bio_merge_ok(__rq, bio)) {
>  		*req = __rq;
> +
> +		if (blk_discard_mergable(__rq))
> +			return ELEVATOR_DISCARD_MERGE;
>  		return ELEVATOR_FRONT_MERGE;
>  	}
> 
> diff --git a/block/blk-merge.c b/block/blk-merge.c
> index a11b3b53717e..f8707ff7e2fc 100644
> --- a/block/blk-merge.c
> +++ b/block/blk-merge.c
> @@ -705,22 +705,6 @@ static void blk_account_io_merge_request(struct request
> *req) }
>  }
> 
> -/*
> - * Two cases of handling DISCARD merge:
> - * If max_discard_segments > 1, the driver takes every bio
> - * as a range and send them to controller together. The ranges
> - * needn't to be contiguous.
> - * Otherwise, the bios/requests will be handled as same as
> - * others which should be contiguous.
> - */
> -static inline bool blk_discard_mergable(struct request *req)
> -{
> -	if (req_op(req) == REQ_OP_DISCARD &&
> -	    queue_max_discard_segments(req->q) > 1)
> -		return true;
> -	return false;
> -}
> -
>  static enum elv_merge blk_try_req_merge(struct request *req,
>  					struct request *next)
>  {
> diff --git a/block/elevator.c b/block/elevator.c
> index 52ada14cfe45..a5fe2615ec0f 100644
> --- a/block/elevator.c
> +++ b/block/elevator.c
> @@ -336,6 +336,9 @@ enum elv_merge elv_merge(struct request_queue *q, struct
> request **req, __rq = elv_rqhash_find(q, bio->bi_iter.bi_sector);
>  	if (__rq && elv_bio_merge_ok(__rq, bio)) {
>  		*req = __rq;
> +
> +		if (blk_discard_mergable(__rq))
> +			return ELEVATOR_DISCARD_MERGE;
>  		return ELEVATOR_BACK_MERGE;
>  	}
> 
> diff --git a/block/mq-deadline-main.c b/block/mq-deadline-main.c
> index 6f612e6dc82b..294be0c0db65 100644
> --- a/block/mq-deadline-main.c
> +++ b/block/mq-deadline-main.c
> @@ -677,6 +677,8 @@ static int dd_request_merge(struct request_queue *q,
> struct request **rq,
> 
>  		if (elv_bio_merge_ok(__rq, bio)) {
>  			*rq = __rq;
> +			if (blk_discard_mergable(__rq))
> +				return ELEVATOR_DISCARD_MERGE;
>  			return ELEVATOR_FRONT_MERGE;
>  		}
>  	}
> diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
> index 3177181c4326..87f00292fd7a 100644
> --- a/include/linux/blkdev.h
> +++ b/include/linux/blkdev.h
> @@ -1521,6 +1521,22 @@ static inline int
> queue_limit_discard_alignment(struct queue_limits *lim, sector return
> offset << SECTOR_SHIFT;
>  }
> 
> +/*
> + * Two cases of handling DISCARD merge:
> + * If max_discard_segments > 1, the driver takes every bio
> + * as a range and send them to controller together. The ranges
> + * needn't to be contiguous.
> + * Otherwise, the bios/requests will be handled as same as
> + * others which should be contiguous.
> + */
> +static inline bool blk_discard_mergable(struct request *req)
> +{
> +	if (req_op(req) == REQ_OP_DISCARD &&
> +	    queue_max_discard_segments(req->q) > 1)
> +		return true;
> +	return false;
> +}
> +
>  static inline int bdev_discard_alignment(struct block_device *bdev)
>  {
>  	struct request_queue *q = bdev_get_queue(bdev);

Tested-by: Oleksandr Natalenko <oleksandr@natalenko.name>

Also,

Fixes: ?

and possibly:

CC: stable@ # v5.x?

Thanks.

-- 
Oleksandr Natalenko (post-factum)



  reply	other threads:[~2021-07-29  7:17 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-07-29  3:42 [PATCH] block: return ELEVATOR_DISCARD_MERGE if possible Ming Lei
2021-07-29  7:17 ` Oleksandr Natalenko [this message]
2021-07-29  9:18   ` Ming Lei
2021-08-05  3:35 ` Ming Lei
2021-08-09 20:30   ` Oleksandr Natalenko
2021-08-09 20:36   ` Jens Axboe
2021-08-10  2:47     ` Ming Lei
2021-08-10  2:55       ` Jens Axboe
2021-08-10  3:28         ` Ming Lei
2022-05-21 18:56 Gwendal Grignou
2022-05-23 15:13 ` Greg KH

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=67816551.sp8fIUDole@natalenko.name \
    --to=oleksandr@natalenko.name \
    --cc=axboe@kernel.dk \
    --cc=hch@lst.de \
    --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 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.