]>
Commit | Line | Data |
---|---|---|
59ec819a NB |
1 | /* |
2 | * CDDL HEADER START | |
3 | * | |
4 | * The contents of this file are subject to the terms of the | |
5 | * Common Development and Distribution License (the "License"). | |
6 | * You may not use this file except in compliance with the License. | |
7 | * | |
8 | * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE | |
1d3ba0bf | 9 | * or https://opensource.org/licenses/CDDL-1.0. |
59ec819a NB |
10 | * See the License for the specific language governing permissions |
11 | * and limitations under the License. | |
12 | * | |
13 | * When distributing Covered Code, include this CDDL HEADER in each | |
14 | * file and include the License file at usr/src/OPENSOLARIS.LICENSE. | |
15 | * If applicable, add the following below this CDDL HEADER, with the | |
16 | * fields enclosed by brackets "[]" replaced with your own identifying | |
17 | * information: Portions Copyright [yyyy] [name of copyright owner] | |
18 | * | |
19 | * CDDL HEADER END | |
20 | */ | |
21 | /* | |
22 | * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. | |
77f6826b GA |
23 | * Copyright (c) 2013, Delphix. All rights reserved. |
24 | * Copyright (c) 2013, Saso Kiselkov. All rights reserved. | |
25 | * Copyright (c) 2013, Nexenta Systems, Inc. All rights reserved. | |
26 | * Copyright (c) 2020, George Amanakis. All rights reserved. | |
59ec819a NB |
27 | */ |
28 | ||
29 | #ifndef _SYS_ARC_IMPL_H | |
30 | #define _SYS_ARC_IMPL_H | |
31 | ||
32 | #include <sys/arc.h> | |
5f42d1db | 33 | #include <sys/multilist.h> |
b5256303 | 34 | #include <sys/zio_crypt.h> |
c9c9c1e2 MM |
35 | #include <sys/zthr.h> |
36 | #include <sys/aggsum.h> | |
c4c162c1 | 37 | #include <sys/wmsum.h> |
59ec819a NB |
38 | |
39 | #ifdef __cplusplus | |
40 | extern "C" { | |
41 | #endif | |
42 | ||
43 | /* | |
44 | * Note that buffers can be in one of 6 states: | |
45 | * ARC_anon - anonymous (discussed below) | |
46 | * ARC_mru - recently used, currently cached | |
cf7c5a03 | 47 | * ARC_mru_ghost - recently used, no longer in cache |
59ec819a NB |
48 | * ARC_mfu - frequently used, currently cached |
49 | * ARC_mfu_ghost - frequently used, no longer in cache | |
ed2f7ba0 | 50 | * ARC_uncached - uncacheable prefetch, to be evicted |
59ec819a NB |
51 | * ARC_l2c_only - exists in L2ARC but not other states |
52 | * When there are no active references to the buffer, they are | |
53 | * are linked onto a list in one of these arc states. These are | |
54 | * the only buffers that can be evicted or deleted. Within each | |
55 | * state there are multiple lists, one for meta-data and one for | |
56 | * non-meta-data. Meta-data (indirect blocks, blocks of dnodes, | |
57 | * etc.) is tracked separately so that it can be managed more | |
58 | * explicitly: favored over data, limited explicitly. | |
59 | * | |
60 | * Anonymous buffers are buffers that are not associated with | |
61 | * a DVA. These are buffers that hold dirty block copies | |
62 | * before they are written to stable storage. By definition, | |
63 | * they are "ref'd" and are considered part of arc_mru | |
4e33ba4c | 64 | * that cannot be freed. Generally, they will acquire a DVA |
59ec819a NB |
65 | * as they are written and migrate onto the arc_mru list. |
66 | * | |
67 | * The ARC_l2c_only state is for buffers that are in the second | |
68 | * level ARC but no longer in any of the ARC_m* lists. The second | |
69 | * level ARC itself may also contain buffers that are in any of | |
70 | * the ARC_m* states - meaning that a buffer can exist in two | |
71 | * places. The reason for the ARC_l2c_only state is to keep the | |
72 | * buffer header in the hash table, so that reads that hit the | |
73 | * second level ARC benefit from these fast lookups. | |
74 | */ | |
75 | ||
76 | typedef struct arc_state { | |
ca0bf58d PS |
77 | /* |
78 | * list of evictable buffers | |
79 | */ | |
ffdf019c AM |
80 | multilist_t arcs_list[ARC_BUFC_NUMTYPES]; |
81 | /* | |
82 | * supports the "dbufs" kstat | |
83 | */ | |
84 | arc_state_type_t arcs_state; | |
a8d83e2a AM |
85 | /* |
86 | * total amount of data in this state. | |
87 | */ | |
88 | zfs_refcount_t arcs_size[ARC_BUFC_NUMTYPES] ____cacheline_aligned; | |
ca0bf58d PS |
89 | /* |
90 | * total amount of evictable data in this state | |
91 | */ | |
a8d83e2a | 92 | zfs_refcount_t arcs_esize[ARC_BUFC_NUMTYPES]; |
ca0bf58d | 93 | /* |
a8d83e2a | 94 | * amount of hit bytes for this state (counted only for ghost states) |
ca0bf58d | 95 | */ |
a8d83e2a | 96 | wmsum_t arcs_hits[ARC_BUFC_NUMTYPES]; |
59ec819a NB |
97 | } arc_state_t; |
98 | ||
59ec819a NB |
99 | typedef struct arc_callback arc_callback_t; |
100 | ||
101 | struct arc_callback { | |
102 | void *acb_private; | |
b5256303 | 103 | arc_read_done_func_t *acb_done; |
59ec819a | 104 | arc_buf_t *acb_buf; |
b5256303 | 105 | boolean_t acb_encrypted; |
2aa34383 | 106 | boolean_t acb_compressed; |
b5256303 | 107 | boolean_t acb_noauth; |
923d7303 | 108 | boolean_t acb_nobuf; |
c935fe2e AM |
109 | boolean_t acb_wait; |
110 | int acb_wait_error; | |
111 | kmutex_t acb_wait_lock; | |
112 | kcondvar_t acb_wait_cv; | |
be9a5c35 | 113 | zbookmark_phys_t acb_zb; |
59ec819a | 114 | zio_t *acb_zio_dummy; |
a8b2e306 | 115 | zio_t *acb_zio_head; |
c935fe2e | 116 | arc_callback_t *acb_prev; |
59ec819a NB |
117 | arc_callback_t *acb_next; |
118 | }; | |
119 | ||
120 | typedef struct arc_write_callback arc_write_callback_t; | |
121 | ||
122 | struct arc_write_callback { | |
b5256303 TC |
123 | void *awcb_private; |
124 | arc_write_done_func_t *awcb_ready; | |
125 | arc_write_done_func_t *awcb_children_ready; | |
b5256303 TC |
126 | arc_write_done_func_t *awcb_done; |
127 | arc_buf_t *awcb_buf; | |
59ec819a NB |
128 | }; |
129 | ||
b9541d6b CW |
130 | /* |
131 | * ARC buffers are separated into multiple structs as a memory saving measure: | |
132 | * - Common fields struct, always defined, and embedded within it: | |
133 | * - L2-only fields, always allocated but undefined when not in L2ARC | |
134 | * - L1-only fields, only allocated when in L1ARC | |
135 | * | |
136 | * Buffer in L1 Buffer only in L2 | |
137 | * +------------------------+ +------------------------+ | |
138 | * | arc_buf_hdr_t | | arc_buf_hdr_t | | |
139 | * | | | | | |
140 | * | | | | | |
141 | * | | | | | |
142 | * +------------------------+ +------------------------+ | |
143 | * | l2arc_buf_hdr_t | | l2arc_buf_hdr_t | | |
144 | * | (undefined if L1-only) | | | | |
145 | * +------------------------+ +------------------------+ | |
146 | * | l1arc_buf_hdr_t | | |
147 | * | | | |
148 | * | | | |
149 | * | | | |
150 | * | | | |
151 | * +------------------------+ | |
152 | * | |
153 | * Because it's possible for the L2ARC to become extremely large, we can wind | |
154 | * up eating a lot of memory in L2ARC buffer headers, so the size of a header | |
155 | * is minimized by only allocating the fields necessary for an L1-cached buffer | |
156 | * when a header is actually in the L1 cache. The sub-headers (l1arc_buf_hdr and | |
157 | * l2arc_buf_hdr) are embedded rather than allocated separately to save a couple | |
158 | * words in pointers. arc_hdr_realloc() is used to switch a header between | |
159 | * these two allocation states. | |
160 | */ | |
161 | typedef struct l1arc_buf_hdr { | |
59ec819a NB |
162 | /* protected by arc state mutex */ |
163 | arc_state_t *b_state; | |
ca0bf58d | 164 | multilist_node_t b_arc_node; |
59ec819a | 165 | |
cfe8e960 | 166 | /* protected by hash lock */ |
59ec819a NB |
167 | clock_t b_arc_access; |
168 | uint32_t b_mru_hits; | |
169 | uint32_t b_mru_ghost_hits; | |
170 | uint32_t b_mfu_hits; | |
171 | uint32_t b_mfu_ghost_hits; | |
96b9cf42 | 172 | uint8_t b_byteswap; |
cfe8e960 | 173 | arc_buf_t *b_buf; |
59ec819a NB |
174 | |
175 | /* self protecting */ | |
c13060e4 | 176 | zfs_refcount_t b_refcnt; |
59ec819a | 177 | |
b9541d6b | 178 | arc_callback_t *b_acb; |
a6255b7f | 179 | abd_t *b_pabd; |
bacf366f AM |
180 | |
181 | #ifdef ZFS_DEBUG | |
182 | zio_cksum_t *b_freeze_cksum; | |
183 | kmutex_t b_freeze_lock; | |
184 | #endif | |
b9541d6b | 185 | } l1arc_buf_hdr_t; |
59ec819a | 186 | |
77f6826b GA |
187 | typedef enum l2arc_dev_hdr_flags_t { |
188 | L2ARC_DEV_HDR_EVICT_FIRST = (1 << 0) /* mirror of l2ad_first */ | |
189 | } l2arc_dev_hdr_flags_t; | |
190 | ||
191 | /* | |
192 | * Pointer used in persistent L2ARC (for pointing to log blocks). | |
193 | */ | |
194 | typedef struct l2arc_log_blkptr { | |
195 | /* | |
196 | * Offset of log block within the device, in bytes | |
197 | */ | |
198 | uint64_t lbp_daddr; | |
199 | /* | |
200 | * Aligned payload size (in bytes) of the log block | |
201 | */ | |
202 | uint64_t lbp_payload_asize; | |
203 | /* | |
204 | * Offset in bytes of the first buffer in the payload | |
205 | */ | |
206 | uint64_t lbp_payload_start; | |
207 | /* | |
208 | * lbp_prop has the following format: | |
209 | * * logical size (in bytes) | |
657fd33b | 210 | * * aligned (after compression) size (in bytes) |
77f6826b GA |
211 | * * compression algorithm (we always LZ4-compress l2arc logs) |
212 | * * checksum algorithm (used for lbp_cksum) | |
213 | */ | |
214 | uint64_t lbp_prop; | |
215 | zio_cksum_t lbp_cksum; /* checksum of log */ | |
216 | } l2arc_log_blkptr_t; | |
217 | ||
218 | /* | |
219 | * The persistent L2ARC device header. | |
220 | * Byte order of magic determines whether 64-bit bswap of fields is necessary. | |
221 | */ | |
222 | typedef struct l2arc_dev_hdr_phys { | |
223 | uint64_t dh_magic; /* L2ARC_DEV_HDR_MAGIC */ | |
224 | uint64_t dh_version; /* Persistent L2ARC version */ | |
225 | ||
226 | /* | |
227 | * Global L2ARC device state and metadata. | |
228 | */ | |
229 | uint64_t dh_spa_guid; | |
230 | uint64_t dh_vdev_guid; | |
657fd33b | 231 | uint64_t dh_log_entries; /* mirror of l2ad_log_entries */ |
77f6826b GA |
232 | uint64_t dh_evict; /* evicted offset in bytes */ |
233 | uint64_t dh_flags; /* l2arc_dev_hdr_flags_t */ | |
234 | /* | |
235 | * Used in zdb.c for determining if a log block is valid, in the same | |
236 | * way that l2arc_rebuild() does. | |
237 | */ | |
657fd33b GA |
238 | uint64_t dh_start; /* mirror of l2ad_start */ |
239 | uint64_t dh_end; /* mirror of l2ad_end */ | |
77f6826b GA |
240 | /* |
241 | * Start of log block chain. [0] -> newest log, [1] -> one older (used | |
242 | * for initiating prefetch). | |
243 | */ | |
244 | l2arc_log_blkptr_t dh_start_lbps[2]; | |
657fd33b GA |
245 | /* |
246 | * Aligned size of all log blocks as accounted by vdev_space_update(). | |
247 | */ | |
248 | uint64_t dh_lb_asize; /* mirror of l2ad_lb_asize */ | |
249 | uint64_t dh_lb_count; /* mirror of l2ad_lb_count */ | |
b7654bd7 GA |
250 | /* |
251 | * Mirrors of vdev_trim_action_time and vdev_trim_state, used to | |
252 | * display when the cache device was fully trimmed for the last | |
253 | * time. | |
254 | */ | |
255 | uint64_t dh_trim_action_time; | |
256 | uint64_t dh_trim_state; | |
257 | const uint64_t dh_pad[30]; /* pad to 512 bytes */ | |
77f6826b GA |
258 | zio_eck_t dh_tail; |
259 | } l2arc_dev_hdr_phys_t; | |
c70bb2f6 AZ |
260 | _Static_assert(sizeof (l2arc_dev_hdr_phys_t) == SPA_MINBLOCKSIZE, |
261 | "l2arc_dev_hdr_phys_t wrong size"); | |
77f6826b GA |
262 | |
263 | /* | |
264 | * A single ARC buffer header entry in a l2arc_log_blk_phys_t. | |
265 | */ | |
266 | typedef struct l2arc_log_ent_phys { | |
267 | dva_t le_dva; /* dva of buffer */ | |
268 | uint64_t le_birth; /* birth txg of buffer */ | |
269 | /* | |
270 | * le_prop has the following format: | |
271 | * * logical size (in bytes) | |
272 | * * physical (compressed) size (in bytes) | |
273 | * * compression algorithm | |
274 | * * object type (used to restore arc_buf_contents_t) | |
275 | * * protected status (used for encryption) | |
276 | * * prefetch status (used in l2arc_read_done()) | |
277 | */ | |
278 | uint64_t le_prop; | |
279 | uint64_t le_daddr; /* buf location on l2dev */ | |
10b3c7f5 | 280 | uint64_t le_complevel; |
77f6826b GA |
281 | /* |
282 | * We pad the size of each entry to a power of 2 so that the size of | |
283 | * l2arc_log_blk_phys_t is power-of-2 aligned with SPA_MINBLOCKSHIFT, | |
284 | * because of the L2ARC_SET_*SIZE macros. | |
285 | */ | |
10b3c7f5 | 286 | const uint64_t le_pad[2]; /* pad to 64 bytes */ |
77f6826b GA |
287 | } l2arc_log_ent_phys_t; |
288 | ||
289 | #define L2ARC_LOG_BLK_MAX_ENTRIES (1022) | |
290 | ||
291 | /* | |
292 | * A log block of up to 1022 ARC buffer log entries, chained into the | |
293 | * persistent L2ARC metadata linked list. Byte order of magic determines | |
294 | * whether 64-bit bswap of fields is necessary. | |
295 | */ | |
296 | typedef struct l2arc_log_blk_phys { | |
297 | uint64_t lb_magic; /* L2ARC_LOG_BLK_MAGIC */ | |
298 | /* | |
299 | * There are 2 chains (headed by dh_start_lbps[2]), and this field | |
300 | * points back to the previous block in this chain. We alternate | |
301 | * which chain we append to, so they are time-wise and offset-wise | |
302 | * interleaved, but that is an optimization rather than for | |
303 | * correctness. | |
304 | */ | |
305 | l2arc_log_blkptr_t lb_prev_lbp; /* pointer to prev log block */ | |
306 | /* | |
307 | * Pad header section to 128 bytes | |
308 | */ | |
309 | uint64_t lb_pad[7]; | |
310 | /* Payload */ | |
311 | l2arc_log_ent_phys_t lb_entries[L2ARC_LOG_BLK_MAX_ENTRIES]; | |
312 | } l2arc_log_blk_phys_t; /* 64K total */ | |
313 | ||
314 | /* | |
315 | * The size of l2arc_log_blk_phys_t has to be power-of-2 aligned with | |
316 | * SPA_MINBLOCKSHIFT because of L2BLK_SET_*SIZE macros. | |
317 | */ | |
c70bb2f6 AZ |
318 | _Static_assert(IS_P2ALIGNED(sizeof (l2arc_log_blk_phys_t), |
319 | 1ULL << SPA_MINBLOCKSHIFT), "l2arc_log_blk_phys_t misaligned"); | |
320 | _Static_assert(sizeof (l2arc_log_blk_phys_t) >= SPA_MINBLOCKSIZE, | |
321 | "l2arc_log_blk_phys_t too small"); | |
322 | _Static_assert(sizeof (l2arc_log_blk_phys_t) <= SPA_MAXBLOCKSIZE, | |
323 | "l2arc_log_blk_phys_t too big"); | |
77f6826b GA |
324 | |
325 | /* | |
326 | * These structures hold in-flight abd buffers for log blocks as they're being | |
327 | * written to the L2ARC device. | |
328 | */ | |
329 | typedef struct l2arc_lb_abd_buf { | |
330 | abd_t *abd; | |
331 | list_node_t node; | |
332 | } l2arc_lb_abd_buf_t; | |
333 | ||
334 | /* | |
335 | * These structures hold pointers to log blocks present on the L2ARC device. | |
336 | */ | |
337 | typedef struct l2arc_lb_ptr_buf { | |
338 | l2arc_log_blkptr_t *lb_ptr; | |
339 | list_node_t node; | |
340 | } l2arc_lb_ptr_buf_t; | |
341 | ||
342 | /* Macros for setting fields in le_prop and lbp_prop */ | |
343 | #define L2BLK_GET_LSIZE(field) \ | |
344 | BF64_GET_SB((field), 0, SPA_LSIZEBITS, SPA_MINBLOCKSHIFT, 1) | |
345 | #define L2BLK_SET_LSIZE(field, x) \ | |
346 | BF64_SET_SB((field), 0, SPA_LSIZEBITS, SPA_MINBLOCKSHIFT, 1, x) | |
347 | #define L2BLK_GET_PSIZE(field) \ | |
348 | BF64_GET_SB((field), 16, SPA_PSIZEBITS, SPA_MINBLOCKSHIFT, 1) | |
349 | #define L2BLK_SET_PSIZE(field, x) \ | |
350 | BF64_SET_SB((field), 16, SPA_PSIZEBITS, SPA_MINBLOCKSHIFT, 1, x) | |
351 | #define L2BLK_GET_COMPRESS(field) \ | |
352 | BF64_GET((field), 32, SPA_COMPRESSBITS) | |
353 | #define L2BLK_SET_COMPRESS(field, x) \ | |
354 | BF64_SET((field), 32, SPA_COMPRESSBITS, x) | |
355 | #define L2BLK_GET_PREFETCH(field) BF64_GET((field), 39, 1) | |
356 | #define L2BLK_SET_PREFETCH(field, x) BF64_SET((field), 39, 1, x) | |
357 | #define L2BLK_GET_CHECKSUM(field) BF64_GET((field), 40, 8) | |
358 | #define L2BLK_SET_CHECKSUM(field, x) BF64_SET((field), 40, 8, x) | |
a8d83e2a AM |
359 | /* +/- 1 here are to keep compatibility after ARC_BUFC_INVALID removal. */ |
360 | #define L2BLK_GET_TYPE(field) (BF64_GET((field), 48, 8) - 1) | |
361 | #define L2BLK_SET_TYPE(field, x) BF64_SET((field), 48, 8, (x) + 1) | |
77f6826b GA |
362 | #define L2BLK_GET_PROTECTED(field) BF64_GET((field), 56, 1) |
363 | #define L2BLK_SET_PROTECTED(field, x) BF64_SET((field), 56, 1, x) | |
08532162 GA |
364 | #define L2BLK_GET_STATE(field) BF64_GET((field), 57, 4) |
365 | #define L2BLK_SET_STATE(field, x) BF64_SET((field), 57, 4, x) | |
77f6826b GA |
366 | |
367 | #define PTR_SWAP(x, y) \ | |
368 | do { \ | |
369 | void *tmp = (x);\ | |
370 | x = y; \ | |
371 | y = tmp; \ | |
77f6826b GA |
372 | } while (0) |
373 | ||
374 | #define L2ARC_DEV_HDR_MAGIC 0x5a46534341434845LLU /* ASCII: "ZFSCACHE" */ | |
375 | #define L2ARC_LOG_BLK_MAGIC 0x4c4f47424c4b4844LLU /* ASCII: "LOGBLKHD" */ | |
376 | ||
377 | /* | |
378 | * L2ARC Internals | |
379 | */ | |
380 | typedef struct l2arc_dev { | |
381 | vdev_t *l2ad_vdev; /* vdev */ | |
382 | spa_t *l2ad_spa; /* spa */ | |
383 | uint64_t l2ad_hand; /* next write location */ | |
384 | uint64_t l2ad_start; /* first addr on device */ | |
385 | uint64_t l2ad_end; /* last addr on device */ | |
386 | boolean_t l2ad_first; /* first sweep through */ | |
387 | boolean_t l2ad_writing; /* currently writing */ | |
388 | kmutex_t l2ad_mtx; /* lock for buffer list */ | |
389 | list_t l2ad_buflist; /* buffer list */ | |
390 | list_node_t l2ad_node; /* device list node */ | |
391 | zfs_refcount_t l2ad_alloc; /* allocated bytes */ | |
392 | /* | |
393 | * Persistence-related stuff | |
394 | */ | |
395 | l2arc_dev_hdr_phys_t *l2ad_dev_hdr; /* persistent device header */ | |
396 | uint64_t l2ad_dev_hdr_asize; /* aligned hdr size */ | |
397 | l2arc_log_blk_phys_t l2ad_log_blk; /* currently open log block */ | |
398 | int l2ad_log_ent_idx; /* index into cur log blk */ | |
399 | /* Number of bytes in current log block's payload */ | |
400 | uint64_t l2ad_log_blk_payload_asize; | |
401 | /* | |
402 | * Offset (in bytes) of the first buffer in current log block's | |
403 | * payload. | |
404 | */ | |
405 | uint64_t l2ad_log_blk_payload_start; | |
406 | /* Flag indicating whether a rebuild is scheduled or is going on */ | |
407 | boolean_t l2ad_rebuild; | |
408 | boolean_t l2ad_rebuild_cancel; | |
409 | boolean_t l2ad_rebuild_began; | |
410 | uint64_t l2ad_log_entries; /* entries per log blk */ | |
411 | uint64_t l2ad_evict; /* evicted offset in bytes */ | |
412 | /* List of pointers to log blocks present in the L2ARC device */ | |
413 | list_t l2ad_lbptr_list; | |
657fd33b GA |
414 | /* |
415 | * Aligned size of all log blocks as accounted by vdev_space_update(). | |
416 | */ | |
417 | zfs_refcount_t l2ad_lb_asize; | |
418 | /* | |
419 | * Number of log blocks present on the device. | |
420 | */ | |
421 | zfs_refcount_t l2ad_lb_count; | |
b7654bd7 | 422 | boolean_t l2ad_trim_all; /* TRIM whole device */ |
77f6826b GA |
423 | } l2arc_dev_t; |
424 | ||
b5256303 TC |
425 | /* |
426 | * Encrypted blocks will need to be stored encrypted on the L2ARC | |
427 | * disk as they appear in the main pool. In order for this to work we | |
428 | * need to pass around the encryption parameters so they can be used | |
429 | * to write data to the L2ARC. This struct is only defined in the | |
430 | * arc_buf_hdr_t if the L1 header is defined and has the ARC_FLAG_ENCRYPTED | |
431 | * flag set. | |
432 | */ | |
433 | typedef struct arc_buf_hdr_crypt { | |
434 | abd_t *b_rabd; /* raw encrypted data */ | |
b5256303 TC |
435 | |
436 | /* dsobj for looking up encryption key for l2arc encryption */ | |
437 | uint64_t b_dsobj; | |
438 | ||
96b9cf42 AM |
439 | dmu_object_type_t b_ot; /* object type */ |
440 | ||
b5256303 TC |
441 | /* encryption parameters */ |
442 | uint8_t b_salt[ZIO_DATA_SALT_LEN]; | |
443 | uint8_t b_iv[ZIO_DATA_IV_LEN]; | |
444 | ||
445 | /* | |
446 | * Technically this could be removed since we will always be able to | |
447 | * get the mac from the bp when we need it. However, it is inconvenient | |
448 | * for callers of arc code to have to pass a bp in all the time. This | |
449 | * also allows us to assert that L2ARC data is properly encrypted to | |
450 | * match the data in the main storage pool. | |
451 | */ | |
452 | uint8_t b_mac[ZIO_DATA_MAC_LEN]; | |
453 | } arc_buf_hdr_crypt_t; | |
454 | ||
b9541d6b CW |
455 | typedef struct l2arc_buf_hdr { |
456 | /* protected by arc_buf_hdr mutex */ | |
457 | l2arc_dev_t *b_dev; /* L2ARC device */ | |
458 | uint64_t b_daddr; /* disk address, offset byte */ | |
b9541d6b | 459 | uint32_t b_hits; |
08532162 | 460 | arc_state_type_t b_arcs_state; |
b9541d6b CW |
461 | list_node_t b_l2node; |
462 | } l2arc_buf_hdr_t; | |
463 | ||
49ee64e5 NB |
464 | typedef struct l2arc_write_callback { |
465 | l2arc_dev_t *l2wcb_dev; /* device info */ | |
466 | arc_buf_hdr_t *l2wcb_head; /* head of write buflist */ | |
77f6826b GA |
467 | /* in-flight list of log blocks */ |
468 | list_t l2wcb_abd_list; | |
49ee64e5 NB |
469 | } l2arc_write_callback_t; |
470 | ||
b9541d6b CW |
471 | struct arc_buf_hdr { |
472 | /* protected by hash lock */ | |
473 | dva_t b_dva; | |
474 | uint64_t b_birth; | |
b9541d6b | 475 | |
d3c2ae1c | 476 | arc_buf_contents_t b_type; |
10b3c7f5 MN |
477 | uint8_t b_complevel; |
478 | uint8_t b_reserved1; /* used for 4 byte alignment */ | |
479 | uint16_t b_reserved2; /* used for 4 byte alignment */ | |
b9541d6b CW |
480 | arc_buf_hdr_t *b_hash_next; |
481 | arc_flags_t b_flags; | |
482 | ||
d3c2ae1c GW |
483 | /* |
484 | * This field stores the size of the data buffer after | |
485 | * compression, and is set in the arc's zio completion handlers. | |
486 | * It is in units of SPA_MINBLOCKSIZE (e.g. 1 == 512 bytes). | |
487 | * | |
488 | * While the block pointers can store up to 32MB in their psize | |
489 | * field, we can only store up to 32MB minus 512B. This is due | |
490 | * to the bp using a bias of 1, whereas we use a bias of 0 (i.e. | |
491 | * a field of zeros represents 512B in the bp). We can't use a | |
492 | * bias of 1 since we need to reserve a psize of zero, here, to | |
493 | * represent holes and embedded blocks. | |
494 | * | |
495 | * This isn't a problem in practice, since the maximum size of a | |
496 | * buffer is limited to 16MB, so we never need to store 32MB in | |
497 | * this field. Even in the upstream illumos code base, the | |
498 | * maximum size of a buffer is limited to 16MB. | |
499 | */ | |
500 | uint16_t b_psize; | |
501 | ||
502 | /* | |
503 | * This field stores the size of the data buffer before | |
504 | * compression, and cannot change once set. It is in units | |
505 | * of SPA_MINBLOCKSIZE (e.g. 2 == 1024 bytes) | |
506 | */ | |
507 | uint16_t b_lsize; /* immutable */ | |
508 | uint64_t b_spa; /* immutable */ | |
b9541d6b CW |
509 | |
510 | /* L2ARC fields. Undefined when not in L2ARC. */ | |
511 | l2arc_buf_hdr_t b_l2hdr; | |
512 | /* L1ARC fields. Undefined when in l2arc_only state */ | |
513 | l1arc_buf_hdr_t b_l1hdr; | |
b5256303 TC |
514 | /* |
515 | * Encryption parameters. Defined only when ARC_FLAG_ENCRYPTED | |
516 | * is set and the L1 header exists. | |
517 | */ | |
518 | arc_buf_hdr_crypt_t b_crypt_hdr; | |
b9541d6b | 519 | }; |
13a4027a MM |
520 | |
521 | typedef struct arc_stats { | |
c935fe2e | 522 | /* Number of requests that were satisfied without I/O. */ |
13a4027a | 523 | kstat_named_t arcstat_hits; |
c935fe2e AM |
524 | /* Number of requests for which I/O was already running. */ |
525 | kstat_named_t arcstat_iohits; | |
526 | /* Number of requests for which I/O has to be issued. */ | |
13a4027a | 527 | kstat_named_t arcstat_misses; |
c935fe2e | 528 | /* Same three, but specifically for demand data. */ |
13a4027a | 529 | kstat_named_t arcstat_demand_data_hits; |
c935fe2e | 530 | kstat_named_t arcstat_demand_data_iohits; |
13a4027a | 531 | kstat_named_t arcstat_demand_data_misses; |
c935fe2e | 532 | /* Same three, but specifically for demand metadata. */ |
13a4027a | 533 | kstat_named_t arcstat_demand_metadata_hits; |
c935fe2e | 534 | kstat_named_t arcstat_demand_metadata_iohits; |
13a4027a | 535 | kstat_named_t arcstat_demand_metadata_misses; |
c935fe2e | 536 | /* Same three, but specifically for prefetch data. */ |
13a4027a | 537 | kstat_named_t arcstat_prefetch_data_hits; |
c935fe2e | 538 | kstat_named_t arcstat_prefetch_data_iohits; |
13a4027a | 539 | kstat_named_t arcstat_prefetch_data_misses; |
c935fe2e | 540 | /* Same three, but specifically for prefetch metadata. */ |
13a4027a | 541 | kstat_named_t arcstat_prefetch_metadata_hits; |
c935fe2e | 542 | kstat_named_t arcstat_prefetch_metadata_iohits; |
13a4027a MM |
543 | kstat_named_t arcstat_prefetch_metadata_misses; |
544 | kstat_named_t arcstat_mru_hits; | |
545 | kstat_named_t arcstat_mru_ghost_hits; | |
546 | kstat_named_t arcstat_mfu_hits; | |
547 | kstat_named_t arcstat_mfu_ghost_hits; | |
ed2f7ba0 | 548 | kstat_named_t arcstat_uncached_hits; |
13a4027a MM |
549 | kstat_named_t arcstat_deleted; |
550 | /* | |
551 | * Number of buffers that could not be evicted because the hash lock | |
552 | * was held by another thread. The lock may not necessarily be held | |
553 | * by something using the same buffer, since hash locks are shared | |
554 | * by multiple buffers. | |
555 | */ | |
556 | kstat_named_t arcstat_mutex_miss; | |
557 | /* | |
558 | * Number of buffers skipped when updating the access state due to the | |
559 | * header having already been released after acquiring the hash lock. | |
560 | */ | |
561 | kstat_named_t arcstat_access_skip; | |
562 | /* | |
563 | * Number of buffers skipped because they have I/O in progress, are | |
564 | * indirect prefetch buffers that have not lived long enough, or are | |
565 | * not from the spa we're trying to evict from. | |
566 | */ | |
567 | kstat_named_t arcstat_evict_skip; | |
568 | /* | |
569 | * Number of times arc_evict_state() was unable to evict enough | |
570 | * buffers to reach its target amount. | |
571 | */ | |
572 | kstat_named_t arcstat_evict_not_enough; | |
573 | kstat_named_t arcstat_evict_l2_cached; | |
574 | kstat_named_t arcstat_evict_l2_eligible; | |
08532162 GA |
575 | kstat_named_t arcstat_evict_l2_eligible_mfu; |
576 | kstat_named_t arcstat_evict_l2_eligible_mru; | |
13a4027a MM |
577 | kstat_named_t arcstat_evict_l2_ineligible; |
578 | kstat_named_t arcstat_evict_l2_skip; | |
579 | kstat_named_t arcstat_hash_elements; | |
580 | kstat_named_t arcstat_hash_elements_max; | |
581 | kstat_named_t arcstat_hash_collisions; | |
582 | kstat_named_t arcstat_hash_chains; | |
583 | kstat_named_t arcstat_hash_chain_max; | |
a8d83e2a AM |
584 | kstat_named_t arcstat_meta; |
585 | kstat_named_t arcstat_pd; | |
586 | kstat_named_t arcstat_pm; | |
13a4027a MM |
587 | kstat_named_t arcstat_c; |
588 | kstat_named_t arcstat_c_min; | |
589 | kstat_named_t arcstat_c_max; | |
13a4027a MM |
590 | kstat_named_t arcstat_size; |
591 | /* | |
592 | * Number of compressed bytes stored in the arc_buf_hdr_t's b_pabd. | |
593 | * Note that the compressed bytes may match the uncompressed bytes | |
594 | * if the block is either not compressed or compressed arc is disabled. | |
595 | */ | |
596 | kstat_named_t arcstat_compressed_size; | |
597 | /* | |
598 | * Uncompressed size of the data stored in b_pabd. If compressed | |
599 | * arc is disabled then this value will be identical to the stat | |
600 | * above. | |
601 | */ | |
602 | kstat_named_t arcstat_uncompressed_size; | |
603 | /* | |
604 | * Number of bytes stored in all the arc_buf_t's. This is classified | |
605 | * as "overhead" since this data is typically short-lived and will | |
606 | * be evicted from the arc when it becomes unreferenced unless the | |
607 | * zfs_keep_uncompressed_metadata or zfs_keep_uncompressed_level | |
608 | * values have been set (see comment in dbuf.c for more information). | |
609 | */ | |
610 | kstat_named_t arcstat_overhead_size; | |
611 | /* | |
612 | * Number of bytes consumed by internal ARC structures necessary | |
613 | * for tracking purposes; these structures are not actually | |
614 | * backed by ARC buffers. This includes arc_buf_hdr_t structures | |
615 | * (allocated via arc_buf_hdr_t_full and arc_buf_hdr_t_l2only | |
616 | * caches), and arc_buf_t structures (allocated via arc_buf_t | |
617 | * cache). | |
13a4027a MM |
618 | */ |
619 | kstat_named_t arcstat_hdr_size; | |
620 | /* | |
621 | * Number of bytes consumed by ARC buffers of type equal to | |
622 | * ARC_BUFC_DATA. This is generally consumed by buffers backing | |
623 | * on disk user data (e.g. plain file contents). | |
13a4027a MM |
624 | */ |
625 | kstat_named_t arcstat_data_size; | |
626 | /* | |
627 | * Number of bytes consumed by ARC buffers of type equal to | |
628 | * ARC_BUFC_METADATA. This is generally consumed by buffers | |
629 | * backing on disk data that is used for internal ZFS | |
630 | * structures (e.g. ZAP, dnode, indirect blocks, etc). | |
13a4027a MM |
631 | */ |
632 | kstat_named_t arcstat_metadata_size; | |
633 | /* | |
634 | * Number of bytes consumed by dmu_buf_impl_t objects. | |
13a4027a MM |
635 | */ |
636 | kstat_named_t arcstat_dbuf_size; | |
637 | /* | |
638 | * Number of bytes consumed by dnode_t objects. | |
13a4027a MM |
639 | */ |
640 | kstat_named_t arcstat_dnode_size; | |
641 | /* | |
642 | * Number of bytes consumed by bonus buffers. | |
13a4027a MM |
643 | */ |
644 | kstat_named_t arcstat_bonus_size; | |
1c2725a1 MM |
645 | #if defined(COMPAT_FREEBSD11) |
646 | /* | |
647 | * Sum of the previous three counters, provided for compatibility. | |
648 | */ | |
649 | kstat_named_t arcstat_other_size; | |
650 | #endif | |
651 | ||
13a4027a MM |
652 | /* |
653 | * Total number of bytes consumed by ARC buffers residing in the | |
654 | * arc_anon state. This includes *all* buffers in the arc_anon | |
655 | * state; e.g. data, metadata, evictable, and unevictable buffers | |
656 | * are all included in this value. | |
13a4027a MM |
657 | */ |
658 | kstat_named_t arcstat_anon_size; | |
a8d83e2a AM |
659 | kstat_named_t arcstat_anon_data; |
660 | kstat_named_t arcstat_anon_metadata; | |
13a4027a MM |
661 | /* |
662 | * Number of bytes consumed by ARC buffers that meet the | |
663 | * following criteria: backing buffers of type ARC_BUFC_DATA, | |
664 | * residing in the arc_anon state, and are eligible for eviction | |
665 | * (e.g. have no outstanding holds on the buffer). | |
13a4027a MM |
666 | */ |
667 | kstat_named_t arcstat_anon_evictable_data; | |
668 | /* | |
669 | * Number of bytes consumed by ARC buffers that meet the | |
670 | * following criteria: backing buffers of type ARC_BUFC_METADATA, | |
671 | * residing in the arc_anon state, and are eligible for eviction | |
672 | * (e.g. have no outstanding holds on the buffer). | |
13a4027a MM |
673 | */ |
674 | kstat_named_t arcstat_anon_evictable_metadata; | |
675 | /* | |
676 | * Total number of bytes consumed by ARC buffers residing in the | |
677 | * arc_mru state. This includes *all* buffers in the arc_mru | |
678 | * state; e.g. data, metadata, evictable, and unevictable buffers | |
679 | * are all included in this value. | |
13a4027a MM |
680 | */ |
681 | kstat_named_t arcstat_mru_size; | |
a8d83e2a AM |
682 | kstat_named_t arcstat_mru_data; |
683 | kstat_named_t arcstat_mru_metadata; | |
13a4027a MM |
684 | /* |
685 | * Number of bytes consumed by ARC buffers that meet the | |
686 | * following criteria: backing buffers of type ARC_BUFC_DATA, | |
687 | * residing in the arc_mru state, and are eligible for eviction | |
688 | * (e.g. have no outstanding holds on the buffer). | |
13a4027a MM |
689 | */ |
690 | kstat_named_t arcstat_mru_evictable_data; | |
691 | /* | |
692 | * Number of bytes consumed by ARC buffers that meet the | |
693 | * following criteria: backing buffers of type ARC_BUFC_METADATA, | |
694 | * residing in the arc_mru state, and are eligible for eviction | |
695 | * (e.g. have no outstanding holds on the buffer). | |
13a4027a MM |
696 | */ |
697 | kstat_named_t arcstat_mru_evictable_metadata; | |
698 | /* | |
699 | * Total number of bytes that *would have been* consumed by ARC | |
700 | * buffers in the arc_mru_ghost state. The key thing to note | |
701 | * here, is the fact that this size doesn't actually indicate | |
702 | * RAM consumption. The ghost lists only consist of headers and | |
703 | * don't actually have ARC buffers linked off of these headers. | |
704 | * Thus, *if* the headers had associated ARC buffers, these | |
705 | * buffers *would have* consumed this number of bytes. | |
13a4027a MM |
706 | */ |
707 | kstat_named_t arcstat_mru_ghost_size; | |
a8d83e2a AM |
708 | kstat_named_t arcstat_mru_ghost_data; |
709 | kstat_named_t arcstat_mru_ghost_metadata; | |
13a4027a MM |
710 | /* |
711 | * Number of bytes that *would have been* consumed by ARC | |
712 | * buffers that are eligible for eviction, of type | |
713 | * ARC_BUFC_DATA, and linked off the arc_mru_ghost state. | |
13a4027a MM |
714 | */ |
715 | kstat_named_t arcstat_mru_ghost_evictable_data; | |
716 | /* | |
717 | * Number of bytes that *would have been* consumed by ARC | |
718 | * buffers that are eligible for eviction, of type | |
719 | * ARC_BUFC_METADATA, and linked off the arc_mru_ghost state. | |
13a4027a MM |
720 | */ |
721 | kstat_named_t arcstat_mru_ghost_evictable_metadata; | |
722 | /* | |
723 | * Total number of bytes consumed by ARC buffers residing in the | |
724 | * arc_mfu state. This includes *all* buffers in the arc_mfu | |
725 | * state; e.g. data, metadata, evictable, and unevictable buffers | |
726 | * are all included in this value. | |
13a4027a MM |
727 | */ |
728 | kstat_named_t arcstat_mfu_size; | |
a8d83e2a AM |
729 | kstat_named_t arcstat_mfu_data; |
730 | kstat_named_t arcstat_mfu_metadata; | |
13a4027a MM |
731 | /* |
732 | * Number of bytes consumed by ARC buffers that are eligible for | |
733 | * eviction, of type ARC_BUFC_DATA, and reside in the arc_mfu | |
734 | * state. | |
13a4027a MM |
735 | */ |
736 | kstat_named_t arcstat_mfu_evictable_data; | |
737 | /* | |
738 | * Number of bytes consumed by ARC buffers that are eligible for | |
739 | * eviction, of type ARC_BUFC_METADATA, and reside in the | |
740 | * arc_mfu state. | |
13a4027a MM |
741 | */ |
742 | kstat_named_t arcstat_mfu_evictable_metadata; | |
743 | /* | |
744 | * Total number of bytes that *would have been* consumed by ARC | |
745 | * buffers in the arc_mfu_ghost state. See the comment above | |
746 | * arcstat_mru_ghost_size for more details. | |
13a4027a MM |
747 | */ |
748 | kstat_named_t arcstat_mfu_ghost_size; | |
a8d83e2a AM |
749 | kstat_named_t arcstat_mfu_ghost_data; |
750 | kstat_named_t arcstat_mfu_ghost_metadata; | |
13a4027a MM |
751 | /* |
752 | * Number of bytes that *would have been* consumed by ARC | |
753 | * buffers that are eligible for eviction, of type | |
754 | * ARC_BUFC_DATA, and linked off the arc_mfu_ghost state. | |
13a4027a MM |
755 | */ |
756 | kstat_named_t arcstat_mfu_ghost_evictable_data; | |
757 | /* | |
758 | * Number of bytes that *would have been* consumed by ARC | |
759 | * buffers that are eligible for eviction, of type | |
760 | * ARC_BUFC_METADATA, and linked off the arc_mru_ghost state. | |
13a4027a MM |
761 | */ |
762 | kstat_named_t arcstat_mfu_ghost_evictable_metadata; | |
ed2f7ba0 AM |
763 | /* |
764 | * Total number of bytes that are going to be evicted from ARC due to | |
765 | * ARC_FLAG_UNCACHED being set. | |
766 | */ | |
767 | kstat_named_t arcstat_uncached_size; | |
a8d83e2a AM |
768 | kstat_named_t arcstat_uncached_data; |
769 | kstat_named_t arcstat_uncached_metadata; | |
ed2f7ba0 AM |
770 | /* |
771 | * Number of data bytes that are going to be evicted from ARC due to | |
772 | * ARC_FLAG_UNCACHED being set. | |
773 | */ | |
774 | kstat_named_t arcstat_uncached_evictable_data; | |
775 | /* | |
776 | * Number of metadata bytes that that are going to be evicted from ARC | |
777 | * due to ARC_FLAG_UNCACHED being set. | |
778 | */ | |
779 | kstat_named_t arcstat_uncached_evictable_metadata; | |
13a4027a MM |
780 | kstat_named_t arcstat_l2_hits; |
781 | kstat_named_t arcstat_l2_misses; | |
08532162 GA |
782 | /* |
783 | * Allocated size (in bytes) of L2ARC cached buffers by ARC state. | |
784 | */ | |
785 | kstat_named_t arcstat_l2_prefetch_asize; | |
786 | kstat_named_t arcstat_l2_mru_asize; | |
787 | kstat_named_t arcstat_l2_mfu_asize; | |
788 | /* | |
789 | * Allocated size (in bytes) of L2ARC cached buffers by buffer content | |
790 | * type. | |
791 | */ | |
792 | kstat_named_t arcstat_l2_bufc_data_asize; | |
793 | kstat_named_t arcstat_l2_bufc_metadata_asize; | |
13a4027a MM |
794 | kstat_named_t arcstat_l2_feeds; |
795 | kstat_named_t arcstat_l2_rw_clash; | |
796 | kstat_named_t arcstat_l2_read_bytes; | |
797 | kstat_named_t arcstat_l2_write_bytes; | |
798 | kstat_named_t arcstat_l2_writes_sent; | |
799 | kstat_named_t arcstat_l2_writes_done; | |
800 | kstat_named_t arcstat_l2_writes_error; | |
801 | kstat_named_t arcstat_l2_writes_lock_retry; | |
802 | kstat_named_t arcstat_l2_evict_lock_retry; | |
803 | kstat_named_t arcstat_l2_evict_reading; | |
804 | kstat_named_t arcstat_l2_evict_l1cached; | |
805 | kstat_named_t arcstat_l2_free_on_write; | |
806 | kstat_named_t arcstat_l2_abort_lowmem; | |
807 | kstat_named_t arcstat_l2_cksum_bad; | |
808 | kstat_named_t arcstat_l2_io_error; | |
809 | kstat_named_t arcstat_l2_lsize; | |
810 | kstat_named_t arcstat_l2_psize; | |
13a4027a | 811 | kstat_named_t arcstat_l2_hdr_size; |
77f6826b GA |
812 | /* |
813 | * Number of L2ARC log blocks written. These are used for restoring the | |
814 | * L2ARC. Updated during writing of L2ARC log blocks. | |
815 | */ | |
816 | kstat_named_t arcstat_l2_log_blk_writes; | |
817 | /* | |
657fd33b | 818 | * Moving average of the aligned size of the L2ARC log blocks, in |
77f6826b GA |
819 | * bytes. Updated during L2ARC rebuild and during writing of L2ARC |
820 | * log blocks. | |
821 | */ | |
657fd33b GA |
822 | kstat_named_t arcstat_l2_log_blk_avg_asize; |
823 | /* Aligned size of L2ARC log blocks on L2ARC devices. */ | |
824 | kstat_named_t arcstat_l2_log_blk_asize; | |
825 | /* Number of L2ARC log blocks present on L2ARC devices. */ | |
826 | kstat_named_t arcstat_l2_log_blk_count; | |
77f6826b | 827 | /* |
657fd33b GA |
828 | * Moving average of the aligned size of L2ARC restored data, in bytes, |
829 | * to the aligned size of their metadata in L2ARC, in bytes. | |
77f6826b GA |
830 | * Updated during L2ARC rebuild and during writing of L2ARC log blocks. |
831 | */ | |
832 | kstat_named_t arcstat_l2_data_to_meta_ratio; | |
833 | /* | |
834 | * Number of times the L2ARC rebuild was successful for an L2ARC device. | |
835 | */ | |
836 | kstat_named_t arcstat_l2_rebuild_success; | |
837 | /* | |
838 | * Number of times the L2ARC rebuild failed because the device header | |
839 | * was in an unsupported format or corrupted. | |
840 | */ | |
841 | kstat_named_t arcstat_l2_rebuild_abort_unsupported; | |
842 | /* | |
843 | * Number of times the L2ARC rebuild failed because of IO errors | |
844 | * while reading a log block. | |
845 | */ | |
846 | kstat_named_t arcstat_l2_rebuild_abort_io_errors; | |
847 | /* | |
848 | * Number of times the L2ARC rebuild failed because of IO errors when | |
849 | * reading the device header. | |
850 | */ | |
851 | kstat_named_t arcstat_l2_rebuild_abort_dh_errors; | |
852 | /* | |
853 | * Number of L2ARC log blocks which failed to be restored due to | |
854 | * checksum errors. | |
855 | */ | |
856 | kstat_named_t arcstat_l2_rebuild_abort_cksum_lb_errors; | |
857 | /* | |
858 | * Number of times the L2ARC rebuild was aborted due to low system | |
859 | * memory. | |
860 | */ | |
861 | kstat_named_t arcstat_l2_rebuild_abort_lowmem; | |
862 | /* Logical size of L2ARC restored data, in bytes. */ | |
863 | kstat_named_t arcstat_l2_rebuild_size; | |
657fd33b GA |
864 | /* Aligned size of L2ARC restored data, in bytes. */ |
865 | kstat_named_t arcstat_l2_rebuild_asize; | |
77f6826b GA |
866 | /* |
867 | * Number of L2ARC log entries (buffers) that were successfully | |
868 | * restored in ARC. | |
869 | */ | |
870 | kstat_named_t arcstat_l2_rebuild_bufs; | |
871 | /* | |
872 | * Number of L2ARC log entries (buffers) already cached in ARC. These | |
873 | * were not restored again. | |
874 | */ | |
875 | kstat_named_t arcstat_l2_rebuild_bufs_precached; | |
77f6826b GA |
876 | /* |
877 | * Number of L2ARC log blocks that were restored successfully. Each | |
878 | * log block may hold up to L2ARC_LOG_BLK_MAX_ENTRIES buffers. | |
879 | */ | |
880 | kstat_named_t arcstat_l2_rebuild_log_blks; | |
13a4027a MM |
881 | kstat_named_t arcstat_memory_throttle_count; |
882 | kstat_named_t arcstat_memory_direct_count; | |
883 | kstat_named_t arcstat_memory_indirect_count; | |
884 | kstat_named_t arcstat_memory_all_bytes; | |
885 | kstat_named_t arcstat_memory_free_bytes; | |
886 | kstat_named_t arcstat_memory_available_bytes; | |
887 | kstat_named_t arcstat_no_grow; | |
888 | kstat_named_t arcstat_tempreserve; | |
889 | kstat_named_t arcstat_loaned_bytes; | |
890 | kstat_named_t arcstat_prune; | |
13a4027a | 891 | kstat_named_t arcstat_meta_used; |
13a4027a | 892 | kstat_named_t arcstat_dnode_limit; |
13a4027a | 893 | kstat_named_t arcstat_async_upgrade_sync; |
c935fe2e AM |
894 | /* Number of predictive prefetch requests. */ |
895 | kstat_named_t arcstat_predictive_prefetch; | |
896 | /* Number of requests for which predictive prefetch has completed. */ | |
13a4027a | 897 | kstat_named_t arcstat_demand_hit_predictive_prefetch; |
c935fe2e AM |
898 | /* Number of requests for which predictive prefetch was running. */ |
899 | kstat_named_t arcstat_demand_iohit_predictive_prefetch; | |
900 | /* Number of prescient prefetch requests. */ | |
901 | kstat_named_t arcstat_prescient_prefetch; | |
902 | /* Number of requests for which prescient prefetch has completed. */ | |
13a4027a | 903 | kstat_named_t arcstat_demand_hit_prescient_prefetch; |
c935fe2e AM |
904 | /* Number of requests for which prescient prefetch was running. */ |
905 | kstat_named_t arcstat_demand_iohit_prescient_prefetch; | |
13a4027a MM |
906 | kstat_named_t arcstat_need_free; |
907 | kstat_named_t arcstat_sys_free; | |
908 | kstat_named_t arcstat_raw_size; | |
1dc32a67 | 909 | kstat_named_t arcstat_cached_only_in_progress; |
85ec5cba | 910 | kstat_named_t arcstat_abd_chunk_waste_size; |
13a4027a MM |
911 | } arc_stats_t; |
912 | ||
c4c162c1 AM |
913 | typedef struct arc_sums { |
914 | wmsum_t arcstat_hits; | |
c935fe2e | 915 | wmsum_t arcstat_iohits; |
c4c162c1 AM |
916 | wmsum_t arcstat_misses; |
917 | wmsum_t arcstat_demand_data_hits; | |
c935fe2e | 918 | wmsum_t arcstat_demand_data_iohits; |
c4c162c1 AM |
919 | wmsum_t arcstat_demand_data_misses; |
920 | wmsum_t arcstat_demand_metadata_hits; | |
c935fe2e | 921 | wmsum_t arcstat_demand_metadata_iohits; |
c4c162c1 AM |
922 | wmsum_t arcstat_demand_metadata_misses; |
923 | wmsum_t arcstat_prefetch_data_hits; | |
c935fe2e | 924 | wmsum_t arcstat_prefetch_data_iohits; |
c4c162c1 AM |
925 | wmsum_t arcstat_prefetch_data_misses; |
926 | wmsum_t arcstat_prefetch_metadata_hits; | |
c935fe2e | 927 | wmsum_t arcstat_prefetch_metadata_iohits; |
c4c162c1 AM |
928 | wmsum_t arcstat_prefetch_metadata_misses; |
929 | wmsum_t arcstat_mru_hits; | |
930 | wmsum_t arcstat_mru_ghost_hits; | |
931 | wmsum_t arcstat_mfu_hits; | |
932 | wmsum_t arcstat_mfu_ghost_hits; | |
ed2f7ba0 | 933 | wmsum_t arcstat_uncached_hits; |
c4c162c1 AM |
934 | wmsum_t arcstat_deleted; |
935 | wmsum_t arcstat_mutex_miss; | |
936 | wmsum_t arcstat_access_skip; | |
937 | wmsum_t arcstat_evict_skip; | |
938 | wmsum_t arcstat_evict_not_enough; | |
939 | wmsum_t arcstat_evict_l2_cached; | |
940 | wmsum_t arcstat_evict_l2_eligible; | |
941 | wmsum_t arcstat_evict_l2_eligible_mfu; | |
942 | wmsum_t arcstat_evict_l2_eligible_mru; | |
943 | wmsum_t arcstat_evict_l2_ineligible; | |
944 | wmsum_t arcstat_evict_l2_skip; | |
945 | wmsum_t arcstat_hash_collisions; | |
946 | wmsum_t arcstat_hash_chains; | |
947 | aggsum_t arcstat_size; | |
948 | wmsum_t arcstat_compressed_size; | |
949 | wmsum_t arcstat_uncompressed_size; | |
950 | wmsum_t arcstat_overhead_size; | |
951 | wmsum_t arcstat_hdr_size; | |
952 | wmsum_t arcstat_data_size; | |
953 | wmsum_t arcstat_metadata_size; | |
954 | wmsum_t arcstat_dbuf_size; | |
a8d83e2a | 955 | wmsum_t arcstat_dnode_size; |
c4c162c1 AM |
956 | wmsum_t arcstat_bonus_size; |
957 | wmsum_t arcstat_l2_hits; | |
958 | wmsum_t arcstat_l2_misses; | |
959 | wmsum_t arcstat_l2_prefetch_asize; | |
960 | wmsum_t arcstat_l2_mru_asize; | |
961 | wmsum_t arcstat_l2_mfu_asize; | |
962 | wmsum_t arcstat_l2_bufc_data_asize; | |
963 | wmsum_t arcstat_l2_bufc_metadata_asize; | |
964 | wmsum_t arcstat_l2_feeds; | |
965 | wmsum_t arcstat_l2_rw_clash; | |
966 | wmsum_t arcstat_l2_read_bytes; | |
967 | wmsum_t arcstat_l2_write_bytes; | |
968 | wmsum_t arcstat_l2_writes_sent; | |
969 | wmsum_t arcstat_l2_writes_done; | |
970 | wmsum_t arcstat_l2_writes_error; | |
971 | wmsum_t arcstat_l2_writes_lock_retry; | |
972 | wmsum_t arcstat_l2_evict_lock_retry; | |
973 | wmsum_t arcstat_l2_evict_reading; | |
974 | wmsum_t arcstat_l2_evict_l1cached; | |
975 | wmsum_t arcstat_l2_free_on_write; | |
976 | wmsum_t arcstat_l2_abort_lowmem; | |
977 | wmsum_t arcstat_l2_cksum_bad; | |
978 | wmsum_t arcstat_l2_io_error; | |
979 | wmsum_t arcstat_l2_lsize; | |
980 | wmsum_t arcstat_l2_psize; | |
981 | aggsum_t arcstat_l2_hdr_size; | |
982 | wmsum_t arcstat_l2_log_blk_writes; | |
983 | wmsum_t arcstat_l2_log_blk_asize; | |
984 | wmsum_t arcstat_l2_log_blk_count; | |
985 | wmsum_t arcstat_l2_rebuild_success; | |
986 | wmsum_t arcstat_l2_rebuild_abort_unsupported; | |
987 | wmsum_t arcstat_l2_rebuild_abort_io_errors; | |
988 | wmsum_t arcstat_l2_rebuild_abort_dh_errors; | |
989 | wmsum_t arcstat_l2_rebuild_abort_cksum_lb_errors; | |
990 | wmsum_t arcstat_l2_rebuild_abort_lowmem; | |
991 | wmsum_t arcstat_l2_rebuild_size; | |
992 | wmsum_t arcstat_l2_rebuild_asize; | |
993 | wmsum_t arcstat_l2_rebuild_bufs; | |
994 | wmsum_t arcstat_l2_rebuild_bufs_precached; | |
995 | wmsum_t arcstat_l2_rebuild_log_blks; | |
996 | wmsum_t arcstat_memory_throttle_count; | |
997 | wmsum_t arcstat_memory_direct_count; | |
998 | wmsum_t arcstat_memory_indirect_count; | |
999 | wmsum_t arcstat_prune; | |
a8d83e2a | 1000 | wmsum_t arcstat_meta_used; |
c4c162c1 | 1001 | wmsum_t arcstat_async_upgrade_sync; |
c935fe2e | 1002 | wmsum_t arcstat_predictive_prefetch; |
c4c162c1 | 1003 | wmsum_t arcstat_demand_hit_predictive_prefetch; |
c935fe2e AM |
1004 | wmsum_t arcstat_demand_iohit_predictive_prefetch; |
1005 | wmsum_t arcstat_prescient_prefetch; | |
c4c162c1 | 1006 | wmsum_t arcstat_demand_hit_prescient_prefetch; |
c935fe2e | 1007 | wmsum_t arcstat_demand_iohit_prescient_prefetch; |
c4c162c1 AM |
1008 | wmsum_t arcstat_raw_size; |
1009 | wmsum_t arcstat_cached_only_in_progress; | |
1010 | wmsum_t arcstat_abd_chunk_waste_size; | |
1011 | } arc_sums_t; | |
1012 | ||
3442c2a0 MA |
1013 | typedef struct arc_evict_waiter { |
1014 | list_node_t aew_node; | |
1015 | kcondvar_t aew_cv; | |
1016 | uint64_t aew_count; | |
1017 | } arc_evict_waiter_t; | |
c9c9c1e2 MM |
1018 | |
1019 | #define ARCSTAT(stat) (arc_stats.stat.value.ui64) | |
1020 | ||
1021 | #define ARCSTAT_INCR(stat, val) \ | |
c4c162c1 | 1022 | wmsum_add(&arc_sums.stat, (val)) |
c9c9c1e2 MM |
1023 | |
1024 | #define ARCSTAT_BUMP(stat) ARCSTAT_INCR(stat, 1) | |
1025 | #define ARCSTAT_BUMPDOWN(stat) ARCSTAT_INCR(stat, -1) | |
1026 | ||
1027 | #define arc_no_grow ARCSTAT(arcstat_no_grow) /* do not grow cache size */ | |
a8d83e2a AM |
1028 | #define arc_meta ARCSTAT(arcstat_meta) /* target frac of metadata */ |
1029 | #define arc_pd ARCSTAT(arcstat_pd) /* target frac of data MRU */ | |
1030 | #define arc_pm ARCSTAT(arcstat_pm) /* target frac of meta MRU */ | |
c9c9c1e2 MM |
1031 | #define arc_c ARCSTAT(arcstat_c) /* target size of cache */ |
1032 | #define arc_c_min ARCSTAT(arcstat_c_min) /* min target cache size */ | |
1033 | #define arc_c_max ARCSTAT(arcstat_c_max) /* max target cache size */ | |
1034 | #define arc_sys_free ARCSTAT(arcstat_sys_free) /* target system free bytes */ | |
c9c9c1e2 | 1035 | |
8172df64 AM |
1036 | #define arc_anon (&ARC_anon) |
1037 | #define arc_mru (&ARC_mru) | |
1038 | #define arc_mru_ghost (&ARC_mru_ghost) | |
1039 | #define arc_mfu (&ARC_mfu) | |
1040 | #define arc_mfu_ghost (&ARC_mfu_ghost) | |
1041 | #define arc_l2c_only (&ARC_l2c_only) | |
ed2f7ba0 | 1042 | #define arc_uncached (&ARC_uncached) |
8172df64 | 1043 | |
c9c9c1e2 MM |
1044 | extern taskq_t *arc_prune_taskq; |
1045 | extern arc_stats_t arc_stats; | |
c4c162c1 | 1046 | extern arc_sums_t arc_sums; |
c9c9c1e2 MM |
1047 | extern hrtime_t arc_growtime; |
1048 | extern boolean_t arc_warm; | |
fdc2d303 RY |
1049 | extern uint_t arc_grow_retry; |
1050 | extern uint_t arc_no_grow_shift; | |
1051 | extern uint_t arc_shrink_shift; | |
c9c9c1e2 MM |
1052 | extern kmutex_t arc_prune_mtx; |
1053 | extern list_t arc_prune_list; | |
8172df64 AM |
1054 | extern arc_state_t ARC_mfu; |
1055 | extern arc_state_t ARC_mru; | |
c9c9c1e2 | 1056 | extern uint_t zfs_arc_pc_percent; |
fdc2d303 | 1057 | extern uint_t arc_lotsfree_percent; |
ab8d9c17 RY |
1058 | extern uint64_t zfs_arc_min; |
1059 | extern uint64_t zfs_arc_max; | |
c9c9c1e2 MM |
1060 | |
1061 | extern void arc_reduce_target_size(int64_t to_free); | |
1062 | extern boolean_t arc_reclaim_needed(void); | |
1063 | extern void arc_kmem_reap_soon(void); | |
6b88b4b5 | 1064 | extern void arc_wait_for_eviction(uint64_t, boolean_t); |
c9c9c1e2 MM |
1065 | |
1066 | extern void arc_lowmem_init(void); | |
1067 | extern void arc_lowmem_fini(void); | |
c9c9c1e2 MM |
1068 | extern int arc_memory_throttle(spa_t *spa, uint64_t reserve, uint64_t txg); |
1069 | extern uint64_t arc_free_memory(void); | |
1070 | extern int64_t arc_available_memory(void); | |
36a6e233 | 1071 | extern void arc_tuning_update(boolean_t); |
60a4c7d2 PD |
1072 | extern void arc_register_hotplug(void); |
1073 | extern void arc_unregister_hotplug(void); | |
e3570464 | 1074 | |
ab8d9c17 | 1075 | extern int param_set_arc_u64(ZFS_MODULE_PARAM_ARGS); |
7e3df9db | 1076 | extern int param_set_arc_int(ZFS_MODULE_PARAM_ARGS); |
e945e8d7 AJ |
1077 | extern int param_set_arc_min(ZFS_MODULE_PARAM_ARGS); |
1078 | extern int param_set_arc_max(ZFS_MODULE_PARAM_ARGS); | |
c9c9c1e2 | 1079 | |
77f6826b GA |
1080 | /* used in zdb.c */ |
1081 | boolean_t l2arc_log_blkptr_valid(l2arc_dev_t *dev, | |
1082 | const l2arc_log_blkptr_t *lbp); | |
1083 | ||
b7654bd7 GA |
1084 | /* used in vdev_trim.c */ |
1085 | void l2arc_dev_hdr_update(l2arc_dev_t *dev); | |
1086 | l2arc_dev_t *l2arc_vdev_get(vdev_t *vd); | |
1087 | ||
59ec819a NB |
1088 | #ifdef __cplusplus |
1089 | } | |
1090 | #endif | |
1091 | ||
1092 | #endif /* _SYS_ARC_IMPL_H */ |