[Libguestfs] [nbdkit PATCH] cache: Reduce use of bounce-buffer

Richard W.M. Jones rjones at redhat.com
Mon May 13 09:21:28 UTC 2019


On Sat, May 11, 2019 at 03:30:04PM -0500, Eric Blake wrote:
> Although the time spent in memcpy/memset probably pales in comparison
> to time spent in socket I/O, it's still worth worth reducing the
> number of times we have to utilize a bounce buffer when we already
> have aligned data.
> 
> Signed-off-by: Eric Blake <eblake at redhat.com>
> ---
>  filters/cache/cache.c | 60 ++++++++++++++++++++++++++++---------------
>  1 file changed, 39 insertions(+), 21 deletions(-)
> 
> diff --git a/filters/cache/cache.c b/filters/cache/cache.c
> index 19ce555..98786b5 100644
> --- a/filters/cache/cache.c
> +++ b/filters/cache/cache.c
> @@ -1,5 +1,5 @@
>  /* nbdkit
> - * Copyright (C) 2018 Red Hat Inc.
> + * Copyright (C) 2018-2019 Red Hat Inc.
>   *
>   * Redistribution and use in source and binary forms, with or without
>   * modification, are permitted provided that the following conditions are
> @@ -58,6 +58,7 @@
>  #include "cache.h"
>  #include "blk.h"
>  #include "reclaim.h"
> +#include "isaligned.h"
> 
>  #define THREAD_MODEL NBDKIT_THREAD_MODEL_PARALLEL
> 
> @@ -233,11 +234,13 @@ cache_pread (struct nbdkit_next_ops *next_ops, void *nxdata,
>    CLEANUP_FREE uint8_t *block = NULL;
> 
>    assert (!flags);
> -  block = malloc (blksize);
> -  if (block == NULL) {
> -    *err = errno;
> -    nbdkit_error ("malloc: %m");
> -    return -1;
> +  if (!IS_ALIGNED (count | offset, blksize)) {
> +    block = malloc (blksize);
> +    if (block == NULL) {
> +      *err = errno;
> +      nbdkit_error ("malloc: %m");
> +      return -1;
> +    }
>    }
> 
>    /* XXX This breaks up large read requests into smaller ones, which
> @@ -258,12 +261,14 @@ cache_pread (struct nbdkit_next_ops *next_ops, void *nxdata,
> 
>      {
>        ACQUIRE_LOCK_FOR_CURRENT_SCOPE (&lock);
> -      r = blk_read (next_ops, nxdata, blknum, block, err);
> +      r = blk_read (next_ops, nxdata, blknum,
> +                    blkoffs || n < blksize ? block : buf, err);
>      }
>      if (r == -1)
>        return -1;
> 
> -    memcpy (buf, &block[blkoffs], n);
> +    if (blkoffs || n < blksize)
> +      memcpy (buf, &block[blkoffs], n);

I've stared at this patch for a while and I don't really understand
it.

One suggestion though.  The patch might be better (or at least might
be more obviously correct) if the function defined a boolean at the
top which was used to tell if the bounce buffer was in use, something
like:

  const bool use_bounce_buffer = /* condition */;

  if (use_bounce_buffer) {
    block = malloc (blksize);
    ...
  }

  r = blk_read (..., use_bounce_buffer ? block : buf, err);

etc.

Rich.

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
Fedora Windows cross-compiler. Compile Windows programs, test, and
build Windows installers. Over 100 libraries supported.
http://fedoraproject.org/wiki/MinGW




More information about the Libguestfs mailing list