qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Jean-Louis Dupond <jean-louis@dupond.be>
To: Andrey Drobyshev <andrey.drobyshev@virtuozzo.com>, qemu-block@nongnu.org
Cc: qemu-devel@nongnu.org, hreitz@redhat.com, kwolf@redhat.com,
	eblake@redhat.com, stefanha@redhat.com, berto@igalia.com,
	den@virtuozzo.com
Subject: Re: [PATCH v3 03/12] qcow2: put discard requests in the common queue when discard-no-unref enabled
Date: Tue, 8 Apr 2025 09:34:07 +0200	[thread overview]
Message-ID: <263b1048-37bf-4149-a2ff-8f7fe59795b5@dupond.be> (raw)
In-Reply-To: <20240913163942.423050-4-andrey.drobyshev@virtuozzo.com>

Hi,

I hope this patchset can get merged soon, as it contains some good 
improvements.

Next to that, the change below only improves the performance on 
discards? It's not that something is broken/can cause issues in the 
current code?
Otherwise it might be a good idea to have this one merged as soon as 
possible.

Thanks for the work on this!

Jean-Louis

On 9/13/24 18:39, Andrey Drobyshev wrote:
> Normally discard requests are stored in the queue attached to BDRVQcow2State
> to be processed later at once.  Currently discard-no-unref option handling
> causes these requests to be processed straight away.  Let's fix that.
>
> Note that when doing regular discards qcow2_free_any_cluster() would check
> for the presence of external data files for us and redirect request to
> underlying data_file.  Here we want to do the same but avoid refcount updates,
> thus we perform the same checks.
>
> Suggested-by: Hanna Czenczek <hreitz@redhat.com>
> Signed-off-by: Andrey Drobyshev <andrey.drobyshev@virtuozzo.com>
> Reviewed-by: Alexander Ivanov <alexander.ivanov@virtuozzo.com>
> ---
>   block/qcow2-cluster.c | 39 +++++++++++++++++++++++++++++----------
>   1 file changed, 29 insertions(+), 10 deletions(-)
>
> diff --git a/block/qcow2-cluster.c b/block/qcow2-cluster.c
> index 5f057ba2fd..7dff0bd5a1 100644
> --- a/block/qcow2-cluster.c
> +++ b/block/qcow2-cluster.c
> @@ -1893,6 +1893,28 @@ again:
>       return 0;
>   }
>   
> +/*
> + * Helper for adding a discard request to the queue without any refcount
> + * modifications.  If external data file is used redirects the request to
> + * the corresponding BdrvChild.
> + */
> +static inline void
> +discard_no_unref_any_file(BlockDriverState *bs, uint64_t offset,
> +                          uint64_t length, QCow2ClusterType ctype,
> +                          enum qcow2_discard_type dtype)
> +{
> +    BDRVQcow2State *s = bs->opaque;
> +
> +    if (s->discard_passthrough[dtype] &&
> +        (ctype == QCOW2_CLUSTER_NORMAL || ctype == QCOW2_CLUSTER_ZERO_ALLOC)) {
> +        if (has_data_file(bs)) {
> +            bdrv_pdiscard(s->data_file, offset, length);
> +        } else {
> +            qcow2_queue_discard(bs, offset, length);
> +        }
> +    }
> +}
> +
>   /*
>    * This discards as many clusters of nb_clusters as possible at once (i.e.
>    * all clusters in the same L2 slice) and returns the number of discarded
> @@ -1974,12 +1996,10 @@ discard_in_l2_slice(BlockDriverState *bs, uint64_t offset, uint64_t nb_clusters,
>           if (!keep_reference) {
>               /* Then decrease the refcount */
>               qcow2_free_any_cluster(bs, old_l2_entry, type);
> -        } else if (s->discard_passthrough[type] &&
> -                   (cluster_type == QCOW2_CLUSTER_NORMAL ||
> -                    cluster_type == QCOW2_CLUSTER_ZERO_ALLOC)) {
> +        } else {
>               /* If we keep the reference, pass on the discard still */
> -            bdrv_pdiscard(s->data_file, old_l2_entry & L2E_OFFSET_MASK,
> -                          s->cluster_size);
> +            discard_no_unref_any_file(bs, old_l2_entry & L2E_OFFSET_MASK,
> +                                      s->cluster_size, cluster_type, type);
>           }
>       }
>   
> @@ -2088,12 +2108,11 @@ zero_in_l2_slice(BlockDriverState *bs, uint64_t offset,
>               if (!keep_reference) {
>                   /* Then decrease the refcount */
>                   qcow2_free_any_cluster(bs, old_l2_entry, QCOW2_DISCARD_REQUEST);
> -            } else if (s->discard_passthrough[QCOW2_DISCARD_REQUEST] &&
> -                       (type == QCOW2_CLUSTER_NORMAL ||
> -                        type == QCOW2_CLUSTER_ZERO_ALLOC)) {
> +            } else {
>                   /* If we keep the reference, pass on the discard still */
> -                bdrv_pdiscard(s->data_file, old_l2_entry & L2E_OFFSET_MASK,
> -                            s->cluster_size);
> +                discard_no_unref_any_file(bs, old_l2_entry & L2E_OFFSET_MASK,
> +                                          s->cluster_size, type,
> +                                          QCOW2_DISCARD_REQUEST);
>               }
>           }
>       }


  reply	other threads:[~2025-04-08  7:35 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-09-13 16:39 [PATCH v3 00/12] qcow2: make subclusters discardable Andrey Drobyshev
2024-09-13 16:39 ` [PATCH v3 01/12] qcow2: make function update_refcount_discard() global Andrey Drobyshev
2024-09-13 16:39 ` [PATCH v3 02/12] qcow2: simplify L2 entries accounting for discard-no-unref Andrey Drobyshev
2024-09-13 16:39 ` [PATCH v3 03/12] qcow2: put discard requests in the common queue when discard-no-unref enabled Andrey Drobyshev
2025-04-08  7:34   ` Jean-Louis Dupond [this message]
2024-09-13 16:39 ` [PATCH v3 04/12] block/file-posix: add trace event for fallocate() calls Andrey Drobyshev
2024-09-13 16:39 ` [PATCH v3 05/12] iotests/common.rc: add disk_usage function Andrey Drobyshev
2025-04-11 17:48   ` Eric Blake
2025-04-14  9:47     ` Andrey Drobyshev
2024-09-13 16:39 ` [PATCH v3 06/12] iotests/290: add test case to check 'discard-no-unref' option behavior Andrey Drobyshev
2024-09-13 16:39 ` [PATCH v3 07/12] qcow2: add get_sc_range_info() helper for working with subcluster ranges Andrey Drobyshev
2024-09-13 16:39 ` [PATCH v3 08/12] qcow2: zeroize the entire cluster when there're no non-zero subclusters Andrey Drobyshev
2024-09-13 16:39 ` [PATCH v3 09/12] qcow2: make subclusters discardable Andrey Drobyshev
2024-09-13 16:39 ` [PATCH v3 10/12] qcow2: zero_l2_subclusters: fall through to discard operation when requested Andrey Drobyshev
2024-09-13 16:39 ` [PATCH v3 11/12] iotests/271: add test cases for subcluster-based discard/unmap Andrey Drobyshev
2024-09-13 16:39 ` [PATCH v3 12/12] qcow2: add discard-subclusters option Andrey Drobyshev
2024-09-16  6:29   ` Andrey Drobyshev
2024-09-30 14:24 ` [PATCH v3 00/12] qcow2: make subclusters discardable Andrey Drobyshev
2024-10-09 14:55   ` Andrey Drobyshev

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=263b1048-37bf-4149-a2ff-8f7fe59795b5@dupond.be \
    --to=jean-louis@dupond.be \
    --cc=andrey.drobyshev@virtuozzo.com \
    --cc=berto@igalia.com \
    --cc=den@virtuozzo.com \
    --cc=eblake@redhat.com \
    --cc=hreitz@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@redhat.com \
    /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).