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(a)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