[PATCH 04/11] block-backend: align max_transfer to request alignment

Paolo Bonzini posted 11 patches 4 years, 7 months ago
Maintainers: Fam Zheng <fam@euphon.net>, Markus Armbruster <armbru@redhat.com>, Paolo Bonzini <pbonzini@redhat.com>, Eric Blake <eblake@redhat.com>, Max Reitz <mreitz@redhat.com>, Stefan Hajnoczi <stefanha@redhat.com>, Kevin Wolf <kwolf@redhat.com>
[PATCH 04/11] block-backend: align max_transfer to request alignment
Posted by Paolo Bonzini 4 years, 7 months ago
Block device requests must be aligned to bs->bl.request_alignment.
It makes sense for drivers to align bs->bl.max_transfer the same
way; however when there is no specified limit, blk_get_max_transfer
just returns INT_MAX.  Since the contract of the function does not
specify that INT_MAX means "no maximum", just align the outcome
of the function (whether INT_MAX or bs->bl.max_transfer) before
returning it.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 block/block-backend.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/block/block-backend.c b/block/block-backend.c
index 15f1ea4288..6e37582740 100644
--- a/block/block-backend.c
+++ b/block/block-backend.c
@@ -1957,12 +1957,12 @@ uint32_t blk_get_request_alignment(BlockBackend *blk)
 uint32_t blk_get_max_transfer(BlockBackend *blk)
 {
     BlockDriverState *bs = blk_bs(blk);
-    uint32_t max = 0;
+    uint32_t max = INT_MAX;
 
     if (bs) {
-        max = bs->bl.max_transfer;
+        max = MIN_NON_ZERO(max, bs->bl.max_transfer);
     }
-    return MIN_NON_ZERO(max, INT_MAX);
+    return ROUND_DOWN(max, blk_get_request_alignment(blk));
 }
 
 int blk_get_max_iov(BlockBackend *blk)
-- 
2.31.1



Re: [PATCH 04/11] block-backend: align max_transfer to request alignment
Posted by Max Reitz 4 years, 7 months ago
On 24.06.21 20:04, Paolo Bonzini wrote:
> Block device requests must be aligned to bs->bl.request_alignment.
> It makes sense for drivers to align bs->bl.max_transfer the same
> way; however when there is no specified limit, blk_get_max_transfer
> just returns INT_MAX.  Since the contract of the function does not
> specify that INT_MAX means "no maximum", just align the outcome
> of the function (whether INT_MAX or bs->bl.max_transfer) before
> returning it.
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
>   block/block-backend.c | 6 +++---
>   1 file changed, 3 insertions(+), 3 deletions(-)

Reviewed-by: Max Reitz <mreitz@redhat.com>