From: Eric Blake <eblake@redhat.com>
To: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>,
qemu-block@nongnu.org
Cc: kwolf@redhat.com, fam@euphon.net, integration@gluster.org,
berto@igalia.com, pavel.dovgaluk@ispras.ru, dillaman@redhat.com,
qemu-devel@nongnu.org, sw@weilnetz.de, pl@kamp.de,
ronniesahlberg@gmail.com, mreitz@redhat.com, den@openvz.org,
sheepdog@lists.wpkg.org, stefanha@redhat.com,
namei.unix@gmail.com, pbonzini@redhat.com, jsnow@redhat.com,
ari@tuxera.com
Subject: Re: [PATCH v3 08/17] block/io: support int64_t bytes in bdrv_aligned_preadv()
Date: Fri, 22 May 2020 10:14:36 -0500 [thread overview]
Message-ID: <9143ff10-cba2-bcc2-c48c-eac73446b159@redhat.com> (raw)
In-Reply-To: <20200430111033.29980-9-vsementsov@virtuozzo.com>
On 4/30/20 6:10 AM, Vladimir Sementsov-Ogievskiy wrote:
> We are generally moving to int64_t for both offset and bytes parameters
> on all io paths.
>
> Main motivation is realization of 64-bit write_zeroes operation for
> fast zeroing large disk chunks, up to the whole disk.
>
> We chose signed type, to be consistent with off_t (which is signed) and
> with possibility for signed return type (where negative value means
> error).
>
> So, prepare bdrv_aligned_preadv() now.
>
> Make byte variable in bdrv_padding_rmw_read() int64_t, as it defined
> only to be passed to bdrv_aligned_preadv().
>
> Series: 64bit-block-status
> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
> ---
> block/io.c | 9 +++++----
> 1 file changed, 5 insertions(+), 4 deletions(-)
>
> diff --git a/block/io.c b/block/io.c
> index 6990d8cabe..d336e4e691 100644
> --- a/block/io.c
> +++ b/block/io.c
> @@ -1250,16 +1250,17 @@ err:
> * reads; any other features must be implemented by the caller.
> */
> static int coroutine_fn bdrv_aligned_preadv(BdrvChild *child,
> - BdrvTrackedRequest *req, int64_t offset, unsigned int bytes,
> + BdrvTrackedRequest *req, int64_t offset, int64_t bytes,
> int64_t align, QEMUIOVector *qiov, size_t qiov_offset, int flags)
> {
Callers:
bdrv_padding_rmw_read() - passes int64_t (uint64_t before this patch),
which in turn is bounded by request_alignment (still 32-bit) or
BdrvRequestPadding.buf_len (size_t, but also constrained by creation to
32-bit) - safe
bdrv_do_preadv_part() - passes unsigned int - safe
> BlockDriverState *bs = child->bs;
> int64_t total_bytes, max_bytes;
> int ret = 0;
> - uint64_t bytes_remaining = bytes;
> + int64_t bytes_remaining = bytes;
> int max_transfer;
>
> assert(is_power_of_2(align));
> + assert(offset >= 0 && bytes >= 0);
Use within the function:
the new assertion added here does not check for whether offset+bytes is
positive; I would suggest we strengthen it to instead be:
assert(offset >= 0 && (uint64_t) bytes <= INT64_MAX - offset);
ret = bdrv_is_allocated(bs, offset, bytes, &pnum);
- takes int64_t, safe
if (!ret || pnum != bytes) {
ret = bdrv_co_do_copy_on_readv(child, offset, bytes,
qiov, qiov_offset, flags);
- takes int64_t, safe
if (bytes <= max_bytes && bytes <= max_transfer) {
ret = bdrv_driver_preadv(bs, offset, bytes, qiov, qiov_offset, 0);
- takes int64_t, safe
> assert((offset & (align - 1)) == 0);
> assert((bytes & (align - 1)) == 0);
> assert((bs->open_flags & BDRV_O_NO_IO) == 0);
> @@ -1315,7 +1316,7 @@ static int coroutine_fn bdrv_aligned_preadv(BdrvChild *child,
> }
>
> while (bytes_remaining) {
> - int num;
> + int64_t num;
>
> if (max_bytes) {
> num = MIN(bytes_remaining, MIN(max_bytes, max_transfer));
- safe, bounded by max_transfer which is <= INT_MAX earlier in the
function
ret = bdrv_driver_preadv(bs, offset + bytes - bytes_remaining,
num, qiov, bytes -
bytes_remaining, 0);
- takes int64_t, and num is capped by max_transfer - safe
ret = qemu_iovec_memset(qiov, bytes - bytes_remaining, 0,
bytes_remaining);
- takes size_t, risky for 32-bit platforms. Works because we checked
that all our callers are still bounded by 32-bits, but we should
consider adding an assertion that bytes <= SIZE_MAX so that even when
our callers are updated in later patches, we know that we are still
fragmenting requests appropriately on 32-bit platforms
> @@ -1416,7 +1417,7 @@ static int bdrv_padding_rmw_read(BdrvChild *child,
> assert(req->serialising && pad->buf);
>
> if (pad->head || pad->merge_reads) {
> - uint64_t bytes = pad->merge_reads ? pad->buf_len : align;
> + int64_t bytes = pad->merge_reads ? pad->buf_len : align;
>
> qemu_iovec_init_buf(&local_qiov, pad->buf, bytes);
>
>
Preferably with the suggested assertions added,
Reviewed-by: Eric Blake <eblake@redhat.com>
--
Eric Blake, Principal Software Engineer
Red Hat, Inc. +1-919-301-3226
Virtualization: qemu.org | libvirt.org
next prev parent reply other threads:[~2020-05-22 15:16 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-04-30 11:10 [PATCH v3 00/17] 64bit block-layer Vladimir Sementsov-Ogievskiy
2020-04-30 11:10 ` [PATCH v3 01/17] block/throttle-groups: throttle_group_co_io_limits_intercept(): 64bit bytes Vladimir Sementsov-Ogievskiy
2020-05-11 15:28 ` Alberto Garcia
2020-04-30 11:10 ` [PATCH v3 02/17] block: use int64_t as bytes type in tracked requests Vladimir Sementsov-Ogievskiy
2020-05-11 15:32 ` Alberto Garcia
2020-05-22 19:09 ` Eric Blake
2020-04-30 11:10 ` [PATCH v3 03/17] block/io: use int64_t bytes parameter in bdrv_check_byte_request() Vladimir Sementsov-Ogievskiy
2020-05-11 15:57 ` Alberto Garcia
2020-04-30 11:10 ` [PATCH v3 04/17] block/io: use int64_t bytes in driver wrappers Vladimir Sementsov-Ogievskiy
2020-05-11 16:30 ` Alberto Garcia
2020-04-30 11:10 ` [PATCH v3 05/17] block/io: support int64_t bytes in bdrv_co_do_pwrite_zeroes() Vladimir Sementsov-Ogievskiy
2020-05-08 18:20 ` Eric Blake
2020-05-11 17:17 ` Alberto Garcia
2020-05-11 18:34 ` Eric Blake
2020-06-23 10:20 ` Vladimir Sementsov-Ogievskiy
2020-06-23 16:37 ` Eric Blake
2020-04-30 11:10 ` [PATCH v3 06/17] block/io: support int64_t bytes in bdrv_aligned_pwritev() Vladimir Sementsov-Ogievskiy
2020-05-08 20:38 ` Eric Blake
2020-06-18 14:29 ` Alberto Garcia
2020-04-30 11:10 ` [PATCH v3 07/17] block/io: support int64_t bytes in bdrv_co_do_copy_on_readv() Vladimir Sementsov-Ogievskiy
2020-05-21 22:29 ` Eric Blake
2020-05-22 6:30 ` Vladimir Sementsov-Ogievskiy
2020-04-30 11:10 ` [PATCH v3 08/17] block/io: support int64_t bytes in bdrv_aligned_preadv() Vladimir Sementsov-Ogievskiy
2020-05-22 15:14 ` Eric Blake [this message]
2020-06-18 14:35 ` Alberto Garcia
2020-06-18 14:47 ` Eric Blake
2020-04-30 11:10 ` [PATCH v3 09/17] block/io: support int64_t bytes in bdrv_co_p{read, write}v_part() Vladimir Sementsov-Ogievskiy
2020-05-22 19:34 ` [PATCH v3 09/17] block/io: support int64_t bytes in bdrv_co_p{read,write}v_part() Eric Blake
2020-04-30 11:10 ` [PATCH v3 10/17] block/io: support int64_t bytes in read/write wrappers Vladimir Sementsov-Ogievskiy
2020-04-30 11:10 ` [PATCH v3 11/17] block/io: use int64_t bytes in copy_range Vladimir Sementsov-Ogievskiy
2020-04-30 11:10 ` [PATCH v3 12/17] block/block-backend: convert blk io path to use int64_t parameters Vladimir Sementsov-Ogievskiy
2020-06-23 22:11 ` Eric Blake
2020-04-30 11:10 ` [PATCH v3 13/17] block: use int64_t instead of uint64_t in driver read handlers Vladimir Sementsov-Ogievskiy
2020-04-30 11:10 ` [PATCH v3 14/17] block: use int64_t instead of uint64_t in driver write handlers Vladimir Sementsov-Ogievskiy
2020-04-30 11:10 ` [PATCH v3 15/17] block: use int64_t instead of uint64_t in copy_range driver handlers Vladimir Sementsov-Ogievskiy
2020-04-30 11:10 ` [PATCH v3 16/17] block: use int64_t instead of int in driver write_zeroes handlers Vladimir Sementsov-Ogievskiy
2020-04-30 11:10 ` [PATCH v3 17/17] block: use int64_t instead of int in driver discard handlers Vladimir Sementsov-Ogievskiy
2020-05-06 6:40 ` Vladimir Sementsov-Ogievskiy
2020-04-30 20:51 ` [PATCH v3 00/17] 64bit block-layer no-reply
2020-05-06 6:39 ` Vladimir Sementsov-Ogievskiy
2020-04-30 20:57 ` no-reply
2020-12-01 16:07 ` Vladimir Sementsov-Ogievskiy
2020-12-01 16:56 ` Vladimir Sementsov-Ogievskiy
2020-12-01 21:50 ` Eric Blake
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=9143ff10-cba2-bcc2-c48c-eac73446b159@redhat.com \
--to=eblake@redhat.com \
--cc=ari@tuxera.com \
--cc=berto@igalia.com \
--cc=den@openvz.org \
--cc=dillaman@redhat.com \
--cc=fam@euphon.net \
--cc=integration@gluster.org \
--cc=jsnow@redhat.com \
--cc=kwolf@redhat.com \
--cc=mreitz@redhat.com \
--cc=namei.unix@gmail.com \
--cc=pavel.dovgaluk@ispras.ru \
--cc=pbonzini@redhat.com \
--cc=pl@kamp.de \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=ronniesahlberg@gmail.com \
--cc=sheepdog@lists.wpkg.org \
--cc=stefanha@redhat.com \
--cc=sw@weilnetz.de \
--cc=vsementsov@virtuozzo.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.