All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alberto Garcia <berto@igalia.com>
To: qemu-devel@nongnu.org
Cc: qemu-block@nongnu.org, Max Reitz <mreitz@redhat.com>,
	Kevin Wolf <kwolf@redhat.com>, "Denis V . Lunev" <den@openvz.org>,
	Alberto Garcia <berto@igalia.com>
Subject: [Qemu-devel] [PATCH 00/31] Allow configuring the qcow2 L2 cache entry size
Date: Thu, 12 Oct 2017 16:05:14 +0300	[thread overview]
Message-ID: <cover.1507813391.git.berto@igalia.com> (raw)

Hello all,

in September I sent an e-mail with a proposal to allow reducing the
size of entries in the qcow2 L2 cache in order to improve performance
and make a more efficient use of the cache memory. You can follow this
link for the full details:

   https://lists.gnu.org/archive/html/qemu-block/2017-09/msg00635.html

This series is the implementation of this feature. It adds a new
parameter for the qcow2 driver named l2-cache-entry-size (related to
the existing l2-cache-size). With this, the qcow2 driver no longer
needs to read full L2 tables for cluster lookups but smaller chunks
which I call L2 slices, following John Snow's suggestion.

The L2 slice size has the same restrictions as the cluster size: it
has to be a power of wo between 512 bytes and the image's cluster
size.

I tried to be conservative in general so the slice size is equal to
the cluster size by default (i.e. there should be no user-visible
changes if you don't enable this). I believe that 4KB is probably the
best default, but I'd like to test a bit with different scenarios and
cluster sizes, and we can decide on a default value in the next
revision of the series, or later.

About the patches themselves, please do not be discouraged by the size
of the series :) Many of the changes are trivial and don't introduce
any semantic changes but instead simply rename variable names or
remove obsolete parameters. The patches that do introduce semantic
changes are -I believe- easy to follow. The ones that seem more
complicated are because they have a new nested loop. I suggest that
you read them with 'diff -w' in order to hide the effects of the
indentation changes.

I also tried to keep each patch touching one single function. The
nature of the changes allows for that, and should make the code easier
to review.

Here's a general overview of the series:

- Patch 1 is a documentation fix.
- Patch 2 adds a field to Qcow2Cache to store the table size.
- Patches 3-11 remove obsolete BDS parameters from the API as a result
  of the changes in patch 2.
- Patches 12-14 add new auxiliary functions to calculate offsets.
- Patches 15-26 update existing functions to handle L2 slices
  correctly (the important part of the series is here).
- Patches 27-30 rename variables but don't change semantics.
- Patch 31 adds the new l2-cache-entry-size parameter.

As usual, feedback is very welcome.

Thanks in advance,

Berto

Alberto Garcia (31):
  qcow2: Fix documentation of get_cluster_table()
  qcow2: Add table size field to Qcow2Cache
  qcow2: Remove BDS parameter from qcow2_cache_get_table_addr()
  qcow2: Remove BDS parameter from qcow2_cache_get_table_idx()
  qcow2: Remove BDS parameter from qcow2_cache_table_release()
  qcow2: Remove BDS parameter from qcow2_cache_entry_mark_dirty()
  qcow2: Remove BDS parameter from qcow2_cache_put()
  qcow2: Remove BDS parameter from qcow2_cache_destroy()
  qcow2: Remove BDS parameter from qcow2_cache_clean_unused()
  qcow2: Remove BDS parameter from qcow2_cache_discard()
  qcow2: Remove BDS parameter from qcow2_cache_is_table_offset()
  qcow2: Add offset_to_l1_index()
  qcow2: Add l2_slice_size field to BDRVQcow2State
  qcow2: Add offset_to_l2_slice_index()
  qcow2: Update l2_load() to support L2 slices
  qcow2: Update l2_allocate() to support L2 slices
  qcow2: Update get_cluster_table() to support L2 slices
  qcow2: Update qcow2_get_cluster_offset() to support L2 slices
  qcow2: Update qcow2_alloc_cluster_link_l2() to support L2 slices
  qcow2: Update handle_copied() to support L2 slices
  qcow2: Update handle_alloc() to support L2 slices
  qcow2: Update discard_single_l2() to support L2 slices
  qcow2: Update zero_single_l2() to support L2 slices
  qcow2: Update qcow2_update_snapshot_refcount() to support L2 slices
  qcow2: Update expand_zero_clusters_in_l1() to support L2 slices
  qcow2: Update qcow2_truncate() to support L2 slices
  qcow2: Rename l2_table in qcow2_alloc_compressed_cluster_offset()
  qcow2: Rename l2_table in count_contiguous_clusters()
  qcow2: Rename l2_table in count_contiguous_clusters_unallocated()
  qcow2: Rename l2_table in count_cow_clusters()
  qcow2: Allow configuring the L2 slice size

 block/qcow2-cache.c    |  78 ++++----
 block/qcow2-cluster.c  | 493 ++++++++++++++++++++++++++-----------------------
 block/qcow2-refcount.c | 200 ++++++++++----------
 block/qcow2.c          |  59 ++++--
 block/qcow2.h          |  29 ++-
 5 files changed, 469 insertions(+), 390 deletions(-)

