qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Kevin Wolf <kwolf@redhat.com>
To: qemu-block@nongnu.org
Cc: kwolf@redhat.com, peter.maydell@linaro.org, qemu-devel@nongnu.org
Subject: [Qemu-devel] [PULL 01/22] qcow2: Fix the calculation of the maximum L2 cache size
Date: Thu, 12 Sep 2019 15:45:43 +0200	[thread overview]
Message-ID: <20190912134604.22019-2-kwolf@redhat.com> (raw)
In-Reply-To: <20190912134604.22019-1-kwolf@redhat.com>

From: Alberto Garcia <berto@igalia.com>

The size of the qcow2 L2 cache defaults to 32 MB, which can be easily
larger than the maximum amount of L2 metadata that the image can have.
For example: with 64 KB clusters the user would need a qcow2 image
with a virtual size of 256 GB in order to have 32 MB of L2 metadata.

Because of that, since commit b749562d9822d14ef69c9eaa5f85903010b86c30
we forbid the L2 cache to become larger than the maximum amount of L2
metadata for the image, calculated using this formula:

    uint64_t max_l2_cache = virtual_disk_size / (s->cluster_size / 8);

The problem with this formula is that the result should be rounded up
to the cluster size because an L2 table on disk always takes one full
cluster.

For example, a 1280 MB qcow2 image with 64 KB clusters needs exactly
160 KB of L2 metadata, but we need 192 KB on disk (3 clusters) even if
the last 32 KB of those are not going to be used.

However QEMU rounds the numbers down and only creates 2 cache tables
(128 KB), which is not enough for the image.

A quick test doing 4KB random writes on a 1280 MB image gives me
around 500 IOPS, while with the correct cache size I get 16K IOPS.

Cc: qemu-stable@nongnu.org
Signed-off-by: Alberto Garcia <berto@igalia.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
 block/qcow2.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/block/qcow2.c b/block/qcow2.c
index 0882ff6e92..57734f20cf 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -828,7 +828,11 @@ static void read_cache_sizes(BlockDriverState *bs, QemuOpts *opts,
     bool l2_cache_entry_size_set;
     int min_refcount_cache = MIN_REFCOUNT_CACHE_SIZE * s->cluster_size;
     uint64_t virtual_disk_size = bs->total_sectors * BDRV_SECTOR_SIZE;
-    uint64_t max_l2_cache = virtual_disk_size / (s->cluster_size / 8);
+    uint64_t max_l2_entries = DIV_ROUND_UP(virtual_disk_size, s->cluster_size);
+    /* An L2 table is always one cluster in size so the max cache size
+     * should be a multiple of the cluster size. */
+    uint64_t max_l2_cache = ROUND_UP(max_l2_entries * sizeof(uint64_t),
+                                     s->cluster_size);
 
     combined_cache_size_set = qemu_opt_get(opts, QCOW2_OPT_CACHE_SIZE);
     l2_cache_size_set = qemu_opt_get(opts, QCOW2_OPT_L2_CACHE_SIZE);
-- 
2.20.1



  reply	other threads:[~2019-09-12 13:49 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-09-12 13:45 [Qemu-devel] [PULL 00/22] Block layer patches Kevin Wolf
2019-09-12 13:45 ` Kevin Wolf [this message]
2019-09-12 13:45 ` [Qemu-devel] [PULL 02/22] job: drop job_drain Kevin Wolf
2019-09-12 13:45 ` [Qemu-devel] [PULL 03/22] block/file-posix: Reduce xfsctl() use Kevin Wolf
2019-09-12 13:45 ` [Qemu-devel] [PULL 04/22] iotests: Test reverse sub-cluster qcow2 writes Kevin Wolf
2019-09-12 13:45 ` [Qemu-devel] [PULL 05/22] pr-manager: Fix invalid g_free() crash bug Kevin Wolf
2019-09-12 13:45 ` [Qemu-devel] [PULL 06/22] file-posix: Fix has_write_zeroes after NO_FALLBACK Kevin Wolf
2019-09-12 13:45 ` [Qemu-devel] [PULL 07/22] vpc: Return 0 from vpc_co_create() on success Kevin Wolf
2019-09-12 13:45 ` [Qemu-devel] [PULL 08/22] iotests: Add supported protocols to execute_test() Kevin Wolf
2019-09-12 13:45 ` [Qemu-devel] [PULL 09/22] iotests: Restrict file Python tests to file Kevin Wolf
2019-09-12 13:45 ` [Qemu-devel] [PULL 10/22] iotests: Restrict nbd Python tests to nbd Kevin Wolf
2019-09-12 13:45 ` [Qemu-devel] [PULL 11/22] iotests: Test blockdev-create for vpc Kevin Wolf
2019-09-12 13:45 ` [Qemu-devel] [PULL 12/22] iotests: skip 232 when run tests as root Kevin Wolf
2019-09-12 13:45 ` [Qemu-devel] [PULL 13/22] block/nfs: add support for nfs_umount Kevin Wolf
2019-09-12 13:45 ` [Qemu-devel] [PULL 14/22] iotests: allow Valgrind checking all QEMU processes Kevin Wolf
2019-09-12 13:45 ` [Qemu-devel] [PULL 15/22] iotests: exclude killed processes from running under Valgrind Kevin Wolf
2019-09-12 13:45 ` [Qemu-devel] [PULL 16/22] iotests: Add casenotrun report to bash tests Kevin Wolf
2019-09-12 13:45 ` [Qemu-devel] [PULL 17/22] iotests: Valgrind fails with nonexistent directory Kevin Wolf
2019-09-12 13:46 ` [Qemu-devel] [PULL 18/22] iotests: extended timeout under Valgrind Kevin Wolf
2019-09-12 13:46 ` [Qemu-devel] [PULL 19/22] iotests: extend sleeping time " Kevin Wolf
2019-09-12 13:46 ` [Qemu-devel] [PULL 20/22] qemu-io: Don't leak pattern file in error path Kevin Wolf
2019-09-12 13:46 ` [Qemu-devel] [PULL 21/22] block/create: Do not abort if a block driver is not available Kevin Wolf
2019-09-12 13:46 ` [Qemu-devel] [PULL 22/22] qcow2: Stop overwriting compressed clusters one by one Kevin Wolf
2019-09-13 13:37 ` [Qemu-devel] [PULL 00/22] Block layer patches Peter Maydell

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=20190912134604.22019-2-kwolf@redhat.com \
    --to=kwolf@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    /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).