From a7fc4c85e3ad282a62d95c84c5eaf1b59c1fb23a Mon Sep 17 00:00:00 2001 From: Mateusz Guzik Date: Mon, 15 Jul 2024 23:51:37 +0200 Subject: [PATCH] zstd: don't call zstd_mempool_reap if there are no buffers (#16302) zfs_zstd_cache_reap_now is issued every second. zstd_mempool_reap checks for both pool existence and buffer count, but that's still 2 func calls which are trivially avoidable. With clang it even avoids pushing the stack pointer (but still suffers the mispredict due to a forward jump, not modified in case someone is using zstd): <+0>: cmpq $0x0,0x0(%rip) # <+8>: je 0x217de4 <+10>: push %rbp <+11>: mov %rsp,%rbp <+14>: mov 0x0(%rip),%rdi # <+21>: call 0x217df0 <+26>: mov 0x0(%rip),%rdi # <+33>: pop %rbp <+34>: jmp 0x217df0 <+36>: ret Preferably the call would not be made to begin with if zstd is not used, but this retains all the logic confined to zstd code. Sponsored by: Rubicon Communications, LLC ("Netgate") Signed-off-by: Mateusz Guzik Reviewed-by: Allan Jude Reviewed-by: Tony Hutter --- module/zstd/zfs_zstd.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/module/zstd/zfs_zstd.c b/module/zstd/zfs_zstd.c index ed0271a8d683..05120d27b8d6 100644 --- a/module/zstd/zfs_zstd.c +++ b/module/zstd/zfs_zstd.c @@ -844,6 +844,13 @@ zstd_mempool_deinit(void) void zfs_zstd_cache_reap_now(void) { + + /* + * Short-circuit if there are no buffers to begin with. + */ + if (ZSTDSTAT(zstd_stat_buffers) == 0) + return; + /* * calling alloc with zero size seeks * and releases old unused objects