[Libguestfs] [nbdkit PATCH] data, memory: Optimize .zero > PAGE_SIZE

Richard W.M. Jones rjones at redhat.com
Thu Aug 15 10:25:45 UTC 2019


On Wed, Aug 14, 2019 at 09:10:15PM -0500, Eric Blake wrote:
> When sparse_array_zero() is used for a range larger than a page,
> there's no need to waste time in memset() or is_zero() - we already
> know the page will be free()d.
> 
> Signed-off-by: Eric Blake <eblake at redhat.com>
> ---
> 
> Here's a fun one :)
> 
>  common/sparse/sparse.c | 7 +++++--
>  1 file changed, 5 insertions(+), 2 deletions(-)
> 
> diff --git a/common/sparse/sparse.c b/common/sparse/sparse.c
> index cb44743c..5e085763 100644
> --- a/common/sparse/sparse.c
> +++ b/common/sparse/sparse.c
> @@ -343,10 +343,13 @@ sparse_array_zero (struct sparse_array *sa, uint32_t count, uint64_t offset)
>        n = count;
> 
>      if (p) {
> -      memset (p, 0, n);
> +      if (n < PAGE_SIZE)
> +        memset (p, 0, n);
> +      else
> +        assert (p == *l2_page);
> 
>        /* If the whole page is now zero, free it. */
> -      if (is_zero (*l2_page, PAGE_SIZE)) {
> +      if (n == PAGE_SIZE || is_zero (*l2_page, PAGE_SIZE)) {

Should this be n >= PAGE_SIZE?  My guess is no because lookup (..&n..)
can't return n larger than the remaining size of the page
(ie. n <= PAGE_SIZE).

>          if (sa->debug)
>            nbdkit_debug ("%s: freeing zero page at offset %" PRIu64,
>                          __func__, offset);

Anyway, ACK.

Rich.

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
virt-df lists disk usage of guests without needing to install any
software inside the virtual machine.  Supports Linux and Windows.
http://people.redhat.com/~rjones/virt-df/




More information about the Libguestfs mailing list