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

Eric Blake eblake at redhat.com
Thu Aug 15 02:10:15 UTC 2019


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)) {
         if (sa->debug)
           nbdkit_debug ("%s: freeing zero page at offset %" PRIu64,
                         __func__, offset);
-- 
2.20.1




More information about the Libguestfs mailing list