Fam Zheng c6ac36e145 vmdk: Optimize cluster allocation
This drops the unnecessary bdrv_truncate() from, and also improves,
cluster allocation code path.

Before, when we need a new cluster, get_cluster_offset truncates the
image to bdrv_getlength() + cluster_size, and returns the offset of
added area, i.e. the image length before truncating.

This is not efficient, so it's now rewritten as:

  - Save the extent file length when opening.

  - When allocating cluster, use the saved length as cluster offset.

  - Don't truncate image, because we'll anyway write data there: just
    write any data at the EOF position, in descending priority:

    * New user data (cluster allocation happens in a write request).

    * Filling data in the beginning and/or ending of the new cluster, if
      not covered by user data: either backing file content (COW), or
      zero for standalone images.

One major benifit of this change is, on host mounted NFS images, even
over a fast network, ftruncate is slow (see the example below). This
change significantly speeds up cluster allocation. Comparing by
converting a cirros image (296M) to VMDK on an NFS mount point, over
1Gbe LAN:

    $ time qemu-img convert cirros-0.3.1.img /mnt/a.raw -O vmdk

    Before:
        real    0m21.796s
        user    0m0.130s
        sys     0m0.483s

    After:
        real    0m2.017s
        user    0m0.047s
        sys     0m0.190s

We also get rid of unchecked bdrv_getlength() and bdrv_truncate(), and
get a little more documentation in function comments.

Tested that this passes qemu-iotests for all VMDK subformats.

Signed-off-by: Fam Zheng <famz@redhat.com>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
2014-08-15 15:07:14 +02:00
2014-08-15 15:07:14 +02:00
2013-04-18 13:50:53 +02:00
2014-06-23 11:00:12 -04:00
2014-08-15 15:07:12 +02:00
2014-07-08 15:08:03 +02:00
2014-07-29 13:23:33 +01:00
2014-07-18 17:45:37 +04:00
2014-06-05 16:10:33 +02:00
2014-06-29 18:59:06 +03:00
2014-06-05 16:10:33 +02:00
2014-07-25 09:43:31 +02:00
2012-09-07 09:02:44 +03:00
2014-06-27 09:27:55 -04:00
2014-06-16 13:24:35 +02:00
2013-09-05 09:40:31 -05:00
2014-06-09 15:43:40 +02:00
2014-07-09 15:50:11 +02:00
2014-07-09 15:50:11 +02:00
2014-06-23 11:12:28 -04:00
2013-10-11 09:34:56 -07:00
2014-06-23 11:01:25 -04:00
2014-06-05 16:10:33 +02:00
2014-07-14 12:03:21 +02:00
2013-07-23 02:41:31 +02:00
2014-06-19 18:44:21 +03:00
2014-06-19 16:41:54 +03:00
2013-08-12 09:15:12 -05:00
2014-06-23 11:01:25 -04:00
2013-09-03 12:25:55 +02:00
2014-06-23 19:09:50 +02:00
2014-06-30 12:50:17 +02:00
2014-07-06 09:13:53 +03:00
2014-03-13 14:34:16 +00:00
2014-07-07 09:15:29 +02:00
2014-06-09 15:43:40 +02:00
2014-05-24 00:07:29 +04:00
2013-10-11 09:34:56 -07:00
2014-02-17 11:57:23 -05:00
2014-06-05 16:10:33 +02:00
2014-08-01 18:30:08 +01:00
2013-10-11 09:34:56 -07:00
2014-05-07 16:16:43 +00:00
2014-08-01 15:57:28 +00:00
2014-07-07 10:37:40 +00:00

Read the documentation in qemu-doc.html or on http://wiki.qemu-project.org

- QEMU team
Description
A fork of QEMU-Nyx which is better suited for my bachelors thesis
Readme 154 MiB
Languages
C 90.3%
Dylan 2.5%
Python 2.1%
C++ 2%
Shell 1.7%
Other 1.4%