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) # <zfs_zstd_cache_reap_now+8> <+8>: je 0x217de4 <zfs_zstd_cache_reap_now+36> <+10>: push %rbp <+11>: mov %rsp,%rbp <+14>: mov 0x0(%rip),%rdi # <zfs_zstd_cache_reap_now+21> <+21>: call 0x217df0 <zstd_mempool_reap> <+26>: mov 0x0(%rip),%rdi # <zfs_zstd_cache_reap_now+33> <+33>: pop %rbp <+34>: jmp 0x217df0 <zstd_mempool_reap> <+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 <mjguzik@gmail.com> Reviewed-by: Allan Jude <allan@klarasystems.com> Reviewed-by: Tony Hutter <hutter2@llnl.gov>
This commit is contained in:
parent
c87cb22ba9
commit
a7fc4c85e3
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue