aboutsummaryrefslogtreecommitdiffstats
path: root/cmd
diff options
context:
space:
mode:
authorRich Ercolani <[email protected]>2024-01-12 15:17:26 -0500
committerBrian Behlendorf <[email protected]>2024-01-29 14:53:29 -0800
commit4d4972ed98a83a4b3a404f53782d5b351b8ef8cf (patch)
tree2cd86a5ec16e7b28dd4dc51d3c6f0f2711882af2 /cmd
parent3425484eb907d489c315cced2a1fdea08ef03fc4 (diff)
Stop wasting time on malloc in snprintf_zstd_header
Profiling zdb -vvvvv on datasets with a lot of zstd blocks, we find ourselves spending quite a lot of time on malloc/free, because we allocate a 16M abd each call, and never free it, so we're leaking 16M per call as well. This seems sub-optimal. So let's just keep the buffer around and reuse it. Reviewed-by: Brian Behlendorf <[email protected]> Reviewed-by: Rob Norris <[email protected]> Signed-off-by: Rich Ercolani <[email protected]> Closes #15721
Diffstat (limited to 'cmd')
-rw-r--r--cmd/zdb/zdb.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/cmd/zdb/zdb.c b/cmd/zdb/zdb.c
index 3fc9fd2a9..70c85a87a 100644
--- a/cmd/zdb/zdb.c
+++ b/cmd/zdb/zdb.c
@@ -2360,7 +2360,7 @@ static void
snprintf_zstd_header(spa_t *spa, char *blkbuf, size_t buflen,
const blkptr_t *bp)
{
- abd_t *pabd;
+ static abd_t *pabd = NULL;
void *buf;
zio_t *zio;
zfs_zstdhdr_t zstd_hdr;
@@ -2391,7 +2391,8 @@ snprintf_zstd_header(spa_t *spa, char *blkbuf, size_t buflen,
return;
}
- pabd = abd_alloc_for_io(SPA_MAXBLOCKSIZE, B_FALSE);
+ if (!pabd)
+ pabd = abd_alloc_for_io(SPA_MAXBLOCKSIZE, B_FALSE);
zio = zio_root(spa, NULL, NULL, 0);
/* Decrypt but don't decompress so we can read the compression header */