diff options
author | Rich Ercolani <[email protected]> | 2024-01-12 15:17:26 -0500 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2024-01-29 14:53:29 -0800 |
commit | 4d4972ed98a83a4b3a404f53782d5b351b8ef8cf (patch) | |
tree | 2cd86a5ec16e7b28dd4dc51d3c6f0f2711882af2 /cmd | |
parent | 3425484eb907d489c315cced2a1fdea08ef03fc4 (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.c | 5 |
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 */ |