On 2/5/20 3:25 AM, Vladimir Sementsov-Ogievskiy wrote:
3. For qcow2
Hmm. Here, as I understand, than main case is freshly created qcow2,
which is fully-unallocated. To understand that it is empty, we
need only to check all L1 entries. And for empty L1 table it is fast.
So we don't need any qcow2 format improvement to check it.
Ah yes, I forget about preallocated case. Hmm. For preallocated clusters,
we have zero bits in L2 entries. And with them, we even don't need
preallocated to be filled by zeros, as we never read them (but just return
zeros on read)..
Scanning all L2 entries is O(n), while an autoclear bit properly
maintained is O(1).
Then, may be we want similar flag for L1 entry (this will enable large
fast write-zero). And may be we want flag which marks the whole image
as read-zero (it's your flag). So, now I think, my previous idea
of "all allocated is zero" is worse. As for fully-preallocated images
we are sure that all clusters are allocated, and it is more native to
have flags similar to ZERO bit in L2 entry.
Right now, we don't have any L1 entry flags. Adding one would require
adding an incompatible feature flag (if older qemu would choke to see
unexpected flags in an L1 entry), or at best an autoclear feature flag
(if the autoclear bit gets cleared because an older qemu opened the
image and couldn't maintain L1 entry flags correctly, then newer qemu
knows it cannot trust those L1 entry flags). But as soon as you are
talking about adding a feature bit, then why add one that still requires
O(n) traversal to check (true, the 'n' in an O(n) traversal of L1 tables
is much smaller than the 'n' in an O(n) traversal of L2 tables), when
you can instead just add an O(1) autoclear bit that maintains all_zero
status for the image as a whole?
--
Eric Blake, Principal Software Engineer
Red Hat, Inc. +1-919-301-3226
Virtualization: qemu.org | libvirt.org