mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 02:27:36 +03:00
Introduce zfs_refcount_(add|remove)_few().
There are two places where we need to add/remove several references with semantics of zfs_refcount_(add|remove). But when debug/tracing is disabled, it is a crime to run multiple atomic_inc() in a loop, especially under congested pool-wide allocator lock. Introduced new functions implement the same semantics as the loop, but without overhead in production builds. Reviewed-by: Rich Ercolani <rincebrain@gmail.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored by: iXsystems, Inc. Closes #14934
This commit is contained in:
@@ -73,13 +73,15 @@ int64_t zfs_refcount_count(zfs_refcount_t *);
|
||||
int64_t zfs_refcount_add(zfs_refcount_t *, const void *);
|
||||
int64_t zfs_refcount_remove(zfs_refcount_t *, const void *);
|
||||
/*
|
||||
* Note that (add|remove)_many add/remove one reference with "number" N,
|
||||
* _not_ make N references with "number" 1, which is what vanilla
|
||||
* zfs_refcount_(add|remove) would do if called N times.
|
||||
* Note that (add|remove)_many adds/removes one reference with "number" N,
|
||||
* _not_ N references with "number" 1, which is what (add|remove)_few does,
|
||||
* or what vanilla zfs_refcount_(add|remove) called N times would do.
|
||||
*
|
||||
* Attempting to remove a reference with number N when none exists is a
|
||||
* panic on debug kernels with reference_tracking enabled.
|
||||
*/
|
||||
void zfs_refcount_add_few(zfs_refcount_t *, uint64_t, const void *);
|
||||
void zfs_refcount_remove_few(zfs_refcount_t *, uint64_t, const void *);
|
||||
int64_t zfs_refcount_add_many(zfs_refcount_t *, uint64_t, const void *);
|
||||
int64_t zfs_refcount_remove_many(zfs_refcount_t *, uint64_t, const void *);
|
||||
void zfs_refcount_transfer(zfs_refcount_t *, zfs_refcount_t *);
|
||||
@@ -108,6 +110,10 @@ typedef struct refcount {
|
||||
#define zfs_refcount_count(rc) atomic_load_64(&(rc)->rc_count)
|
||||
#define zfs_refcount_add(rc, holder) atomic_inc_64_nv(&(rc)->rc_count)
|
||||
#define zfs_refcount_remove(rc, holder) atomic_dec_64_nv(&(rc)->rc_count)
|
||||
#define zfs_refcount_add_few(rc, number, holder) \
|
||||
atomic_add_64(&(rc)->rc_count, number)
|
||||
#define zfs_refcount_remove_few(rc, number, holder) \
|
||||
atomic_add_64(&(rc)->rc_count, -number)
|
||||
#define zfs_refcount_add_many(rc, number, holder) \
|
||||
atomic_add_64_nv(&(rc)->rc_count, number)
|
||||
#define zfs_refcount_remove_many(rc, number, holder) \
|
||||
|
||||
Reference in New Issue
Block a user