On Mon, May 13, 2019 at 08:37:46AM +0200, Christoph Hellwig wrote:
> We currently fail to update the front/back segment size in the bio when
> deciding to allow an otherwise gappy segement to a device with a
> virt boundary.  The reason why this did not cause problems is that
> devices with a virt boundary fundamentally don't use segments as we
> know it and thus don't care.  Make that assumption formal by forcing
> an unlimited segement size in this case.
> 
> Signed-off-by: Christoph Hellwig <[email protected]>
> ---
>  block/blk-settings.c | 11 +++++++++++
>  1 file changed, 11 insertions(+)
> 
> diff --git a/block/blk-settings.c b/block/blk-settings.c
> index 3facc41476be..2ae348c101a0 100644
> --- a/block/blk-settings.c
> +++ b/block/blk-settings.c
> @@ -310,6 +310,9 @@ void blk_queue_max_segment_size(struct request_queue *q, 
> unsigned int max_size)
>                      __func__, max_size);
>       }
>  
> +     /* see blk_queue_virt_boundary() for the explanation */
> +     WARN_ON_ONCE(q->limits.virt_boundary_mask);
> +
>       q->limits.max_segment_size = max_size;
>  }
>  EXPORT_SYMBOL(blk_queue_max_segment_size);
> @@ -742,6 +745,14 @@ EXPORT_SYMBOL(blk_queue_segment_boundary);
>  void blk_queue_virt_boundary(struct request_queue *q, unsigned long mask)
>  {
>       q->limits.virt_boundary_mask = mask;
> +
> +     /*
> +      * Devices that require a virtual boundary do not support scatter/gather
> +      * I/O natively, but instead require a descriptor list entry for each
> +      * page (which might not be idential to the Linux PAGE_SIZE).  Because
> +      * of that they are not limited by our notion of "segment size".
> +      */
> +     q->limits.max_segment_size = UINT_MAX;
>  }
>  EXPORT_SYMBOL(blk_queue_virt_boundary);

All drivers which set virt boundary do not set max segment size, and
guess the DMA controller may partition data in unit of (virt_boundary +
1), so in theory this patch is correct.

Reviewed-by: Ming Lei <[email protected]>


Thanks,
Ming

Reply via email to