Skip to contentSkip to conversation

block: add plug for blkdev_issue_discard

PATCH In review Shaohua Li 3 participants 3 messages Oct 9, 2012 Block layer

lore
Share & tools
lore

Shaohua Li

author
#0 lore raw

PATCH 1/1 block: add plug for blkdev_issue_discard

Now discard merge works, add plug for blkdev_issue_discard. This will help discard request merge especially for raid0 case. In raid0, a big discard request is split to small requests, and if correct plug is added, such small requests can be merged in low layer.

---
 block/blk-lib.c |    3 +++
 1 file changed, 3 insertions(+)
block/blk-lib.c +3 -0
Index: linux/block/blk-lib.c
===================================================================
@@ -48,6 +48,7 @@ int blkdev_issue_discard(struct block_de
 	struct bio_batch bb;
 	struct bio *bio;
 	int ret = 0;
+	struct blk_plug plug;
 
 	if (!q)
 		return -ENXIO;
@@ -81,6 +82,7 @@ int blkdev_issue_discard(struct block_de
 	bb.flags = 1 << BIO_UPTODATE;
 	bb.wait = &wait;
 
+	blk_start_plug(&plug);
 	while (nr_sects) {
 		unsigned int req_sects;
 		sector_t end_sect;
@@ -117,6 +119,7 @@ int blkdev_issue_discard(struct block_de
 		atomic_inc(&bb.done);
 		submit_bio(type, bio);
 	}
+	blk_finish_plug(&plug);
 
 	/* Wait for bios in-flight */
 	if (!atomic_dec_and_test(&bb.done))
#1 lore raw
Quoted 31 lines · Shaohua Li

Now discard merge works, add plug for blkdev_issue_discard. This will help discard request merge especially for raid0 case. In raid0, a big discard request is split to small requests, and if correct plug is added, such small requests can be merged in low layer.

---
 block/blk-lib.c |    3 +++
 1 file changed, 3 insertions(+)

Index: linux/block/blk-lib.c
===================================================================

block/blk-lib.c 2012-10-09 08:45:04.358598888 +0800 renamed from block/blk-lib.c 2012-09-28 15:09:38.655327319 +0800 +2 -0
@@ -48,6 +48,7 @@ int blkdev_issue_discard(struct block_de
        struct bio_batch bb;
        struct bio *bio;
        int ret = 0;
+       struct blk_plug plug;
 
        if (!q)
                return -ENXIO;
@@ -81,6 +82,7 @@ int blkdev_issue_discard(struct block_de
        bb.flags = 1 << BIO_UPTODATE;
        bb.wait = &wait;
 
+       blk_start_plug(&plug);
        while (nr_sects) {
                unsigned int req_sects;
                sector_t end_sect;

block/blk-lib.c 2012-10-09 08:45:04.358598888 +0800 int blkdev_issue_discard(struct block_de · line 125

Quoted 7 lines
block/blk-lib.c 2012-10-09 08:45:04.358598888 +0800 renamed from block/blk-lib.c 2012-09-28 15:09:38.655327319 +0800 +1 -0
@@ -117,6 +119,7 @@ int blkdev_issue_discard(struct block_de
                atomic_inc(&bb.done);
                submit_bio(type, bio);
        }
+       blk_finish_plug(&plug);
 
        /* Wait for bios in-flight */
        if (!atomic_dec_and_test(&bb.done))

That plug looks rather coarse-grained. Any adverse affects when mkfs discards an entire (large) raid0 device? (I suspect not but figured I'd ask)

maintainer
#2 lore raw
Quoted 37 lines · Mike Snitzer
Quoted 36 lines · Shaohua Li

Now discard merge works, add plug for blkdev_issue_discard. This will help discard request merge especially for raid0 case. In raid0, a big discard request is split to small requests, and if correct plug is added, such small requests can be merged in low layer.

---
 block/blk-lib.c |    3 +++
 1 file changed, 3 insertions(+)

Index: linux/block/blk-lib.c
===================================================================

block/blk-lib.c 2012-10-09 08:45:04.358598888 +0800 renamed from block/blk-lib.c 2012-09-28 15:09:38.655327319 +0800 +3 -0
@@ -48,6 +48,7 @@ int blkdev_issue_discard(struct block_de
        struct bio_batch bb;
        struct bio *bio;
        int ret = 0;
+       struct blk_plug plug;
 
        if (!q)
                return -ENXIO;
@@ -81,6 +82,7 @@ int blkdev_issue_discard(struct block_de
        bb.flags = 1 << BIO_UPTODATE;
        bb.wait = &wait;
 
+       blk_start_plug(&plug);
        while (nr_sects) {
                unsigned int req_sects;
                sector_t end_sect;
@@ -117,6 +119,7 @@ int blkdev_issue_discard(struct block_de
                atomic_inc(&bb.done);
                submit_bio(type, bio);
        }
+       blk_finish_plug(&plug);
 
Quoted 6 lines

block/blk-lib.c 2012-10-09 08:45:04.358598888 +0800 int blkdev_issue_discard(struct block_de · line 125

Quoted 2 lines
block/blk-lib.c 2012-10-09 08:45:04.358598888 +0800 renamed from block/blk-lib.c 2012-09-28 15:09:38.655327319 +0800 +0 -0
        /* Wait for bios in-flight */
        if (!atomic_dec_and_test(&bb.done))

That plug looks rather coarse-grained. Any adverse affects when mkfs discards an entire (large) raid0 device? (I suspect not but figured I'd ask)

Block core auto-unplugs after a certain depth is reached. So it's better to make it coarse than try to second guess when to unplug.

Signature · 1 line
Jens Axboe