All of lore.kernel.org
 help / color / mirror / Atom feed
From: Stefan Hajnoczi <stefanha@redhat.com>
To: Sam Li <faithilikerun@gmail.com>
Cc: qemu-devel@nongnu.org, damien.lemoal@opensource.wdc.com,
	Hanna Reitz <hreitz@redhat.com>,
	hare@suse.de, qemu-block@nongnu.org,
	Eric Blake <eblake@redhat.com>,
	Paolo Bonzini <pbonzini@redhat.com>,
	dmitry.fomichev@wdc.com, Cornelia Huck <cohuck@redhat.com>,
	Markus Armbruster <armbru@redhat.com>,
	kvm@vger.kernel.org, "Michael S. Tsirkin" <mst@redhat.com>,
	Kevin Wolf <kwolf@redhat.com>,
	Raphael Norwitz <raphael.norwitz@nutanix.com>
Subject: Re: [PATCH v7 3/4] block: add accounting for zone append operation
Date: Thu, 16 Mar 2023 15:23:41 -0400	[thread overview]
Message-ID: <20230316192341.GF63600@fedora> (raw)
In-Reply-To: <20230310105431.64271-4-faithilikerun@gmail.com>

[-- Attachment #1: Type: text/plain, Size: 15546 bytes --]

On Fri, Mar 10, 2023 at 06:54:30PM +0800, Sam Li wrote:
> Taking account of the new zone append write operation for zoned devices,
> BLOCK_ACCT_APPEND enum is introduced as other I/O request type (read,
> write, flush).

Can it be called BLOCK_ACCT_ZONE_APPEND so it's clear that this
operation is specific to zoned devices? I think people might not make
the connection if they just see "append" and think that regular devices
support this operation.

> 
> Signed-off-by: Sam Li <faithilikerun@gmail.com>
> ---
>  block/qapi-sysemu.c        | 11 ++++++++
>  block/qapi.c               | 15 ++++++++++
>  hw/block/virtio-blk.c      |  4 +++
>  include/block/accounting.h |  1 +
>  qapi/block-core.json       | 56 ++++++++++++++++++++++++++++++--------
>  qapi/block.json            |  4 +++
>  6 files changed, 80 insertions(+), 11 deletions(-)
> 
> diff --git a/block/qapi-sysemu.c b/block/qapi-sysemu.c
> index 7bd7554150..f7e56dfeb2 100644
> --- a/block/qapi-sysemu.c
> +++ b/block/qapi-sysemu.c
> @@ -517,6 +517,7 @@ void qmp_block_latency_histogram_set(
>      bool has_boundaries, uint64List *boundaries,
>      bool has_boundaries_read, uint64List *boundaries_read,
>      bool has_boundaries_write, uint64List *boundaries_write,
> +    bool has_boundaries_append, uint64List *boundaries_append,
>      bool has_boundaries_flush, uint64List *boundaries_flush,
>      Error **errp)
>  {
> @@ -557,6 +558,16 @@ void qmp_block_latency_histogram_set(
>          }
>      }
>  
> +    if (has_boundaries || has_boundaries_append) {
> +        ret = block_latency_histogram_set(
> +                stats, BLOCK_ACCT_APPEND,
> +                has_boundaries_append ? boundaries_append : boundaries);
> +        if (ret) {
> +            error_setg(errp, "Device '%s' set append write boundaries fail", id);
> +            return;
> +        }
> +    }
> +
>      if (has_boundaries || has_boundaries_flush) {
>          ret = block_latency_histogram_set(
>              stats, BLOCK_ACCT_FLUSH,
> diff --git a/block/qapi.c b/block/qapi.c
> index c84147849d..d4be8ad72e 100644
> --- a/block/qapi.c
> +++ b/block/qapi.c
> @@ -533,27 +533,33 @@ static void bdrv_query_blk_stats(BlockDeviceStats *ds, BlockBackend *blk)
>  
>      ds->rd_bytes = stats->nr_bytes[BLOCK_ACCT_READ];
>      ds->wr_bytes = stats->nr_bytes[BLOCK_ACCT_WRITE];
> +    ds->zap_bytes = stats->nr_bytes[BLOCK_ACCT_APPEND];

"zone_append_bytes" would be clearer. For a moment I thought "zap" is a
new operation. Since "zap" isn't used anywhere else, let's not introduce
a new name here.

>      ds->unmap_bytes = stats->nr_bytes[BLOCK_ACCT_UNMAP];
>      ds->rd_operations = stats->nr_ops[BLOCK_ACCT_READ];
>      ds->wr_operations = stats->nr_ops[BLOCK_ACCT_WRITE];
> +    ds->zap_operations = stats->nr_ops[BLOCK_ACCT_APPEND];
>      ds->unmap_operations = stats->nr_ops[BLOCK_ACCT_UNMAP];
>  
>      ds->failed_rd_operations = stats->failed_ops[BLOCK_ACCT_READ];
>      ds->failed_wr_operations = stats->failed_ops[BLOCK_ACCT_WRITE];
> +    ds->failed_zap_operations = stats->failed_ops[BLOCK_ACCT_APPEND];
>      ds->failed_flush_operations = stats->failed_ops[BLOCK_ACCT_FLUSH];
>      ds->failed_unmap_operations = stats->failed_ops[BLOCK_ACCT_UNMAP];
>  
>      ds->invalid_rd_operations = stats->invalid_ops[BLOCK_ACCT_READ];
>      ds->invalid_wr_operations = stats->invalid_ops[BLOCK_ACCT_WRITE];
> +    ds->invalid_zap_operations = stats->invalid_ops[BLOCK_ACCT_APPEND];
>      ds->invalid_flush_operations =
>          stats->invalid_ops[BLOCK_ACCT_FLUSH];
>      ds->invalid_unmap_operations = stats->invalid_ops[BLOCK_ACCT_UNMAP];
>  
>      ds->rd_merged = stats->merged[BLOCK_ACCT_READ];
>      ds->wr_merged = stats->merged[BLOCK_ACCT_WRITE];
> +    ds->zap_merged = stats->merged[BLOCK_ACCT_APPEND];
>      ds->unmap_merged = stats->merged[BLOCK_ACCT_UNMAP];
>      ds->flush_operations = stats->nr_ops[BLOCK_ACCT_FLUSH];
>      ds->wr_total_time_ns = stats->total_time_ns[BLOCK_ACCT_WRITE];
> +    ds->zap_total_time_ns = stats->total_time_ns[BLOCK_ACCT_APPEND];
>      ds->rd_total_time_ns = stats->total_time_ns[BLOCK_ACCT_READ];
>      ds->flush_total_time_ns = stats->total_time_ns[BLOCK_ACCT_FLUSH];
>      ds->unmap_total_time_ns = stats->total_time_ns[BLOCK_ACCT_UNMAP];
> @@ -571,6 +577,7 @@ static void bdrv_query_blk_stats(BlockDeviceStats *ds, BlockBackend *blk)
>  
>          TimedAverage *rd = &ts->latency[BLOCK_ACCT_READ];
>          TimedAverage *wr = &ts->latency[BLOCK_ACCT_WRITE];
> +        TimedAverage *zap = &ts->latency[BLOCK_ACCT_APPEND];
>          TimedAverage *fl = &ts->latency[BLOCK_ACCT_FLUSH];
>  
>          dev_stats->interval_length = ts->interval_length;
> @@ -583,6 +590,10 @@ static void bdrv_query_blk_stats(BlockDeviceStats *ds, BlockBackend *blk)
>          dev_stats->max_wr_latency_ns = timed_average_max(wr);
>          dev_stats->avg_wr_latency_ns = timed_average_avg(wr);
>  
> +        dev_stats->min_zap_latency_ns = timed_average_min(zap);
> +        dev_stats->max_zap_latency_ns = timed_average_max(zap);
> +        dev_stats->avg_zap_latency_ns = timed_average_avg(zap);
> +
>          dev_stats->min_flush_latency_ns = timed_average_min(fl);
>          dev_stats->max_flush_latency_ns = timed_average_max(fl);
>          dev_stats->avg_flush_latency_ns = timed_average_avg(fl);
> @@ -591,6 +602,8 @@ static void bdrv_query_blk_stats(BlockDeviceStats *ds, BlockBackend *blk)
>              block_acct_queue_depth(ts, BLOCK_ACCT_READ);
>          dev_stats->avg_wr_queue_depth =
>              block_acct_queue_depth(ts, BLOCK_ACCT_WRITE);
> +        dev_stats->avg_zap_queue_depth =
> +            block_acct_queue_depth(ts, BLOCK_ACCT_APPEND);
>  
>          QAPI_LIST_PREPEND(ds->timed_stats, dev_stats);
>      }
> @@ -600,6 +613,8 @@ static void bdrv_query_blk_stats(BlockDeviceStats *ds, BlockBackend *blk)
>          = bdrv_latency_histogram_stats(&hgram[BLOCK_ACCT_READ]);
>      ds->wr_latency_histogram
>          = bdrv_latency_histogram_stats(&hgram[BLOCK_ACCT_WRITE]);
> +    ds->zap_latency_histogram
> +        = bdrv_latency_histogram_stats(&hgram[BLOCK_ACCT_APPEND]);
>      ds->flush_latency_histogram
>          = bdrv_latency_histogram_stats(&hgram[BLOCK_ACCT_FLUSH]);
>  }
> diff --git a/hw/block/virtio-blk.c b/hw/block/virtio-blk.c
> index 4ded625732..7605ca4f03 100644
> --- a/hw/block/virtio-blk.c
> +++ b/hw/block/virtio-blk.c
> @@ -925,6 +925,10 @@ static int virtio_blk_handle_zone_append(VirtIOBlockReq *req,
>      data->in_num = in_num;
>      data->zone_append_data.offset = offset;
>      qemu_iovec_init_external(&req->qiov, out_iov, out_num);
> +
> +    block_acct_start(blk_get_stats(s->blk), &req->acct, len,
> +                     BLOCK_ACCT_APPEND);
> +
>      blk_aio_zone_append(s->blk, &data->zone_append_data.offset, &req->qiov, 0,
>                          virtio_blk_zone_append_complete, data);
>      return 0;
> diff --git a/include/block/accounting.h b/include/block/accounting.h
> index b9caad60d5..61cc868666 100644
> --- a/include/block/accounting.h
> +++ b/include/block/accounting.h
> @@ -37,6 +37,7 @@ enum BlockAcctType {
>      BLOCK_ACCT_READ,
>      BLOCK_ACCT_WRITE,
>      BLOCK_ACCT_FLUSH,
> +    BLOCK_ACCT_APPEND,
>      BLOCK_ACCT_UNMAP,
>      BLOCK_MAX_IOTYPE,
>  };
> diff --git a/qapi/block-core.json b/qapi/block-core.json
> index c05ad0c07e..76fe9c2fca 100644
> --- a/qapi/block-core.json
> +++ b/qapi/block-core.json
> @@ -849,6 +849,9 @@
>  # @min_wr_latency_ns: Minimum latency of write operations in the
>  #                     defined interval, in nanoseconds.
>  #
> +# @min_zap_latency_ns: Minimum latency of zone append operations in the
> +#                      defined interval, in nanoseconds.
> +#
>  # @min_flush_latency_ns: Minimum latency of flush operations in the
>  #                        defined interval, in nanoseconds.
>  #
> @@ -858,6 +861,9 @@
>  # @max_wr_latency_ns: Maximum latency of write operations in the
>  #                     defined interval, in nanoseconds.
>  #
> +# @max_zap_latency_ns: Maximum latency of zone append operations in the
> +#                      defined interval, in nanoseconds.
> +#
>  # @max_flush_latency_ns: Maximum latency of flush operations in the
>  #                        defined interval, in nanoseconds.
>  #
> @@ -867,6 +873,9 @@
>  # @avg_wr_latency_ns: Average latency of write operations in the
>  #                     defined interval, in nanoseconds.
>  #
> +# @avg_zap_latency_ns: Average latency of zone append operations in the
> +#                      defined interval, in nanoseconds.
> +#
>  # @avg_flush_latency_ns: Average latency of flush operations in the
>  #                        defined interval, in nanoseconds.
>  #
> @@ -876,15 +885,20 @@
>  # @avg_wr_queue_depth: Average number of pending write operations
>  #                      in the defined interval.
>  #
> +# @avg_zap_queue_depth: Average number of pending zone append operations
> +#                       in the defined interval.
> +#
>  # Since: 2.5
>  ##
>  { 'struct': 'BlockDeviceTimedStats',
>    'data': { 'interval_length': 'int', 'min_rd_latency_ns': 'int',
>              'max_rd_latency_ns': 'int', 'avg_rd_latency_ns': 'int',
>              'min_wr_latency_ns': 'int', 'max_wr_latency_ns': 'int',
> -            'avg_wr_latency_ns': 'int', 'min_flush_latency_ns': 'int',
> -            'max_flush_latency_ns': 'int', 'avg_flush_latency_ns': 'int',
> -            'avg_rd_queue_depth': 'number', 'avg_wr_queue_depth': 'number' } }
> +            'avg_wr_latency_ns': 'int', 'min_zap_latency_ns': 'int',
> +            'max_zap_latency_ns': 'int', 'avg_zap_latency_ns': 'int',
> +            'min_flush_latency_ns': 'int', 'max_flush_latency_ns': 'int',
> +            'avg_flush_latency_ns': 'int', 'avg_rd_queue_depth': 'number',
> +            'avg_wr_queue_depth': 'number', 'avg_zap_queue_depth': 'number'  } }
>  
>  ##
>  # @BlockDeviceStats:
> @@ -895,12 +909,16 @@
>  #
>  # @wr_bytes: The number of bytes written by the device.
>  #
> +# @zap_bytes: The number of bytes appended by the zoned devices.
> +#
>  # @unmap_bytes: The number of bytes unmapped by the device (Since 4.2)
>  #
>  # @rd_operations: The number of read operations performed by the device.
>  #
>  # @wr_operations: The number of write operations performed by the device.
>  #
> +# @zap_operations: The number of zone append operations performed by the zoned devices.
> +#
>  # @flush_operations: The number of cache flush operations performed by the
>  #                    device (since 0.15)
>  #
> @@ -911,6 +929,8 @@
>  #
>  # @wr_total_time_ns: Total time spent on writes in nanoseconds (since 0.15).
>  #
> +# @zap_total_time_ns: Total time spent on zone append writes in nanoseconds.
> +#
>  # @flush_total_time_ns: Total time spent on cache flushes in nanoseconds
>  #                       (since 0.15).
>  #
> @@ -928,6 +948,9 @@
>  # @wr_merged: Number of write requests that have been merged into another
>  #             request (Since 2.3).
>  #
> +# @zap_merged: Number of zone append requests that have been merged into
> +#              another request.
> +#
>  # @unmap_merged: Number of unmap requests that have been merged into another
>  #                request (Since 4.2)
>  #
> @@ -941,6 +964,9 @@
>  # @failed_wr_operations: The number of failed write operations
>  #                        performed by the device (Since 2.5)
>  #
> +# @failed_zap_operations: The number of failed zone append write
> +#                         operations performed by the zoned devices
> +#
>  # @failed_flush_operations: The number of failed flush operations
>  #                           performed by the device (Since 2.5)
>  #
> @@ -953,6 +979,9 @@
>  # @invalid_wr_operations: The number of invalid write operations
>  #                         performed by the device (Since 2.5)
>  #
> +# @invalid_zap_operations: The number of invalid zone append operations
> +#                          performed by the zoned device
> +#
>  # @invalid_flush_operations: The number of invalid flush operations
>  #                            performed by the device (Since 2.5)
>  #
> @@ -972,27 +1001,32 @@
>  #
>  # @wr_latency_histogram: @BlockLatencyHistogramInfo. (Since 4.0)
>  #
> +# @zap_latency_histogram: @BlockLatencyHistogramInfo.
> +#
>  # @flush_latency_histogram: @BlockLatencyHistogramInfo. (Since 4.0)
>  #
>  # Since: 0.14
>  ##
>  { 'struct': 'BlockDeviceStats',
> -  'data': {'rd_bytes': 'int', 'wr_bytes': 'int', 'unmap_bytes' : 'int',
> -           'rd_operations': 'int', 'wr_operations': 'int',
> +  'data': {'rd_bytes': 'int', 'wr_bytes': 'int', 'zap_bytes': 'int',
> +           'unmap_bytes' : 'int', 'rd_operations': 'int',
> +           'wr_operations': 'int', 'zap_operations': 'int',
>             'flush_operations': 'int', 'unmap_operations': 'int',
>             'rd_total_time_ns': 'int', 'wr_total_time_ns': 'int',
> -           'flush_total_time_ns': 'int', 'unmap_total_time_ns': 'int',
> -           'wr_highest_offset': 'int',
> -           'rd_merged': 'int', 'wr_merged': 'int', 'unmap_merged': 'int',
> -           '*idle_time_ns': 'int',
> +           'zap_total_time_ns': 'int', 'flush_total_time_ns': 'int',
> +           'unmap_total_time_ns': 'int', 'wr_highest_offset': 'int',
> +           'rd_merged': 'int', 'wr_merged': 'int', 'zap_merged': 'int',
> +           'unmap_merged': 'int', '*idle_time_ns': 'int',
>             'failed_rd_operations': 'int', 'failed_wr_operations': 'int',
> -           'failed_flush_operations': 'int', 'failed_unmap_operations': 'int',
> -           'invalid_rd_operations': 'int', 'invalid_wr_operations': 'int',
> +           'failed_zap_operations': 'int', 'failed_flush_operations': 'int',
> +           'failed_unmap_operations': 'int', 'invalid_rd_operations': 'int',
> +           'invalid_wr_operations': 'int', 'invalid_zap_operations': 'int',
>             'invalid_flush_operations': 'int', 'invalid_unmap_operations': 'int',
>             'account_invalid': 'bool', 'account_failed': 'bool',
>             'timed_stats': ['BlockDeviceTimedStats'],
>             '*rd_latency_histogram': 'BlockLatencyHistogramInfo',
>             '*wr_latency_histogram': 'BlockLatencyHistogramInfo',
> +           '*zap_latency_histogram': 'BlockLatencyHistogramInfo',
>             '*flush_latency_histogram': 'BlockLatencyHistogramInfo' } }
>  
>  ##
> diff --git a/qapi/block.json b/qapi/block.json
> index 5fe068f903..5a57ef4a9f 100644
> --- a/qapi/block.json
> +++ b/qapi/block.json
> @@ -525,6 +525,9 @@
>  # @boundaries-write: list of interval boundary values for write latency
>  #                    histogram.
>  #
> +# @boundaries-zap: list of interval boundary values for zone append write
> +#                  latency histogram.
> +#
>  # @boundaries-flush: list of interval boundary values for flush latency
>  #                    histogram.
>  #
> @@ -573,5 +576,6 @@
>             '*boundaries': ['uint64'],
>             '*boundaries-read': ['uint64'],
>             '*boundaries-write': ['uint64'],
> +           '*boundaries-zap': ['uint64'],
>             '*boundaries-flush': ['uint64'] },
>    'allow-preconfig': true }
> -- 
> 2.39.2
> 

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

  reply	other threads:[~2023-03-16 19:47 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-03-10 10:54 [PATCH v7 0/4] Add zoned storage emulation to virtio-blk driver Sam Li
2023-03-10 10:54 ` [PATCH v7 1/4] include: update virtio_blk headers to v6.3-rc1 Sam Li
2023-03-10 10:54 ` [PATCH v7 2/4] virtio-blk: add zoned storage emulation for zoned devices Sam Li
2023-03-16 19:19   ` Stefan Hajnoczi
2023-03-10 10:54 ` [PATCH v7 3/4] block: add accounting for zone append operation Sam Li
2023-03-16 19:23   ` Stefan Hajnoczi [this message]
2023-03-10 10:54 ` [PATCH v7 4/4] virtio-blk: add some trace events for zoned emulation Sam Li
2023-03-16 19:24 ` [PATCH v7 0/4] Add zoned storage emulation to virtio-blk driver Stefan Hajnoczi
2023-03-17  3:44   ` Sam Li

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=20230316192341.GF63600@fedora \
    --to=stefanha@redhat.com \
    --cc=armbru@redhat.com \
    --cc=cohuck@redhat.com \
    --cc=damien.lemoal@opensource.wdc.com \
    --cc=dmitry.fomichev@wdc.com \
    --cc=eblake@redhat.com \
    --cc=faithilikerun@gmail.com \
    --cc=hare@suse.de \
    --cc=hreitz@redhat.com \
    --cc=kvm@vger.kernel.org \
    --cc=kwolf@redhat.com \
    --cc=mst@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=raphael.norwitz@nutanix.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 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.