qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] do not lseek in qcow2 block_status
@ 2018-12-24 15:50 Vladimir Sementsov-Ogievskiy
  2018-12-24 20:42 ` [Qemu-devel] [Qemu-block] " Nir Soffer
  2019-01-07 12:52 ` [Qemu-devel] " Max Reitz
  0 siblings, 2 replies; 6+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2018-12-24 15:50 UTC (permalink / raw)
  To: qemu-devel, qemu block
  Cc: Max Reitz, Kevin Wolf, Paolo Bonzini, Fam Zheng, Stefan Hajnoczi,
	Eric Blake, Denis Lunev

Hi all!

bdrv_co_block_status digs bs->file for additional, more accurate search for hole
inside region, reported as DATA by bs since long-ago

   commit 5daa74a6ebce7543aaad178c4061dc087bb4c705
   Author: Paolo Bonzini <pbonzini@redhat.com>
   Date:   Wed Sep 4 19:00:38 2013 +0200

       block: look for zero blocks in bs->file

This accuracy is not free: assume we have qcow2 disk. Actually, qcow2 knows,
where are holes and where is data. But every block_status request calls lseek
additionally. Recently (and not the first time) we have faced the situation,
when lseek works slow. Of course, it is more about kernel implementation of it,
but why to involve lseek at all, if we have the information on qcow2 level?
Assume a big disk, full of data, in any iterative copying block job (or img
convert) we'll call lseek(HOLE) on every iteration, and each of these lseeks
will have to iterate through all metadata up to the end of file. It's obviously
ineffective behavior.

I'm thinking about, how to properly workaround this thing, and I have some
questions.

What are the cases, when we really need digging for zeros in bs->file?

Why in mirror we care about discard vs write_zeros, keeping in mind, that
block_status will return ZERO instead for unallocated regions in some cases, not
related to guest view of disk (bdrv_unallocated_blocks_are_zero, backing file is
smaller than request.start)?

And finally, what to do with the problem?

Obviously, the simplest thing is just revert 5daa74a. What will it break?

Otherwise, I need to "revert" it in some cases, and, may be, it should be a
user-defined parameter.. Should it?  And what are the cases? We need to "free"
of 5daa74a at least qcow2.. But again, should it be format-specific option, or
something more generic?

Then, if it would be separate parameter, how should it interfere with
want_zeros, or even, should it be want_zeros, reworked a bit to be want_lseek?

-- 
Best regards,
Vladimir

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2019-01-08 11:28 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-12-24 15:50 [Qemu-devel] do not lseek in qcow2 block_status Vladimir Sementsov-Ogievskiy
2018-12-24 20:42 ` [Qemu-devel] [Qemu-block] " Nir Soffer
2018-12-25  9:45   ` Vladimir Sementsov-Ogievskiy
2018-12-28 13:56     ` Paolo Bonzini
2019-01-07 12:52 ` [Qemu-devel] " Max Reitz
2019-01-08 11:28   ` Vladimir Sementsov-Ogievskiy

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).