From: Max Reitz <mreitz@redhat.com>
To: Eric Blake <eblake@redhat.com>, qemu-devel@nongnu.org
Cc: Kevin Wolf <kwolf@redhat.com>, Peter Lieven <pl@kamp.de>,
Stefan Hajnoczi <stefanha@redhat.com>
Subject: Re: [Qemu-devel] [PATCH v2 06/21] qcow2: Helper for refcount array reallocation
Date: Mon, 17 Nov 2014 09:37:36 +0100 [thread overview]
Message-ID: <5469B3D0.5030108@redhat.com> (raw)
In-Reply-To: <54678444.8060009@redhat.com>
On 2014-11-15 at 17:50, Eric Blake wrote:
> On 11/14/2014 06:05 AM, Max Reitz wrote:
>> Add a helper function for reallocating a refcount array, independently
> s/independently/independent/
>
>> of the refcount order. The newly allocated space is zeroed and the
>> function handles failed reallocations gracefully.
> This patch is doing two things: it is refactoring things into a nice
> helper function (mentioned), AND it is adding a guarantee that you now
> always allocate a table on cluster boundaries, even when you aren't
> using the full table (hinted at elsewhere in the series, but noticeably
> absent here). I think you want to add more comments to the commit
> message making that more obvious, since it looks like you rely on that
> guarantee later.
Will do.
>> Signed-off-by: Max Reitz <mreitz@redhat.com>
>> ---
>> block/qcow2-refcount.c | 121 +++++++++++++++++++++++++++++--------------------
>> 1 file changed, 72 insertions(+), 49 deletions(-)
>>
>> +
>> +static int realloc_refcount_array(BDRVQcowState *s, uint16_t **array,
>> + int64_t *size, int64_t new_size)
> I think this function deserves a comment stating that *array is actually
> allocated to full cluster size with a 0 tail, so that it can be written
> straight to disk.
OK, will add a comment.
>> +{
>> + /* Round to clusters so the array can be directly written to disk */
>> + size_t old_byte_size = ROUND_UP(refcount_array_byte_size(s, *size),
>> + s->cluster_size);
>> + size_t new_byte_size = ROUND_UP(refcount_array_byte_size(s, new_size),
>> + s->cluster_size);
>> + uint16_t *new_ptr;
> Can old_byte_size ever equal new_byte_size? Or are we guaranteed that
> this will only be called when we really need to add another cluster to
> the reftable?
>
> [reading further]
>
> Yes, it looks like *size and new_size are not necessarily
> cluster-aligned, so as an example, it is very likely that we might call
> realloc_refcount_array with the existing size of 20 and a new size of
> 21, both of which fit within the same byte size when rounded up to
> cluster boundary. But that means that the realloc is a no-op in that
> case; might it be worth special-casing rather than wasting time on the
> g_try_realloc and no-op memset? [at least the code works correctly even
> without a special case shortcut]
Well, it's probably not necessary, but it will look most likely look
better to catch that case.
>> +
>> + new_ptr = g_try_realloc(*array, new_byte_size);
>> + if (new_byte_size && !new_ptr) {
>> + return -ENOMEM;
>> + }
> Is it worth asserting that new_byte_size is non-zero? Why would anyone
> ever call this to resize down to 0? (But I can see where you DO call it
> with old_byte_size of zero, when initializing data structures and using
> this function for the first allocation.)
Hm, considering every image that can be opened using the qcow2 driver
needs at least one cluster (the header), we can outrule that this is
called with new_size == 0 (which would be the only way new_byte_size
could ever be 0 either).
>> +
>> + if (new_ptr) {
> If we assert that new_byte_size is non-zero, then at this point, new_ptr
> is non-NULL and this condition is pointless.
>
>> + memset((void *)((uintptr_t)new_ptr + old_byte_size), 0,
>> + new_byte_size - old_byte_size);
>> + }
>> +
>> + *array = new_ptr;
>> + *size = new_size;
>> +
>> + return 0;
>> +}
>>
> Code looks correct as written, whether or not you also add more
> comments, asserts, and/or shortcuts for no-op situations. So:
>
> Reviewed-by: Eric Blake <eblake@redhat.com>
Thanks!
Max
next prev parent reply other threads:[~2014-11-17 8:37 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-11-14 13:05 [Qemu-devel] [PATCH v2 00/21] qcow2: Support refcount orders != 4 Max Reitz
2014-11-14 13:05 ` [Qemu-devel] [PATCH v2 01/21] qcow2: Add two new fields to BDRVQcowState Max Reitz
2014-11-14 13:05 ` [Qemu-devel] [PATCH v2 02/21] qcow2: Add refcount_width to format-specific info Max Reitz
2014-11-15 16:00 ` Eric Blake
2014-11-14 13:05 ` [Qemu-devel] [PATCH v2 03/21] qcow2: Use 64 bits for refcount values Max Reitz
2014-11-14 13:05 ` [Qemu-devel] [PATCH v2 04/21] qcow2: Respect error in qcow2_alloc_bytes() Max Reitz
2014-11-14 13:05 ` [Qemu-devel] [PATCH v2 05/21] qcow2: Refcount overflow and qcow2_alloc_bytes() Max Reitz
2014-11-14 13:05 ` [Qemu-devel] [PATCH v2 06/21] qcow2: Helper for refcount array reallocation Max Reitz
2014-11-15 16:50 ` Eric Blake
2014-11-17 8:37 ` Max Reitz [this message]
2014-11-14 13:06 ` [Qemu-devel] [PATCH v2 07/21] qcow2: Helper function for refcount modification Max Reitz
2014-11-15 17:02 ` Eric Blake
2014-11-17 8:42 ` Max Reitz
2014-11-14 13:06 ` [Qemu-devel] [PATCH v2 08/21] qcow2: More helpers " Max Reitz
2014-11-15 17:08 ` Eric Blake
2014-11-17 8:44 ` Max Reitz
2014-11-14 13:06 ` [Qemu-devel] [PATCH v2 09/21] qcow2: Open images with refcount order != 4 Max Reitz
2014-11-15 17:09 ` Eric Blake
2014-11-14 13:06 ` [Qemu-devel] [PATCH v2 10/21] qcow2: refcount_order parameter for qcow2_create2 Max Reitz
2014-11-15 17:13 ` Eric Blake
2014-11-14 13:06 ` [Qemu-devel] [PATCH v2 11/21] iotests: Prepare for refcount_width option Max Reitz
2014-11-15 17:17 ` Eric Blake
2014-11-14 13:06 ` [Qemu-devel] [PATCH v2 12/21] qcow2: Allow creation with refcount order != 4 Max Reitz
2014-11-14 13:06 ` [Qemu-devel] [PATCH v2 13/21] block: Add opaque value to the amend CB Max Reitz
2014-11-14 13:06 ` [Qemu-devel] [PATCH v2 14/21] qcow2: Use error_report() in qcow2_amend_options() Max Reitz
2014-11-14 13:06 ` [Qemu-devel] [PATCH v2 15/21] qcow2: Use abort() instead of assert(false) Max Reitz
2014-11-14 13:06 ` [Qemu-devel] [PATCH v2 16/21] qcow2: Split upgrade/downgrade paths for amend Max Reitz
2014-11-14 13:06 ` [Qemu-devel] [PATCH v2 17/21] qcow2: Use intermediate helper CB " Max Reitz
2014-11-14 13:06 ` [Qemu-devel] [PATCH v2 18/21] qcow2: Add function for refcount order amendment Max Reitz
2014-11-18 17:55 ` Eric Blake
2014-11-18 18:58 ` Max Reitz
2014-11-18 19:56 ` Eric Blake
2014-11-14 13:06 ` [Qemu-devel] [PATCH v2 19/21] qcow2: Invoke refcount order amendment function Max Reitz
2014-11-14 13:06 ` [Qemu-devel] [PATCH v2 20/21] qcow2: Point to amend function in check Max Reitz
2014-11-14 13:06 ` [Qemu-devel] [PATCH v2 21/21] iotests: Add test for different refcount widths Max Reitz
2014-11-15 14:50 ` Eric Blake
2014-11-17 8:34 ` Max Reitz
2014-11-17 10:38 ` Max Reitz
2014-11-17 11:02 ` Max Reitz
2014-11-17 12:06 ` Max Reitz
2014-11-18 20:26 ` Eric Blake
2014-11-19 5:52 ` Eric Blake
2014-11-20 14:03 ` Max Reitz
2014-11-20 21:21 ` Eric Blake
2014-11-20 13:48 ` Max Reitz
2014-11-20 21:27 ` 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=5469B3D0.5030108@redhat.com \
--to=mreitz@redhat.com \
--cc=eblake@redhat.com \
--cc=kwolf@redhat.com \
--cc=pl@kamp.de \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).