Files
mirror_zfs/include/sys/arc.h
T

371 lines
12 KiB
C
Raw Normal View History

2025-01-04 11:04:27 +11:00
// SPDX-License-Identifier: CDDL-1.0
2008-11-20 12:01:55 -08:00
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
2022-07-11 23:16:13 +02:00
* or https://opensource.org/licenses/CDDL-1.0.
2008-11-20 12:01:55 -08:00
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2012, 2016 by Delphix. All rights reserved.
2013-08-01 13:02:10 -07:00
* Copyright (c) 2013 by Saso Kiselkov. All rights reserved.
2020-08-18 19:10:17 +02:00
* Copyright (c) 2019, Allan Jude
* Copyright (c) 2019, Klara Inc.
2008-11-20 12:01:55 -08:00
*/
#ifndef _SYS_ARC_H
#define _SYS_ARC_H
#include <sys/zfs_context.h>
#ifdef __cplusplus
extern "C" {
#endif
#include <sys/zio.h>
#include <sys/dmu.h>
#include <sys/spa.h>
2020-07-29 16:35:33 -07:00
#include <sys/zfs_refcount.h>
2008-11-20 12:01:55 -08:00
2015-01-12 19:52:19 -08:00
/*
* Used by arc_flush() to inform arc_evict_state() that it should evict
* all available buffers from the arc state being passed in.
*/
2021-07-20 10:13:21 -04:00
#define ARC_EVICT_ALL UINT64_MAX
2015-01-12 19:52:19 -08:00
/*
* ZFS gets very unhappy when the maximum ARC size is smaller than the maximum
* block size and a larger block is written. To leave some safety margin, we
* limit the minimum for zfs_arc_max to the maximium transaction size.
*/
#define MIN_ARC_MAX DMU_MAX_ACCESS
#define HDR_SET_LSIZE(hdr, x) do { \
ASSERT(IS_P2ALIGNED(x, 1U << SPA_MINBLOCKSHIFT)); \
(hdr)->b_lsize = ((x) >> SPA_MINBLOCKSHIFT); \
2021-06-05 16:02:41 +02:00
} while (0)
#define HDR_SET_PSIZE(hdr, x) do { \
ASSERT(IS_P2ALIGNED((x), 1U << SPA_MINBLOCKSHIFT)); \
(hdr)->b_psize = ((x) >> SPA_MINBLOCKSHIFT); \
2021-06-05 16:02:41 +02:00
} while (0)
/* The l2size in the header is only used by L2 cache */
#define HDR_SET_L2SIZE(hdr, x) do { \
ASSERT(IS_P2ALIGNED((x), 1U << SPA_MINBLOCKSHIFT)); \
(hdr)->b_l2size = ((x) >> SPA_MINBLOCKSHIFT); \
} while (0)
#define HDR_GET_LSIZE(hdr) ((hdr)->b_lsize << SPA_MINBLOCKSHIFT)
#define HDR_GET_PSIZE(hdr) ((hdr)->b_psize << SPA_MINBLOCKSHIFT)
#define HDR_GET_L2SIZE(hdr) ((hdr)->b_l2size << SPA_MINBLOCKSHIFT)
2008-11-20 12:01:55 -08:00
typedef struct arc_buf_hdr arc_buf_hdr_t;
typedef struct arc_buf arc_buf_t;
2011-12-22 12:20:43 -08:00
typedef struct arc_prune arc_prune_t;
2017-08-14 13:36:48 -04:00
/*
* Because the ARC can store encrypted data, errors (not due to bugs) may arise
* while transforming data into its desired format - specifically, when
* decrypting, the key may not be present, or the HMAC may not be correct
* which signifies deliberate tampering with the on-disk state
2017-11-15 20:27:01 -05:00
* (assuming that the checksum was correct). If any error occurs, the "buf"
* parameter will be NULL.
2017-08-14 13:36:48 -04:00
*/
2017-11-15 20:27:01 -05:00
typedef void arc_read_done_func_t(zio_t *zio, const zbookmark_phys_t *zb,
2020-06-06 15:54:04 -04:00
const blkptr_t *bp, arc_buf_t *buf, void *priv);
typedef void arc_write_done_func_t(zio_t *zio, arc_buf_t *buf, void *priv);
2023-10-30 19:56:04 -04:00
typedef void arc_prune_func_t(uint64_t bytes, void *priv);
2008-11-20 12:01:55 -08:00
/* Shared module parameters */
extern uint_t zfs_arc_average_blocksize;
extern int l2arc_exclude_special;
2008-11-20 12:01:55 -08:00
/* generic arc_done_func_t's which you can use */
2017-08-14 13:36:48 -04:00
arc_read_done_func_t arc_bcopy_func;
arc_read_done_func_t arc_getbuf_func;
2008-11-20 12:01:55 -08:00
2011-12-22 12:20:43 -08:00
/* generic arc_prune_func_t wrapper for callbacks */
struct arc_prune {
arc_prune_func_t *p_pfunc;
void *p_private;
2015-05-30 09:57:53 -05:00
uint64_t p_adjust;
2011-12-22 12:20:43 -08:00
list_node_t p_node;
zfs_refcount_t p_refcnt;
2011-12-22 12:20:43 -08:00
};
2015-05-30 09:57:53 -05:00
typedef enum arc_strategy {
ARC_STRATEGY_META_ONLY = 0, /* Evict only meta data buffers */
ARC_STRATEGY_META_BALANCED = 1, /* Evict data buffers if needed */
} arc_strategy_t;
2014-12-06 09:24:32 -08:00
typedef enum arc_flags
{
/*
* Public flags that can be passed into the ARC by external consumers.
*/
ARC_FLAG_WAIT = 1 << 0, /* perform sync I/O */
ARC_FLAG_NOWAIT = 1 << 1, /* perform async I/O */
ARC_FLAG_PREFETCH = 1 << 2, /* I/O is a prefetch */
ARC_FLAG_CACHED = 1 << 3, /* I/O was in cache */
ARC_FLAG_L2CACHE = 1 << 4, /* cache in L2ARC */
2023-01-04 19:29:54 -05:00
ARC_FLAG_UNCACHED = 1 << 5, /* evict after use */
2017-11-15 20:27:01 -05:00
ARC_FLAG_PRESCIENT_PREFETCH = 1 << 6, /* long min lifespan */
2014-12-06 09:24:32 -08:00
/*
* Private ARC flags. These flags are private ARC only flags that
2024-09-14 16:47:59 -04:00
* will show up in b_flags in the arc_buf_hdr_t. These flags should
2014-12-06 09:24:32 -08:00
* only be set by ARC code.
*/
2017-11-15 20:27:01 -05:00
ARC_FLAG_IN_HASH_TABLE = 1 << 7, /* buffer is hashed */
ARC_FLAG_IO_IN_PROGRESS = 1 << 8, /* I/O in progress */
ARC_FLAG_IO_ERROR = 1 << 9, /* I/O failed for buf */
ARC_FLAG_INDIRECT = 1 << 10, /* indirect block */
2015-12-26 22:10:31 +01:00
/* Indicates that block was read with ASYNC priority. */
2017-11-15 20:27:01 -05:00
ARC_FLAG_PRIO_ASYNC_READ = 1 << 11,
ARC_FLAG_L2_WRITING = 1 << 12, /* write in progress */
ARC_FLAG_L2_EVICTED = 1 << 13, /* evicted during I/O */
ARC_FLAG_L2_WRITE_HEAD = 1 << 14, /* head of write list */
2017-08-14 13:36:48 -04:00
/*
* Encrypted or authenticated on disk (may be plaintext in memory).
* This header has b_crypt_hdr allocated. Does not include indirect
* blocks with checksums of MACs which will also have their X
* (encrypted) bit set in the bp.
*/
2017-11-15 20:27:01 -05:00
ARC_FLAG_PROTECTED = 1 << 15,
2017-08-14 13:36:48 -04:00
/* data has not been authenticated yet */
2017-11-15 20:27:01 -05:00
ARC_FLAG_NOAUTH = 1 << 16,
/* indicates that the buffer contains metadata (otherwise, data) */
2017-11-15 20:27:01 -05:00
ARC_FLAG_BUFC_METADATA = 1 << 17,
/* Flags specifying whether optional hdr struct fields are defined */
2017-11-15 20:27:01 -05:00
ARC_FLAG_HAS_L1HDR = 1 << 18,
ARC_FLAG_HAS_L2HDR = 1 << 19,
/*
* Indicates the arc_buf_hdr_t's b_pdata matches the on-disk data.
* This allows the l2arc to use the blkptr's checksum to verify
* the data without having to store the checksum in the hdr.
*/
2017-11-15 20:27:01 -05:00
ARC_FLAG_COMPRESSED_ARC = 1 << 20,
ARC_FLAG_SHARED_DATA = 1 << 21,
/*
* Fail this arc_read() (with ENOENT) if the data is not already present
* in cache.
*/
ARC_FLAG_CACHED_ONLY = 1 << 22,
/*
* Don't instantiate an arc_buf_t for arc_read_done.
*/
ARC_FLAG_NO_BUF = 1 << 23,
/*
* The arc buffer's compression mode is stored in the top 7 bits of the
* flags field, so these dummy flags are included so that MDB can
* interpret the enum properly.
*/
ARC_FLAG_COMPRESS_0 = 1 << 24,
ARC_FLAG_COMPRESS_1 = 1 << 25,
ARC_FLAG_COMPRESS_2 = 1 << 26,
ARC_FLAG_COMPRESS_3 = 1 << 27,
ARC_FLAG_COMPRESS_4 = 1 << 28,
ARC_FLAG_COMPRESS_5 = 1 << 29,
ARC_FLAG_COMPRESS_6 = 1 << 30
2014-12-06 09:24:32 -08:00
} arc_flags_t;
typedef enum arc_buf_flags {
ARC_BUF_FLAG_SHARED = 1 << 0,
2017-08-14 13:36:48 -04:00
ARC_BUF_FLAG_COMPRESSED = 1 << 1,
/*
* indicates whether this arc_buf_t is encrypted, regardless of
* state on-disk
*/
ARC_BUF_FLAG_ENCRYPTED = 1 << 2
} arc_buf_flags_t;
2008-11-20 12:01:55 -08:00
struct arc_buf {
arc_buf_hdr_t *b_hdr;
arc_buf_t *b_next;
void *b_data;
arc_buf_flags_t b_flags;
2008-11-20 12:01:55 -08:00
};
typedef enum arc_buf_contents {
ARC_BUFC_DATA, /* buffer contains data */
ARC_BUFC_METADATA, /* buffer contains metadata */
ARC_BUFC_NUMTYPES
} arc_buf_contents_t;
2009-02-18 12:51:31 -08:00
/*
2019-08-30 18:53:15 +02:00
* The following breakdowns of arc_size exist for kstat only.
2009-02-18 12:51:31 -08:00
*/
typedef enum arc_space_type {
ARC_SPACE_DATA,
2014-02-03 12:41:47 -08:00
ARC_SPACE_META,
2009-02-18 12:51:31 -08:00
ARC_SPACE_HDRS,
ARC_SPACE_L2HDRS,
ARC_SPACE_DBUF,
ARC_SPACE_DNODE,
ARC_SPACE_BONUS,
2020-08-17 20:04:04 -07:00
ARC_SPACE_ABD_CHUNK_WASTE,
2009-02-18 12:51:31 -08:00
ARC_SPACE_NUMTYPES
} arc_space_type_t;
2013-10-02 17:11:19 -07:00
typedef enum arc_state_type {
ARC_STATE_ANON,
ARC_STATE_MRU,
ARC_STATE_MRU_GHOST,
ARC_STATE_MFU,
ARC_STATE_MFU_GHOST,
ARC_STATE_L2C_ONLY,
2023-01-04 19:29:54 -05:00
ARC_STATE_UNCACHED,
2013-10-02 17:11:19 -07:00
ARC_STATE_NUMTYPES
} arc_state_type_t;
typedef struct arc_buf_info {
arc_state_type_t abi_state_type;
arc_buf_contents_t abi_state_contents;
uint32_t abi_flags;
uint32_t abi_bufcnt;
2013-10-02 17:11:19 -07:00
uint64_t abi_size;
uint64_t abi_spa;
uint64_t abi_access;
uint32_t abi_mru_hits;
uint32_t abi_mru_ghost_hits;
uint32_t abi_mfu_hits;
uint32_t abi_mfu_ghost_hits;
uint32_t abi_l2arc_hits;
uint32_t abi_holds;
uint64_t abi_l2arc_dattr;
uint64_t abi_l2arc_asize;
enum zio_compress abi_l2arc_compress;
} arc_buf_info_t;
/*
* Flags returned by arc_cached; describes which part of the arc
* the block is cached in.
*/
#define ARC_CACHED_EMBEDDED (1U << 0)
#define ARC_CACHED_IN_L1 (1U << 1)
#define ARC_CACHED_IN_MRU (1U << 2)
#define ARC_CACHED_IN_MFU (1U << 3)
#define ARC_CACHED_IN_L2 (1U << 4)
2009-02-18 12:51:31 -08:00
void arc_space_consume(uint64_t space, arc_space_type_t type);
void arc_space_return(uint64_t space, arc_space_type_t type);
boolean_t arc_is_metadata(arc_buf_t *buf);
2017-08-14 13:36:48 -04:00
boolean_t arc_is_encrypted(arc_buf_t *buf);
boolean_t arc_is_unauthenticated(arc_buf_t *buf);
enum zio_compress arc_get_compression(arc_buf_t *buf);
2017-08-14 13:36:48 -04:00
void arc_get_raw_params(arc_buf_t *buf, boolean_t *byteorder, uint8_t *salt,
uint8_t *iv, uint8_t *mac);
2018-03-31 14:12:51 -04:00
int arc_untransform(arc_buf_t *buf, spa_t *spa, const zbookmark_phys_t *zb,
2017-08-14 13:36:48 -04:00
boolean_t in_place);
void arc_convert_to_raw(arc_buf_t *buf, uint64_t dsobj, boolean_t byteorder,
dmu_object_type_t ot, const uint8_t *salt, const uint8_t *iv,
const uint8_t *mac);
2022-04-19 20:38:30 +02:00
arc_buf_t *arc_alloc_buf(spa_t *spa, const void *tag, arc_buf_contents_t type,
int32_t size);
2022-04-19 20:38:30 +02:00
arc_buf_t *arc_alloc_compressed_buf(spa_t *spa, const void *tag,
2020-08-18 19:10:17 +02:00
uint64_t psize, uint64_t lsize, enum zio_compress compression_type,
uint8_t complevel);
2022-04-19 20:38:30 +02:00
arc_buf_t *arc_alloc_raw_buf(spa_t *spa, const void *tag, uint64_t dsobj,
2017-08-14 13:36:48 -04:00
boolean_t byteorder, const uint8_t *salt, const uint8_t *iv,
const uint8_t *mac, dmu_object_type_t ot, uint64_t psize, uint64_t lsize,
2020-08-18 19:10:17 +02:00
enum zio_compress compression_type, uint8_t complevel);
uint8_t arc_get_complevel(arc_buf_t *buf);
arc_buf_t *arc_loan_buf(spa_t *spa, boolean_t is_metadata, int size);
arc_buf_t *arc_loan_compressed_buf(spa_t *spa, uint64_t psize, uint64_t lsize,
2020-08-18 19:10:17 +02:00
enum zio_compress compression_type, uint8_t complevel);
2017-08-14 13:36:48 -04:00
arc_buf_t *arc_loan_raw_buf(spa_t *spa, uint64_t dsobj, boolean_t byteorder,
const uint8_t *salt, const uint8_t *iv, const uint8_t *mac,
dmu_object_type_t ot, uint64_t psize, uint64_t lsize,
2020-08-18 19:10:17 +02:00
enum zio_compress compression_type, uint8_t complevel);
2022-04-19 20:49:30 +02:00
void arc_return_buf(arc_buf_t *buf, const void *tag);
void arc_loan_inuse_buf(arc_buf_t *buf, const void *tag);
void arc_buf_destroy(arc_buf_t *buf, const void *tag);
2013-10-02 17:11:19 -07:00
void arc_buf_info(arc_buf_t *buf, arc_buf_info_t *abi, int state_index);
uint64_t arc_buf_size(arc_buf_t *buf);
uint64_t arc_buf_lsize(arc_buf_t *buf);
2018-01-08 09:52:36 -08:00
void arc_buf_access(arc_buf_t *buf);
2022-04-19 20:49:30 +02:00
void arc_release(arc_buf_t *buf, const void *tag);
2008-11-20 12:01:55 -08:00
int arc_released(arc_buf_t *buf);
2013-05-16 14:18:06 -07:00
void arc_buf_sigsegv(int sig, siginfo_t *si, void *unused);
2008-11-20 12:01:55 -08:00
void arc_buf_freeze(arc_buf_t *buf);
void arc_buf_thaw(arc_buf_t *buf);
#ifdef ZFS_DEBUG
int arc_referenced(arc_buf_t *buf);
#else
#define arc_referenced(buf) ((void) sizeof (buf), 0)
2008-11-20 12:01:55 -08:00
#endif
2013-07-02 13:26:24 -07:00
int arc_read(zio_t *pio, spa_t *spa, const blkptr_t *bp,
2020-06-06 15:54:04 -04:00
arc_read_done_func_t *done, void *priv, zio_priority_t priority,
2017-08-14 13:36:48 -04:00
int flags, arc_flags_t *arc_flags, const zbookmark_phys_t *zb);
2023-01-04 19:29:54 -05:00
zio_t *arc_write(zio_t *pio, spa_t *spa, uint64_t txg, blkptr_t *bp,
arc_buf_t *buf, boolean_t uncached, boolean_t l2arc, const zio_prop_t *zp,
2017-08-14 13:36:48 -04:00
arc_write_done_func_t *ready, arc_write_done_func_t *child_ready,
2023-06-15 13:49:03 -04:00
arc_write_done_func_t *done, void *priv, zio_priority_t priority,
int zio_flags, const zbookmark_phys_t *zb);
2008-11-20 12:01:55 -08:00
2020-06-06 15:54:04 -04:00
arc_prune_t *arc_add_prune_callback(arc_prune_func_t *func, void *priv);
2011-12-22 12:20:43 -08:00
void arc_remove_prune_callback(arc_prune_t *p);
void arc_freed(spa_t *spa, const blkptr_t *bp);
int arc_cached(spa_t *spa, const blkptr_t *bp);
2011-12-22 12:20:43 -08:00
2015-01-12 19:52:19 -08:00
void arc_flush(spa_t *spa, boolean_t retry);
void arc_flush_async(spa_t *spa);
2008-11-20 12:01:55 -08:00
void arc_tempreserve_clear(uint64_t reserve);
int arc_tempreserve_space(spa_t *spa, uint64_t reserve, uint64_t txg);
boolean_t arc_async_flush_guid_inuse(uint64_t load_guid);
2008-11-20 12:01:55 -08:00
2019-08-16 08:08:21 -07:00
uint64_t arc_all_memory(void);
2020-03-27 12:14:46 -04:00
uint64_t arc_default_max(uint64_t min, uint64_t allmem);
2017-09-30 08:49:19 +10:00
uint64_t arc_target_bytes(void);
2020-12-10 14:09:23 -08:00
void arc_set_limits(uint64_t);
2008-11-20 12:01:55 -08:00
void arc_init(void);
void arc_fini(void);
/*
* Level 2 ARC
*/
2009-07-02 15:44:48 -07:00
void l2arc_add_vdev(spa_t *spa, vdev_t *vd);
2008-11-20 12:01:55 -08:00
void l2arc_remove_vdev(vdev_t *vd);
boolean_t l2arc_vdev_present(vdev_t *vd);
2020-04-10 13:33:35 -04:00
void l2arc_rebuild_vdev(vdev_t *vd, boolean_t reopen);
boolean_t l2arc_range_check_overlap(uint64_t bottom, uint64_t top,
uint64_t check);
2008-11-20 12:01:55 -08:00
void l2arc_init(void);
void l2arc_fini(void);
void l2arc_start(void);
void l2arc_stop(void);
2020-04-10 13:33:35 -04:00
void l2arc_spa_rebuild_start(spa_t *spa);
void l2arc_spa_rebuild_stop(spa_t *spa);
2008-11-20 12:01:55 -08:00
2013-05-16 14:18:06 -07:00
#ifndef _KERNEL
extern boolean_t arc_watch;
#endif
2008-11-20 12:01:55 -08:00
#ifdef __cplusplus
}
#endif
#endif /* _SYS_ARC_H */