All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ming Lei <ming.lei@redhat.com>
To: Oleksandr Natalenko <oleksandr@natalenko.name>
Cc: linux-kernel@vger.kernel.org, Jens Axboe <axboe@fb.com>,
	Christoph Hellwig <hch@lst.de>, Sagi Grimberg <sagi@grimberg.me>,
	linux-nvme@lists.infradead.org,
	David Jeffery <djeffery@redhat.com>,
	Laurence Oberman <loberman@redhat.com>,
	Paolo Valente <paolo.valente@linaro.org>, Jan Kara <jack@suse.cz>,
	Sasha Levin <sashal@kernel.org>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Keith Busch <kbusch@kernel.org>
Subject: Re: New warning in nvme_setup_discard
Date: Fri, 16 Jul 2021 18:41:52 +0800	[thread overview]
Message-ID: <YPFicCW90Jse4oms@T590> (raw)
In-Reply-To: <2455133.St5lIfLNcX@natalenko.name>

On Fri, Jul 16, 2021 at 12:03:43PM +0200, Oleksandr Natalenko wrote:
> Hello.
> 
> On pátek 16. července 2021 11:33:05 CEST Ming Lei wrote:
> > Can you test the following patch?
> 
> Sure, building it at the moment, and will give it a try. Also please see my 
> comments and questions below.
> 
> > 
> > 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
> 
> I had to adjust this against v5.13 because there's no mq-deadline-main.c, only 
> mq-deadline.c (due to Bart series, I assume). I hope this is fine as the patch 
> applies cleanly.
> 
> > @@ -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);
> 
> Do I understand correctly that this will be something like:
> 
> Fixes: 2705dfb209 ("block: fix discard request merge")
> 
> ?
> 
> Because as the bisection progresses, I've bumped into this commit only. 
> Without it the issue is not reproducible, at least so far.

It could be.

So can you just test v5.14-rc1?


Thanks,
Ming


WARNING: multiple messages have this Message-ID (diff)
From: Ming Lei <ming.lei@redhat.com>
To: Oleksandr Natalenko <oleksandr@natalenko.name>
Cc: linux-kernel@vger.kernel.org, Jens Axboe <axboe@fb.com>,
	Christoph Hellwig <hch@lst.de>, Sagi Grimberg <sagi@grimberg.me>,
	linux-nvme@lists.infradead.org,
	David Jeffery <djeffery@redhat.com>,
	Laurence Oberman <loberman@redhat.com>,
	Paolo Valente <paolo.valente@linaro.org>, Jan Kara <jack@suse.cz>,
	Sasha Levin <sashal@kernel.org>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Keith Busch <kbusch@kernel.org>
Subject: Re: New warning in nvme_setup_discard
Date: Fri, 16 Jul 2021 18:41:52 +0800	[thread overview]
Message-ID: <YPFicCW90Jse4oms@T590> (raw)
In-Reply-To: <2455133.St5lIfLNcX@natalenko.name>

On Fri, Jul 16, 2021 at 12:03:43PM +0200, Oleksandr Natalenko wrote:
> Hello.
> 
> On pátek 16. července 2021 11:33:05 CEST Ming Lei wrote:
> > Can you test the following patch?
> 
> Sure, building it at the moment, and will give it a try. Also please see my 
> comments and questions below.
> 
> > 
> > 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
> 
> I had to adjust this against v5.13 because there's no mq-deadline-main.c, only 
> mq-deadline.c (due to Bart series, I assume). I hope this is fine as the patch 
> applies cleanly.
> 
> > @@ -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);
> 
> Do I understand correctly that this will be something like:
> 
> Fixes: 2705dfb209 ("block: fix discard request merge")
> 
> ?
> 
> Because as the bisection progresses, I've bumped into this commit only. 
> Without it the issue is not reproducible, at least so far.

It could be.

So can you just test v5.14-rc1?


Thanks,
Ming


_______________________________________________
Linux-nvme mailing list
Linux-nvme@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-nvme

  reply	other threads:[~2021-07-16 10:42 UTC|newest]

Thread overview: 52+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-07-15 13:56 New warning in nvme_setup_discard Oleksandr Natalenko
2021-07-15 13:56 ` Oleksandr Natalenko
2021-07-15 14:19 ` Greg Kroah-Hartman
2021-07-15 14:19   ` Greg Kroah-Hartman
2021-07-15 14:21   ` Oleksandr Natalenko
2021-07-15 14:21     ` Oleksandr Natalenko
2021-07-15 21:37   ` Laurence Oberman
2021-07-15 21:37     ` Laurence Oberman
2021-07-16  5:50     ` Oleksandr Natalenko
2021-07-16  5:50       ` Oleksandr Natalenko
2021-07-16  2:16 ` Ming Lei
2021-07-16  2:16   ` Ming Lei
2021-07-16  5:53   ` Oleksandr Natalenko
2021-07-16  5:53     ` Oleksandr Natalenko
2021-07-16  9:33     ` Ming Lei
2021-07-16  9:33       ` Ming Lei
2021-07-16 10:03       ` Oleksandr Natalenko
2021-07-16 10:03         ` Oleksandr Natalenko
2021-07-16 10:41         ` Ming Lei [this message]
2021-07-16 10:41           ` Ming Lei
2021-07-16 12:56           ` Oleksandr Natalenko
2021-07-16 12:56             ` Oleksandr Natalenko
2021-07-17  9:35             ` Ming Lei
2021-07-17  9:35               ` Ming Lei
2021-07-17 12:11               ` Oleksandr Natalenko
2021-07-17 12:11                 ` Oleksandr Natalenko
2021-07-17 12:19                 ` Oleksandr Natalenko
2021-07-17 12:19                   ` Oleksandr Natalenko
2021-07-17 12:35                   ` Oleksandr Natalenko
2021-07-17 12:35                     ` Oleksandr Natalenko
2021-07-19  1:40                     ` Ming Lei
2021-07-19  1:40                       ` Ming Lei
2021-07-19  6:27                       ` Oleksandr Natalenko
2021-07-19  6:27                         ` Oleksandr Natalenko
2021-07-20  9:05                         ` Oleksandr Natalenko
2021-07-20  9:05                           ` Oleksandr Natalenko
2021-07-21  8:00                           ` Ming Lei
2021-07-21  8:00                             ` Ming Lei
2021-07-27 15:12                             ` Oleksandr Natalenko
2021-07-27 15:12                               ` Oleksandr Natalenko
2021-07-27 15:58                               ` Ming Lei
2021-07-27 15:58                                 ` Ming Lei
2021-07-28 13:44                                 ` Oleksandr Natalenko
2021-07-28 13:44                                   ` Oleksandr Natalenko
2021-07-28 15:53                                   ` Ming Lei
2021-07-28 15:53                                     ` Ming Lei
2021-07-28 16:38                                     ` Oleksandr Natalenko
2021-07-28 16:38                                       ` Oleksandr Natalenko
2021-07-29  3:33                                       ` Ming Lei
2021-07-29  3:33                                         ` Ming Lei
2021-07-29  9:29                                         ` Ming Lei
2021-07-29  9:29                                           ` Ming Lei

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=YPFicCW90Jse4oms@T590 \
    --to=ming.lei@redhat.com \
    --cc=axboe@fb.com \
    --cc=djeffery@redhat.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=hch@lst.de \
    --cc=jack@suse.cz \
    --cc=kbusch@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-nvme@lists.infradead.org \
    --cc=loberman@redhat.com \
    --cc=oleksandr@natalenko.name \
    --cc=paolo.valente@linaro.org \
    --cc=sagi@grimberg.me \
    --cc=sashal@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.