diff mbox

[01/10] block: make generic_make_request handle arbitrarily sized bios

Message ID 5549AFD4.5020803@kernel.org (mailing list archive)
State Superseded, archived
Delegated to: Mike Snitzer
Headers show

Commit Message

Ming Lin May 6, 2015, 6:08 a.m. UTC
On 04/28/2015 04:43 AM, Christoph Hellwig wrote:
> This seems to lack support for QUEUE_FLAG_SG_GAPS to work around
> the retarded PPR format in the NVMe driver.  I'm actually not
> sure we have a way to reproduce them for BLOCK_PC requests, but I think
> we should make sure to properly handle them.

How about below incremental patch?

 block/bio.c       | 8 --------
 block/blk-merge.c | 8 ++++++++
 2 files changed, 8 insertions(+), 8 deletions(-)


--
dm-devel mailing list
dm-devel@redhat.com
https://www.redhat.com/mailman/listinfo/dm-devel

Comments

Christoph Hellwig May 6, 2015, 6:48 a.m. UTC | #1
On Tue, May 05, 2015 at 11:08:20PM -0700, Ming Lin wrote:
> How about below incremental patch?

> -
> -		/*
> -		 * If the queue doesn't support SG gaps and adding this
> -		 * offset would create a gap, disallow it.
> -		 */
> -		if (q->queue_flags & (1 << QUEUE_FLAG_SG_GAPS) &&
> -		    bvec_gap_to_prev(prev, offset))
> -			return 0;

You need to keep the explicit checks for the BLOCK_PC case, as we can't
split those.

Otherwise it looks fine.

--
dm-devel mailing list
dm-devel@redhat.com
https://www.redhat.com/mailman/listinfo/dm-devel
Ming Lin May 6, 2015, 7:13 a.m. UTC | #2
On Tue, May 5, 2015 at 11:48 PM, Christoph Hellwig <hch@infradead.org> wrote:
> On Tue, May 05, 2015 at 11:08:20PM -0700, Ming Lin wrote:
>> How about below incremental patch?
>
>> -
>> -             /*
>> -              * If the queue doesn't support SG gaps and adding this
>> -              * offset would create a gap, disallow it.
>> -              */
>> -             if (q->queue_flags & (1 << QUEUE_FLAG_SG_GAPS) &&
>> -                 bvec_gap_to_prev(prev, offset))
>> -                     return 0;
>
> You need to keep the explicit checks for the BLOCK_PC case, as we can't
> split those.

I'll keep it. Thanks.

>
> Otherwise it looks fine.

--
dm-devel mailing list
dm-devel@redhat.com
https://www.redhat.com/mailman/listinfo/dm-devel
diff mbox

Patch

diff --git a/block/bio.c b/block/bio.c
index ae31cdb..3f6bd9a 100644
--- a/block/bio.c
+++ b/block/bio.c
@@ -743,14 +743,6 @@  int bio_add_pc_page(struct request_queue *q, struct bio *bio, struct page
 			bio->bi_iter.bi_size += len;
 			goto done;
 		}
-
-		/*
-		 * If the queue doesn't support SG gaps and adding this
-		 * offset would create a gap, disallow it.
-		 */
-		if (q->queue_flags & (1 << QUEUE_FLAG_SG_GAPS) &&
-		    bvec_gap_to_prev(prev, offset))
-			return 0;
 	}
 
 	if (bio->bi_vcnt >= bio->bi_max_vecs)
diff --git a/block/blk-merge.c b/block/blk-merge.c
index 9d565a0..32f6d6c 100644
--- a/block/blk-merge.c
+++ b/block/blk-merge.c
@@ -78,6 +78,14 @@  static struct bio *blk_bio_segment_split(struct request_queue *q,
 		if (sectors > queue_max_sectors(q))
 			goto split;
 
+		/*
+		 * If the queue doesn't support SG gaps and adding this
+		 * offset would create a gap, disallow it.
+		 */
+		if (q->queue_flags & (1 << QUEUE_FLAG_SG_GAPS) &&
+		    prev && bvec_gap_to_prev(&bvprv, bv.bv_offset))
+			goto split;
+
 		if (prev && blk_queue_cluster(q)) {
 			if (seg_size + bv.bv_len > queue_max_segment_size(q))
 				goto new_segment;