-- 
2.11.0

             reply	other threads:[~2017-10-12 13:15 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-10-12 13:05 Alberto Garcia [this message]
2017-10-12 13:05 ` [Qemu-devel] [PATCH 01/31] qcow2: Fix documentation of get_cluster_table() Alberto Garcia
2017-10-12 13:05 ` [Qemu-devel] [PATCH 02/31] qcow2: Add table size field to Qcow2Cache Alberto Garcia
2017-10-12 13:05 ` [Qemu-devel] [PATCH 03/31] qcow2: Remove BDS parameter from qcow2_cache_get_table_addr() Alberto Garcia
2017-10-12 13:05 ` [Qemu-devel] [PATCH 04/31] qcow2: Remove BDS parameter from qcow2_cache_get_table_idx() Alberto Garcia
2017-10-12 13:05 ` [Qemu-devel] [PATCH 05/31] qcow2: Remove BDS parameter from qcow2_cache_table_release() Alberto Garcia
2017-10-12 13:05 ` [Qemu-devel] [PATCH 06/31] qcow2: Remove BDS parameter from qcow2_cache_entry_mark_dirty() Alberto Garcia
2017-10-12 13:05 ` [Qemu-devel] [PATCH 07/31] qcow2: Remove BDS parameter from qcow2_cache_put() Alberto Garcia
2017-10-12 13:05 ` [Qemu-devel] [PATCH 08/31] qcow2: Remove BDS parameter from qcow2_cache_destroy() Alberto Garcia
2017-10-12 13:05 ` [Qemu-devel] [PATCH 09/31] qcow2: Remove BDS parameter from qcow2_cache_clean_unused() Alberto Garcia
2017-10-12 13:05 ` [Qemu-devel] [PATCH 10/31] qcow2: Remove BDS parameter from qcow2_cache_discard() Alberto Garcia
2017-10-12 13:05 ` [Qemu-devel] [PATCH 11/31] qcow2: Remove BDS parameter from qcow2_cache_is_table_offset() Alberto Garcia
2017-10-12 13:05 ` [Qemu-devel] [PATCH 12/31] qcow2: Add offset_to_l1_index() Alberto Garcia
2017-10-12 13:05 ` [Qemu-devel] [PATCH 13/31] qcow2: Add l2_slice_size field to BDRVQcow2State Alberto Garcia
2017-10-12 13:05 ` [Qemu-devel] [PATCH 14/31] qcow2: Add offset_to_l2_slice_index() Alberto Garcia
2017-10-12 13:05 ` [Qemu-devel] [PATCH 15/31] qcow2: Update l2_load() to support L2 slices Alberto Garcia
2017-10-12 13:05 ` [Qemu-devel] [PATCH 16/31] qcow2: Update l2_allocate() " Alberto Garcia
2017-10-12 13:05 ` [Qemu-devel] [PATCH 17/31] qcow2: Update get_cluster_table() " Alberto Garcia
2017-10-12 13:05 ` [Qemu-devel] [PATCH 18/31] qcow2: Update qcow2_get_cluster_offset() " Alberto Garcia
2017-10-13 12:52   ` Alberto Garcia
2017-10-12 13:05 ` [Qemu-devel] [PATCH 19/31] qcow2: Update qcow2_alloc_cluster_link_l2() " Alberto Garcia
2017-10-12 13:05 ` [Qemu-devel] [PATCH 20/31] qcow2: Update handle_copied() " Alberto Garcia
2017-10-12 13:05 ` [Qemu-devel] [PATCH 21/31] qcow2: Update handle_alloc() " Alberto Garcia
2017-10-12 13:05 ` [Qemu-devel] [PATCH 22/31] qcow2: Update discard_single_l2() " Alberto Garcia
2017-10-12 13:05 ` [Qemu-devel] [PATCH 23/31] qcow2: Update zero_single_l2() " Alberto Garcia
2017-10-12 13:05 ` [Qemu-devel] [PATCH 24/31] qcow2: Update qcow2_update_snapshot_refcount() " Alberto Garcia
2017-10-12 13:05 ` [Qemu-devel] [PATCH 25/31] qcow2: Update expand_zero_clusters_in_l1() " Alberto Garcia
2017-10-12 13:05 ` [Qemu-devel] [PATCH 26/31] qcow2: Update qcow2_truncate() " Alberto Garcia
2017-10-12 13:05 ` [Qemu-devel] [PATCH 27/31] qcow2: Rename l2_table in qcow2_alloc_compressed_cluster_offset() Alberto Garcia
2017-10-12 13:05 ` [Qemu-devel] [PATCH 28/31] qcow2: Rename l2_table in count_contiguous_clusters() Alberto Garcia
2017-10-12 13:05 ` [Qemu-devel] [PATCH 29/31] qcow2: Rename l2_table in count_contiguous_clusters_unallocated() Alberto Garcia
2017-10-12 13:05 ` [Qemu-devel] [PATCH 30/31] qcow2: Rename l2_table in count_cow_clusters() Alberto Garcia
2017-10-12 13:05 ` [Qemu-devel] [PATCH 31/31] qcow2: Allow configuring the L2 slice size Alberto Garcia
2017-10-12 13:42 ` [Qemu-devel] [PATCH 00/31] Allow configuring the qcow2 L2 cache entry size no-reply
2017-10-12 14:02 ` no-reply
2017-10-12 14:11   ` Eric Blake
2017-10-12 16:44     ` Fam Zheng

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=cover.1507813391.git.berto@igalia.com \
    --to=berto@igalia.com \
    --cc=den@openvz.org \
    --cc=kwolf@redhat.com \
    --cc=mreitz@redhat.com \
    --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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.