mirror of
				https://git.proxmox.com/git/mirror_zfs.git
				synced 2025-10-26 18:05:04 +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
							
								
									2e4e092822
								
							
						
					
					
						commit
						94a03dd1e4
					
				@ -264,6 +264,27 @@ typedef struct dmu_buf_impl {
 | 
			
		||||
	 */
 | 
			
		||||
	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
 | 
			
		||||
	 * block of the meta-dnode. We use this lock to protect the structure of
 | 
			
		||||
@ -288,6 +309,9 @@ typedef struct dmu_buf_impl {
 | 
			
		||||
	 */
 | 
			
		||||
	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}.
 | 
			
		||||
	 * If nonzero, the buffer can't be destroyed.
 | 
			
		||||
@ -304,39 +328,10 @@ typedef struct dmu_buf_impl {
 | 
			
		||||
	/* Link in dbuf_cache or dbuf_metadata_cache */
 | 
			
		||||
	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;
 | 
			
		||||
 | 
			
		||||
	/* Data which is unique to data (leaf) blocks: */
 | 
			
		||||
 | 
			
		||||
	/* User callback information. */
 | 
			
		||||
	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;
 | 
			
		||||
 | 
			
		||||
#define	DBUF_HASH_MUTEX(h, idx) \
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user