qemu-block
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [libnbd PATCH v3 16/22] examples: Update copy-libev to use 64-bit bl


From: Richard W.M. Jones
Subject: Re: [libnbd PATCH v3 16/22] examples: Update copy-libev to use 64-bit block status
Date: Thu, 8 Jun 2023 10:35:06 +0100
User-agent: Mutt/1.5.21 (2010-09-15)

On Thu, May 25, 2023 at 08:01:02AM -0500, Eric Blake wrote:
> Although our use of "base:allocation" doesn't require the use of the
> 64-bit API for flags, we might perform slightly faster for a server
> that does give us 64-bit extent lengths and honors larger nbd_zero
> lengths.
> 
> Signed-off-by: Eric Blake <eblake@redhat.com>
> ---
>  examples/copy-libev.c | 21 ++++++++++-----------
>  1 file changed, 10 insertions(+), 11 deletions(-)
> 
> diff --git a/examples/copy-libev.c b/examples/copy-libev.c
> index 32cb46b3..9346faf7 100644
> --- a/examples/copy-libev.c
> +++ b/examples/copy-libev.c
> @@ -96,7 +96,7 @@ struct request {
>  };
> 
>  struct extent {
> -    uint32_t length;
> +    uint64_t length;
>      bool zero;
>  };
> 
> @@ -184,7 +184,7 @@ get_events (struct connection *c)
> 
>  static int
>  extent_callback (void *user_data, const char *metacontext, uint64_t offset,
> -                 uint32_t *entries, size_t nr_entries, int *error)
> +                 nbd_extent *entries, size_t nr_entries, int *error)
>  {
>      struct request *r = user_data;
> 
> @@ -199,22 +199,21 @@ extent_callback (void *user_data, const char 
> *metacontext, uint64_t offset,
>          return 1;
>      }
> 
> -    /* Libnbd returns uint32_t pair (length, flags) for each extent. */
> -    extents_len = nr_entries / 2;
> +    extents_len = nr_entries;
> 
>      extents = malloc (extents_len * sizeof *extents);
>      if (extents == NULL)
>          FAIL ("Cannot allocated extents: %s", strerror (errno));
> 
>      /* Copy libnbd entries to extents array. */
> -    for (int i = 0, j = 0; i < extents_len; i++, j=i*2) {
> -        extents[i].length = entries[j];
> +    for (int i = 0; i < extents_len; i++) {
> +        extents[i].length = entries[i].length;
> 
>          /* Libnbd exposes both ZERO and HOLE flags. We care only about
>           * ZERO status, meaning we can copy this extent using efficinet
>           * zero method.
>           */
> -        extents[i].zero = (entries[j + 1] & LIBNBD_STATE_ZERO) != 0;
> +        extents[i].zero = (entries[i].flags & LIBNBD_STATE_ZERO) != 0;
>      }
> 
>      DEBUG ("r%zu: received %zu extents for %s",
> @@ -286,10 +285,10 @@ start_extents (struct request *r)
>      DEBUG ("r%zu: start extents offset=%" PRIi64 " count=%zu",
>             r->index, offset, count);
> 
> -    cookie = nbd_aio_block_status (
> +    cookie = nbd_aio_block_status_64 (
>          src.nbd, count, offset,
> -        (nbd_extent_callback) { .callback=extent_callback,
> -                                .user_data=r },
> +        (nbd_extent64_callback) { .callback=extent_callback,
> +                                  .user_data=r },
>          (nbd_completion_callback) { .callback=extents_completed,
>                                      .user_data=r },
>          0);
> @@ -324,7 +323,7 @@ next_extent (struct request *r)
>          limit = MIN (REQUEST_SIZE, size - offset);
> 
>      while (length < limit) {
> -        DEBUG ("e%zu: offset=%" PRIi64 " len=%" PRIu32 " zero=%d",
> +        DEBUG ("e%zu: offset=%" PRIi64 " len=%" PRIu64 " zero=%d",
>                 extents_pos, offset, extents[extents_pos].length, is_zero);
> 
>          /* If this extent is too large, steal some data from it to

Reviewed-by: Richard W.M. Jones <rjones@redhat.com>

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
nbdkit - Flexible, fast NBD server with plugins
https://gitlab.com/nbdkit/nbdkit




reply via email to

[Prev in Thread] Current Thread [Next in Thread]