mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2025-02-06 07:13:25 +03:00
Pack dmu_buf_impl_t by 16 bytes
On 64bit FreeBSD this reduces one from 296 to 280 bytes. On small block workloads dbufs may consume gigabytes of ARC, and this saves 5% of it. Reviewed-by: Tino Reichardt <milky-zfs@mcmilk.de> Reviewed-by: Brian Atkinson <batkinson@lanl.gov> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored by: iXsystems, Inc. Closes #16684
This commit is contained in:
parent
384b53be8e
commit
1f5e1b919f
@ -256,6 +256,27 @@ typedef struct dmu_buf_impl {
|
|||||||
*/
|
*/
|
||||||
uint8_t db_level;
|
uint8_t db_level;
|
||||||
|
|
||||||
|
/* This block was freed while a read or write was active. */
|
||||||
|
uint8_t db_freed_in_flight;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Evict user data as soon as the dirty and reference counts are equal.
|
||||||
|
*/
|
||||||
|
uint8_t db_user_immediate_evict;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* dnode_evict_dbufs() or dnode_evict_bonus() tried to evict this dbuf,
|
||||||
|
* but couldn't due to outstanding references. Evict once the refcount
|
||||||
|
* drops to 0.
|
||||||
|
*/
|
||||||
|
uint8_t db_pending_evict;
|
||||||
|
|
||||||
|
/* Number of TXGs in which this buffer is dirty. */
|
||||||
|
uint8_t db_dirtycnt;
|
||||||
|
|
||||||
|
/* The buffer was partially read. More reads may follow. */
|
||||||
|
uint8_t db_partial_read;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Protects db_buf's contents if they contain an indirect block or data
|
* Protects db_buf's contents if they contain an indirect block or data
|
||||||
* block of the meta-dnode. We use this lock to protect the structure of
|
* block of the meta-dnode. We use this lock to protect the structure of
|
||||||
@ -280,6 +301,9 @@ typedef struct dmu_buf_impl {
|
|||||||
*/
|
*/
|
||||||
dbuf_states_t db_state;
|
dbuf_states_t db_state;
|
||||||
|
|
||||||
|
/* In which dbuf cache this dbuf is, if any. */
|
||||||
|
dbuf_cached_state_t db_caching_status;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Refcount accessed by dmu_buf_{hold,rele}.
|
* Refcount accessed by dmu_buf_{hold,rele}.
|
||||||
* If nonzero, the buffer can't be destroyed.
|
* If nonzero, the buffer can't be destroyed.
|
||||||
@ -296,39 +320,10 @@ typedef struct dmu_buf_impl {
|
|||||||
/* Link in dbuf_cache or dbuf_metadata_cache */
|
/* Link in dbuf_cache or dbuf_metadata_cache */
|
||||||
multilist_node_t db_cache_link;
|
multilist_node_t db_cache_link;
|
||||||
|
|
||||||
/* Tells us which dbuf cache this dbuf is in, if any */
|
|
||||||
dbuf_cached_state_t db_caching_status;
|
|
||||||
|
|
||||||
uint64_t db_hash;
|
uint64_t db_hash;
|
||||||
|
|
||||||
/* Data which is unique to data (leaf) blocks: */
|
|
||||||
|
|
||||||
/* User callback information. */
|
/* User callback information. */
|
||||||
dmu_buf_user_t *db_user;
|
dmu_buf_user_t *db_user;
|
||||||
|
|
||||||
/*
|
|
||||||
* Evict user data as soon as the dirty and reference
|
|
||||||
* counts are equal.
|
|
||||||
*/
|
|
||||||
uint8_t db_user_immediate_evict;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This block was freed while a read or write was
|
|
||||||
* active.
|
|
||||||
*/
|
|
||||||
uint8_t db_freed_in_flight;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* dnode_evict_dbufs() or dnode_evict_bonus() tried to
|
|
||||||
* evict this dbuf, but couldn't due to outstanding
|
|
||||||
* references. Evict once the refcount drops to 0.
|
|
||||||
*/
|
|
||||||
uint8_t db_pending_evict;
|
|
||||||
|
|
||||||
uint8_t db_dirtycnt;
|
|
||||||
|
|
||||||
/* The buffer was partially read. More reads may follow. */
|
|
||||||
uint8_t db_partial_read;
|
|
||||||
} dmu_buf_impl_t;
|
} dmu_buf_impl_t;
|
||||||
|
|
||||||
#define DBUF_HASH_MUTEX(h, idx) \
|
#define DBUF_HASH_MUTEX(h, idx) \
|
||||||
|
Loading…
Reference in New Issue
Block a user