Thread (12 messages) 12 messages, 3 authors, 2021-06-22

Re: [PATCH 2/2] block: support bio merge for multi-range discard

flat view

From: Ming Lei <hidden>
Date: 2021-06-09 06:12:50

On Wed, Jun 09, 2021 at 11:05:59AM +0800, Wang Shanker wrote:
quoted
2021年06月09日 08:45,Ming Lei [off-list ref] 写道:

So far multi-range discard treats each bio as one segment(range) of single
discard request. This way becomes not efficient if lots of small sized
discard bios are submitted, and one example is raid456.

Support bio merge for multi-range discard for improving lots of small
sized discard bios.

Turns out it is easy to support it:

1) always try to merge bio first

2) run into multi-range discard only if bio merge can't be done

3) add rq_for_each_discard_range() for retrieving each range(segment)
of discard request

Reported-by: Wang Shanker <redacted>
Signed-off-by: Ming Lei <redacted>
---
block/blk-merge.c          | 12 ++++-----
drivers/block/virtio_blk.c |  9 ++++---
drivers/nvme/host/core.c   |  8 +++---
include/linux/blkdev.h     | 51 ++++++++++++++++++++++++++++++++++++++
4 files changed, 66 insertions(+), 14 deletions(-)
diff --git a/block/blk-merge.c b/block/blk-merge.c
index bcdff1879c34..65210e9a8efa 100644
--- a/block/blk-merge.c
+++ b/block/blk-merge.c
@@ -724,10 +724,10 @@ static inline bool blk_discard_mergable(struct request *req)
static enum elv_merge blk_try_req_merge(struct request *req,
					struct request *next)
{
-	if (blk_discard_mergable(req))
-		return ELEVATOR_DISCARD_MERGE;
-	else if (blk_rq_pos(req) + blk_rq_sectors(req) == blk_rq_pos(next))
+	if (blk_rq_pos(req) + blk_rq_sectors(req) == blk_rq_pos(next))
		return ELEVATOR_BACK_MERGE;
+	else if (blk_discard_mergable(req))
Shall we adjust how req->nr_phys_segments is calculated in 
bio_attempt_discard_merge() so that multiple contiguous bio's can
be seen as one segment?
I think it isn't necessary, because we try to merge discard IOs first
just like plain IO. So when bio_attempt_discard_merge() is reached, it
means that IOs can't be merged, so req->nr_phys_segments should be
increased by 1.


Thanks,
Ming
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help