annotate usr/src/uts/common/fs/zfs/sys/arc_impl.h @ 25465:2c417db70a87

3525 Persistent L2ARC Portions contributed by: Saso Kiselkov <skiselkov@gmail.com> Portions contributed by: Jorgen Lundman <lundman@lundman.net> Portions contributed by: Brian Behlendorf <behlendorf1@llnl.gov> Portions contributed by: Alexander Motin <mav@FreeBSD.org> Portions contributed by: Jason King <jason.king@joyent.com> Reviewed by: C Fraire <cfraire@me.com> Reviewed by: Toomas Soome <tsoome@me.com> Approved by: Dan McDonald <danmcd@joyent.com>
author George Amanakis <gamanakis@gmail.com>
date Thu, 30 Jul 2020 18:40:44 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
25465
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
1 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
2 * CDDL HEADER START
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
3 *
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
4 * The contents of this file are subject to the terms of the
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
5 * Common Development and Distribution License (the "License").
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
6 * You may not use this file except in compliance with the License.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
7 *
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
9 * or http://www.opensolaris.org/os/licensing.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
10 * See the License for the specific language governing permissions
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
11 * and limitations under the License.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
12 *
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
13 * When distributing Covered Code, include this CDDL HEADER in each
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
15 * If applicable, add the following below this CDDL HEADER, with the
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
16 * fields enclosed by brackets "[]" replaced with your own identifying
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
17 * information: Portions Copyright [yyyy] [name of copyright owner]
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
18 *
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
19 * CDDL HEADER END
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
20 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
21 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
22 * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
23 * Copyright (c) 2019, Joyent, Inc.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
24 * Copyright (c) 2011, 2018 by Delphix. All rights reserved.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
25 * Copyright (c) 2014 by Saso Kiselkov. All rights reserved.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
26 * Copyright 2017 Nexenta Systems, Inc. All rights reserved.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
27 * Copyright (c) 2020, George Amanakis. All rights reserved.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
28 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
29
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
30 #ifndef _SYS_ARC_IMPL_H
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
31 #define _SYS_ARC_IMPL_H
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
32
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
33 #include <sys/arc.h>
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
34 #include <sys/multilist.h>
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
35
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
36 #ifdef __cplusplus
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
37 extern "C" {
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
38 #endif
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
39
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
40 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
41 * Note that buffers can be in one of 6 states:
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
42 * ARC_anon - anonymous (discussed below)
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
43 * ARC_mru - recently used, currently cached
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
44 * ARC_mru_ghost - recently used, no longer in cache
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
45 * ARC_mfu - frequently used, currently cached
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
46 * ARC_mfu_ghost - frequently used, no longer in cache
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
47 * ARC_l2c_only - exists in L2ARC but not other states
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
48 * When there are no active references to the buffer, they are
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
49 * are linked onto a list in one of these arc states. These are
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
50 * the only buffers that can be evicted or deleted. Within each
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
51 * state there are multiple lists, one for meta-data and one for
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
52 * non-meta-data. Meta-data (indirect blocks, blocks of dnodes,
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
53 * etc.) is tracked separately so that it can be managed more
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
54 * explicitly: favored over data, limited explicitly.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
55 *
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
56 * Anonymous buffers are buffers that are not associated with
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
57 * a DVA. These are buffers that hold dirty block copies
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
58 * before they are written to stable storage. By definition,
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
59 * they are "ref'd" and are considered part of arc_mru
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
60 * that cannot be freed. Generally, they will aquire a DVA
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
61 * as they are written and migrate onto the arc_mru list.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
62 *
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
63 * The ARC_l2c_only state is for buffers that are in the second
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
64 * level ARC but no longer in any of the ARC_m* lists. The second
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
65 * level ARC itself may also contain buffers that are in any of
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
66 * the ARC_m* states - meaning that a buffer can exist in two
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
67 * places. The reason for the ARC_l2c_only state is to keep the
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
68 * buffer header in the hash table, so that reads that hit the
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
69 * second level ARC benefit from these fast lookups.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
70 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
71
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
72 typedef struct arc_state {
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
73 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
74 * list of evictable buffers
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
75 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
76 multilist_t *arcs_list[ARC_BUFC_NUMTYPES];
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
77 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
78 * total amount of evictable data in this state
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
79 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
80 zfs_refcount_t arcs_esize[ARC_BUFC_NUMTYPES];
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
81 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
82 * total amount of data in this state; this includes: evictable,
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
83 * non-evictable, ARC_BUFC_DATA, and ARC_BUFC_METADATA.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
84 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
85 zfs_refcount_t arcs_size;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
86 } arc_state_t;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
87
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
88 typedef struct arc_callback arc_callback_t;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
89
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
90 struct arc_callback {
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
91 void *acb_private;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
92 arc_read_done_func_t *acb_done;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
93 arc_buf_t *acb_buf;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
94 boolean_t acb_encrypted;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
95 boolean_t acb_compressed;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
96 boolean_t acb_noauth;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
97 zbookmark_phys_t acb_zb;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
98 zio_t *acb_zio_dummy;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
99 zio_t *acb_zio_head;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
100 arc_callback_t *acb_next;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
101 };
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
102
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
103 typedef struct arc_write_callback arc_write_callback_t;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
104
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
105 struct arc_write_callback {
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
106 void *awcb_private;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
107 arc_write_done_func_t *awcb_ready;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
108 arc_write_done_func_t *awcb_children_ready;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
109 arc_write_done_func_t *awcb_physdone;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
110 arc_write_done_func_t *awcb_done;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
111 arc_buf_t *awcb_buf;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
112 };
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
113
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
114 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
115 * ARC buffers are separated into multiple structs as a memory saving measure:
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
116 * - Common fields struct, always defined, and embedded within it:
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
117 * - L2-only fields, always allocated but undefined when not in L2ARC
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
118 * - L1-only fields, only allocated when in L1ARC
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
119 *
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
120 * Buffer in L1 Buffer only in L2
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
121 * +------------------------+ +------------------------+
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
122 * | arc_buf_hdr_t | | arc_buf_hdr_t |
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
123 * | | | |
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
124 * | | | |
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
125 * | | | |
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
126 * +------------------------+ +------------------------+
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
127 * | l2arc_buf_hdr_t | | l2arc_buf_hdr_t |
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
128 * | (undefined if L1-only) | | |
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
129 * +------------------------+ +------------------------+
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
130 * | l1arc_buf_hdr_t |
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
131 * | |
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
132 * | |
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
133 * | |
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
134 * | |
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
135 * +------------------------+
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
136 *
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
137 * Because it's possible for the L2ARC to become extremely large, we can wind
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
138 * up eating a lot of memory in L2ARC buffer headers, so the size of a header
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
139 * is minimized by only allocating the fields necessary for an L1-cached buffer
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
140 * when a header is actually in the L1 cache. The sub-headers (l1arc_buf_hdr and
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
141 * l2arc_buf_hdr) are embedded rather than allocated separately to save a couple
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
142 * words in pointers. arc_hdr_realloc() is used to switch a header between
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
143 * these two allocation states.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
144 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
145 typedef struct l1arc_buf_hdr {
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
146 kmutex_t b_freeze_lock;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
147 zio_cksum_t *b_freeze_cksum;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
148 #ifdef ZFS_DEBUG
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
149 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
150 * Used for debugging with kmem_flags - by allocating and freeing
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
151 * b_thawed when the buffer is thawed, we get a record of the stack
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
152 * trace that thawed it.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
153 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
154 void *b_thawed;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
155 #endif
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
156
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
157 arc_buf_t *b_buf;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
158 uint32_t b_bufcnt;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
159 /* for waiting on writes to complete */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
160 kcondvar_t b_cv;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
161 uint8_t b_byteswap;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
162
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
163 /* protected by arc state mutex */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
164 arc_state_t *b_state;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
165 multilist_node_t b_arc_node;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
166
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
167 /* updated atomically */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
168 clock_t b_arc_access;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
169
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
170 /* self protecting */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
171 zfs_refcount_t b_refcnt;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
172
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
173 arc_callback_t *b_acb;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
174 abd_t *b_pabd;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
175 } l1arc_buf_hdr_t;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
176
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
177 typedef enum l2arc_dev_hdr_flags_t {
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
178 L2ARC_DEV_HDR_EVICT_FIRST = (1 << 0) /* mirror of l2ad_first */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
179 } l2arc_dev_hdr_flags_t;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
180
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
181 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
182 * Pointer used in persistent L2ARC (for pointing to log blocks).
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
183 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
184 typedef struct l2arc_log_blkptr {
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
185 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
186 * Offset of log block within the device, in bytes
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
187 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
188 uint64_t lbp_daddr;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
189 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
190 * Aligned payload size (in bytes) of the log block
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
191 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
192 uint64_t lbp_payload_asize;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
193 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
194 * Offset in bytes of the first buffer in the payload
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
195 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
196 uint64_t lbp_payload_start;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
197 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
198 * lbp_prop has the following format:
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
199 * * logical size (in bytes)
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
200 * * aligned (after compression) size (in bytes)
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
201 * * compression algorithm (we always LZ4-compress l2arc logs)
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
202 * * checksum algorithm (used for lbp_cksum)
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
203 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
204 uint64_t lbp_prop;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
205 zio_cksum_t lbp_cksum; /* checksum of log */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
206 } l2arc_log_blkptr_t;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
207
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
208 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
209 * The persistent L2ARC device header.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
210 * Byte order of magic determines whether 64-bit bswap of fields is necessary.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
211 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
212 typedef struct l2arc_dev_hdr_phys {
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
213 uint64_t dh_magic; /* L2ARC_DEV_HDR_MAGIC */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
214 uint64_t dh_version; /* Persistent L2ARC version */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
215
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
216 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
217 * Global L2ARC device state and metadata.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
218 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
219 uint64_t dh_spa_guid;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
220 uint64_t dh_vdev_guid;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
221 uint64_t dh_log_entries; /* mirror of l2ad_log_entries */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
222 uint64_t dh_evict; /* evicted offset in bytes */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
223 uint64_t dh_flags; /* l2arc_dev_hdr_flags_t */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
224 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
225 * Used in zdb.c for determining if a log block is valid, in the same
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
226 * way that l2arc_rebuild() does.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
227 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
228 uint64_t dh_start; /* mirror of l2ad_start */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
229 uint64_t dh_end; /* mirror of l2ad_end */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
230 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
231 * Start of log block chain. [0] -> newest log, [1] -> one older (used
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
232 * for initiating prefetch).
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
233 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
234 l2arc_log_blkptr_t dh_start_lbps[2];
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
235 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
236 * Aligned size of all log blocks as accounted by vdev_space_update().
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
237 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
238 uint64_t dh_lb_asize; /* mirror of l2ad_lb_asize */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
239 uint64_t dh_lb_count; /* mirror of l2ad_lb_count */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
240 const uint64_t dh_pad[32]; /* pad to 512 bytes */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
241 zio_eck_t dh_tail;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
242 } l2arc_dev_hdr_phys_t;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
243 CTASSERT(sizeof (l2arc_dev_hdr_phys_t) == SPA_MINBLOCKSIZE);
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
244
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
245 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
246 * A single ARC buffer header entry in a l2arc_log_blk_phys_t.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
247 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
248 typedef struct l2arc_log_ent_phys {
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
249 dva_t le_dva; /* dva of buffer */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
250 uint64_t le_birth; /* birth txg of buffer */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
251 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
252 * le_prop has the following format:
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
253 * * logical size (in bytes)
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
254 * * physical (compressed) size (in bytes)
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
255 * * compression algorithm
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
256 * * object type (used to restore arc_buf_contents_t)
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
257 * * protected status (used for encryption)
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
258 * * prefetch status (used in l2arc_read_done())
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
259 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
260 uint64_t le_prop;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
261 uint64_t le_daddr; /* buf location on l2dev */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
262 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
263 * We pad the size of each entry to a power of 2 so that the size of
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
264 * l2arc_log_blk_phys_t is power-of-2 aligned with SPA_MINBLOCKSHIFT,
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
265 * because of the L2ARC_SET_*SIZE macros.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
266 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
267 const uint64_t le_pad[3]; /* pad to 64 bytes */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
268 } l2arc_log_ent_phys_t;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
269
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
270 #define L2ARC_LOG_BLK_MAX_ENTRIES (1022)
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
271
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
272 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
273 * A log block of up to 1022 ARC buffer log entries, chained into the
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
274 * persistent L2ARC metadata linked list. Byte order of magic determines
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
275 * whether 64-bit bswap of fields is necessary.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
276 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
277 typedef struct l2arc_log_blk_phys {
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
278 uint64_t lb_magic; /* L2ARC_LOG_BLK_MAGIC */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
279 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
280 * There are 2 chains (headed by dh_start_lbps[2]), and this field
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
281 * points back to the previous block in this chain. We alternate
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
282 * which chain we append to, so they are time-wise and offset-wise
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
283 * interleaved, but that is an optimization rather than for
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
284 * correctness.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
285 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
286 l2arc_log_blkptr_t lb_prev_lbp; /* pointer to prev log block */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
287 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
288 * Pad header section to 128 bytes
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
289 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
290 uint64_t lb_pad[7];
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
291 /* Payload */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
292 l2arc_log_ent_phys_t lb_entries[L2ARC_LOG_BLK_MAX_ENTRIES];
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
293 } l2arc_log_blk_phys_t; /* 64K total */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
294 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
295 * The size of l2arc_log_blk_phys_t has to be power-of-2 aligned with
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
296 * SPA_MINBLOCKSHIFT because of L2BLK_SET_*SIZE macros.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
297 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
298 CTASSERT(IS_P2ALIGNED(sizeof (l2arc_log_blk_phys_t),
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
299 1ULL << SPA_MINBLOCKSHIFT));
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
300 CTASSERT(sizeof (l2arc_log_blk_phys_t) >= SPA_MINBLOCKSIZE);
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
301 CTASSERT(sizeof (l2arc_log_blk_phys_t) <= SPA_MAXBLOCKSIZE);
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
302
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
303 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
304 * These structures hold in-flight abd buffers for log blocks as they're being
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
305 * written to the L2ARC device.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
306 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
307 typedef struct l2arc_lb_abd_buf {
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
308 abd_t *abd;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
309 list_node_t node;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
310 } l2arc_lb_abd_buf_t;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
311
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
312 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
313 * These structures hold pointers to log blocks present on the L2ARC device.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
314 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
315 typedef struct l2arc_lb_ptr_buf {
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
316 l2arc_log_blkptr_t *lb_ptr;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
317 list_node_t node;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
318 } l2arc_lb_ptr_buf_t;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
319
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
320 /* Macros for setting fields in le_prop and lbp_prop */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
321 #define L2BLK_GET_LSIZE(field) \
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
322 BF64_GET_SB((field), 0, SPA_LSIZEBITS, SPA_MINBLOCKSHIFT, 1)
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
323 #define L2BLK_SET_LSIZE(field, x) \
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
324 BF64_SET_SB((field), 0, SPA_LSIZEBITS, SPA_MINBLOCKSHIFT, 1, x)
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
325 #define L2BLK_GET_PSIZE(field) \
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
326 BF64_GET_SB((field), 16, SPA_PSIZEBITS, SPA_MINBLOCKSHIFT, 1)
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
327 #define L2BLK_SET_PSIZE(field, x) \
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
328 BF64_SET_SB((field), 16, SPA_PSIZEBITS, SPA_MINBLOCKSHIFT, 1, x)
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
329 #define L2BLK_GET_COMPRESS(field) \
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
330 BF64_GET((field), 32, SPA_COMPRESSBITS)
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
331 #define L2BLK_SET_COMPRESS(field, x) \
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
332 BF64_SET((field), 32, SPA_COMPRESSBITS, x)
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
333 #define L2BLK_GET_PREFETCH(field) BF64_GET((field), 39, 1)
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
334 #define L2BLK_SET_PREFETCH(field, x) BF64_SET((field), 39, 1, x)
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
335 #define L2BLK_GET_CHECKSUM(field) BF64_GET((field), 40, 8)
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
336 #define L2BLK_SET_CHECKSUM(field, x) BF64_SET((field), 40, 8, x)
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
337 #define L2BLK_GET_TYPE(field) BF64_GET((field), 48, 8)
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
338 #define L2BLK_SET_TYPE(field, x) BF64_SET((field), 48, 8, x)
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
339 #define L2BLK_GET_PROTECTED(field) BF64_GET((field), 56, 1)
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
340 #define L2BLK_SET_PROTECTED(field, x) BF64_SET((field), 56, 1, x)
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
341
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
342 #define PTR_SWAP(x, y) \
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
343 do { \
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
344 void *tmp = (x);\
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
345 x = y; \
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
346 y = tmp; \
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
347 _NOTE(CONSTCOND)\
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
348 } while (0)
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
349
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
350 #define L2ARC_DEV_HDR_MAGIC 0x5a46534341434845LLU /* ASCII: "ZFSCACHE" */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
351 #define L2ARC_LOG_BLK_MAGIC 0x4c4f47424c4b4844LLU /* ASCII: "LOGBLKHD" */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
352
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
353 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
354 * L2ARC Internals
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
355 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
356 typedef struct l2arc_dev {
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
357 vdev_t *l2ad_vdev; /* vdev */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
358 spa_t *l2ad_spa; /* spa */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
359 uint64_t l2ad_hand; /* next write location */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
360 uint64_t l2ad_start; /* first addr on device */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
361 uint64_t l2ad_end; /* last addr on device */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
362 boolean_t l2ad_first; /* first sweep through */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
363 boolean_t l2ad_writing; /* currently writing */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
364 kmutex_t l2ad_mtx; /* lock for buffer list */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
365 list_t l2ad_buflist; /* buffer list */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
366 list_node_t l2ad_node; /* device list node */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
367 zfs_refcount_t l2ad_alloc; /* allocated bytes */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
368 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
369 * Persistence-related stuff
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
370 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
371 l2arc_dev_hdr_phys_t *l2ad_dev_hdr; /* persistent device header */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
372 uint64_t l2ad_dev_hdr_asize; /* aligned hdr size */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
373 l2arc_log_blk_phys_t l2ad_log_blk; /* currently open log block */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
374 int l2ad_log_ent_idx; /* index into cur log blk */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
375 /* Number of bytes in current log block's payload */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
376 uint64_t l2ad_log_blk_payload_asize;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
377 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
378 * Offset (in bytes) of the first buffer in current log block's
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
379 * payload.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
380 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
381 uint64_t l2ad_log_blk_payload_start;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
382 /* Flag indicating whether a rebuild is scheduled or is going on */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
383 boolean_t l2ad_rebuild;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
384 boolean_t l2ad_rebuild_cancel;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
385 boolean_t l2ad_rebuild_began;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
386 uint64_t l2ad_log_entries; /* entries per log blk */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
387 uint64_t l2ad_evict; /* evicted offset in bytes */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
388 /* List of pointers to log blocks present in the L2ARC device */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
389 list_t l2ad_lbptr_list;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
390 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
391 * Aligned size of all log blocks as accounted by vdev_space_update().
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
392 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
393 zfs_refcount_t l2ad_lb_asize;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
394 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
395 * Number of log blocks present on the device.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
396 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
397 zfs_refcount_t l2ad_lb_count;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
398 } l2arc_dev_t;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
399
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
400 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
401 * Encrypted blocks will need to be stored encrypted on the L2ARC
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
402 * disk as they appear in the main pool. In order for this to work we
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
403 * need to pass around the encryption parameters so they can be used
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
404 * to write data to the L2ARC. This struct is only defined in the
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
405 * arc_buf_hdr_t if the L1 header is defined and has the ARC_FLAG_ENCRYPTED
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
406 * flag set.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
407 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
408 typedef struct arc_buf_hdr_crypt {
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
409 abd_t *b_rabd; /* raw encrypted data */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
410 dmu_object_type_t b_ot; /* object type */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
411 uint32_t b_ebufcnt; /* number or encryped buffers */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
412
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
413 /* dsobj for looking up encryption key for l2arc encryption */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
414 uint64_t b_dsobj; /* for looking up key */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
415
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
416 /* encryption parameters */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
417 uint8_t b_salt[ZIO_DATA_SALT_LEN];
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
418 uint8_t b_iv[ZIO_DATA_IV_LEN];
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
419
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
420 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
421 * Technically this could be removed since we will always be able to
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
422 * get the mac from the bp when we need it. However, it is inconvenient
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
423 * for callers of arc code to have to pass a bp in all the time. This
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
424 * also allows us to assert that L2ARC data is properly encrypted to
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
425 * match the data in the main storage pool.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
426 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
427 uint8_t b_mac[ZIO_DATA_MAC_LEN];
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
428 } arc_buf_hdr_crypt_t;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
429
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
430 typedef struct l2arc_buf_hdr {
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
431 /* protected by arc_buf_hdr mutex */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
432 l2arc_dev_t *b_dev; /* L2ARC device */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
433 uint64_t b_daddr; /* disk address, offset byte */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
434
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
435 list_node_t b_l2node;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
436 } l2arc_buf_hdr_t;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
437
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
438 typedef struct l2arc_write_callback {
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
439 l2arc_dev_t *l2wcb_dev; /* device info */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
440 arc_buf_hdr_t *l2wcb_head; /* head of write buflist */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
441 /* in-flight list of log blocks */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
442 list_t l2wcb_abd_list;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
443 } l2arc_write_callback_t;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
444
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
445 struct arc_buf_hdr {
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
446 /* protected by hash lock */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
447 dva_t b_dva;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
448 uint64_t b_birth;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
449
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
450 arc_buf_contents_t b_type;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
451 arc_buf_hdr_t *b_hash_next;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
452 arc_flags_t b_flags;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
453
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
454 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
455 * This field stores the size of the data buffer after
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
456 * compression, and is set in the arc's zio completion handlers.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
457 * It is in units of SPA_MINBLOCKSIZE (e.g. 1 == 512 bytes).
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
458 *
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
459 * While the block pointers can store up to 32MB in their psize
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
460 * field, we can only store up to 32MB minus 512B. This is due
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
461 * to the bp using a bias of 1, whereas we use a bias of 0 (i.e.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
462 * a field of zeros represents 512B in the bp). We can't use a
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
463 * bias of 1 since we need to reserve a psize of zero, here, to
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
464 * represent holes and embedded blocks.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
465 *
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
466 * This isn't a problem in practice, since the maximum size of a
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
467 * buffer is limited to 16MB, so we never need to store 32MB in
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
468 * this field.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
469 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
470 uint16_t b_psize;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
471
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
472 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
473 * This field stores the size of the data buffer before
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
474 * compression, and cannot change once set. It is in units
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
475 * of SPA_MINBLOCKSIZE (e.g. 2 == 1024 bytes)
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
476 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
477 uint16_t b_lsize; /* immutable */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
478 uint64_t b_spa; /* immutable */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
479
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
480 /* L2ARC fields. Undefined when not in L2ARC. */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
481 l2arc_buf_hdr_t b_l2hdr;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
482 /* L1ARC fields. Undefined when in l2arc_only state */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
483 l1arc_buf_hdr_t b_l1hdr;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
484 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
485 * Encryption parameters. Defined only when ARC_FLAG_ENCRYPTED
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
486 * is set and the L1 header exists.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
487 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
488 arc_buf_hdr_crypt_t b_crypt_hdr;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
489 };
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
490
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
491 typedef struct arc_stats {
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
492 kstat_named_t arcstat_hits;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
493 kstat_named_t arcstat_misses;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
494 kstat_named_t arcstat_demand_data_hits;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
495 kstat_named_t arcstat_demand_data_misses;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
496 kstat_named_t arcstat_demand_metadata_hits;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
497 kstat_named_t arcstat_demand_metadata_misses;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
498 kstat_named_t arcstat_prefetch_data_hits;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
499 kstat_named_t arcstat_prefetch_data_misses;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
500 kstat_named_t arcstat_prefetch_metadata_hits;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
501 kstat_named_t arcstat_prefetch_metadata_misses;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
502 kstat_named_t arcstat_mru_hits;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
503 kstat_named_t arcstat_mru_ghost_hits;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
504 kstat_named_t arcstat_mfu_hits;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
505 kstat_named_t arcstat_mfu_ghost_hits;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
506 kstat_named_t arcstat_deleted;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
507 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
508 * Number of buffers that could not be evicted because the hash lock
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
509 * was held by another thread. The lock may not necessarily be held
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
510 * by something using the same buffer, since hash locks are shared
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
511 * by multiple buffers.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
512 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
513 kstat_named_t arcstat_mutex_miss;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
514 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
515 * Number of buffers skipped when updating the access state due to the
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
516 * header having already been released after acquiring the hash lock.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
517 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
518 kstat_named_t arcstat_access_skip;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
519 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
520 * Number of buffers skipped because they have I/O in progress, are
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
521 * indirect prefetch buffers that have not lived long enough, or are
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
522 * not from the spa we're trying to evict from.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
523 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
524 kstat_named_t arcstat_evict_skip;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
525 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
526 * Number of times arc_evict_state() was unable to evict enough
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
527 * buffers to reach its target amount.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
528 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
529 kstat_named_t arcstat_evict_not_enough;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
530 kstat_named_t arcstat_evict_l2_cached;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
531 kstat_named_t arcstat_evict_l2_eligible;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
532 kstat_named_t arcstat_evict_l2_ineligible;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
533 kstat_named_t arcstat_evict_l2_skip;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
534 kstat_named_t arcstat_hash_elements;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
535 kstat_named_t arcstat_hash_elements_max;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
536 kstat_named_t arcstat_hash_collisions;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
537 kstat_named_t arcstat_hash_chains;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
538 kstat_named_t arcstat_hash_chain_max;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
539 kstat_named_t arcstat_p;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
540 kstat_named_t arcstat_c;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
541 kstat_named_t arcstat_c_min;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
542 kstat_named_t arcstat_c_max;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
543 /* Not updated directly; only synced in arc_kstat_update. */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
544 kstat_named_t arcstat_size;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
545 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
546 * Number of compressed bytes stored in the arc_buf_hdr_t's b_pabd.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
547 * Note that the compressed bytes may match the uncompressed bytes
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
548 * if the block is either not compressed or compressed arc is disabled.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
549 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
550 kstat_named_t arcstat_compressed_size;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
551 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
552 * Uncompressed size of the data stored in b_pabd. If compressed
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
553 * arc is disabled then this value will be identical to the stat
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
554 * above.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
555 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
556 kstat_named_t arcstat_uncompressed_size;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
557 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
558 * Number of bytes stored in all the arc_buf_t's. This is classified
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
559 * as "overhead" since this data is typically short-lived and will
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
560 * be evicted from the arc when it becomes unreferenced unless the
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
561 * zfs_keep_uncompressed_metadata or zfs_keep_uncompressed_level
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
562 * values have been set (see comment in dbuf.c for more information).
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
563 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
564 kstat_named_t arcstat_overhead_size;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
565 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
566 * Number of bytes consumed by internal ARC structures necessary
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
567 * for tracking purposes; these structures are not actually
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
568 * backed by ARC buffers. This includes arc_buf_hdr_t structures
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
569 * (allocated via arc_buf_hdr_t_full and arc_buf_hdr_t_l2only
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
570 * caches), and arc_buf_t structures (allocated via arc_buf_t
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
571 * cache).
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
572 * Not updated directly; only synced in arc_kstat_update.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
573 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
574 kstat_named_t arcstat_hdr_size;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
575 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
576 * Number of bytes consumed by ARC buffers of type equal to
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
577 * ARC_BUFC_DATA. This is generally consumed by buffers backing
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
578 * on disk user data (e.g. plain file contents).
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
579 * Not updated directly; only synced in arc_kstat_update.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
580 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
581 kstat_named_t arcstat_data_size;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
582 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
583 * Number of bytes consumed by ARC buffers of type equal to
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
584 * ARC_BUFC_METADATA. This is generally consumed by buffers
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
585 * backing on disk data that is used for internal ZFS
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
586 * structures (e.g. ZAP, dnode, indirect blocks, etc).
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
587 * Not updated directly; only synced in arc_kstat_update.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
588 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
589 kstat_named_t arcstat_metadata_size;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
590 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
591 * Number of bytes consumed by various buffers and structures
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
592 * not actually backed with ARC buffers. This includes bonus
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
593 * buffers (allocated directly via zio_buf_* functions),
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
594 * dmu_buf_impl_t structures (allocated via dmu_buf_impl_t
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
595 * cache), and dnode_t structures (allocated via dnode_t cache).
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
596 * Not updated directly; only synced in arc_kstat_update.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
597 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
598 kstat_named_t arcstat_other_size;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
599 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
600 * Total number of bytes consumed by ARC buffers residing in the
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
601 * arc_anon state. This includes *all* buffers in the arc_anon
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
602 * state; e.g. data, metadata, evictable, and unevictable buffers
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
603 * are all included in this value.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
604 * Not updated directly; only synced in arc_kstat_update.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
605 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
606 kstat_named_t arcstat_anon_size;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
607 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
608 * Number of bytes consumed by ARC buffers that meet the
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
609 * following criteria: backing buffers of type ARC_BUFC_DATA,
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
610 * residing in the arc_anon state, and are eligible for eviction
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
611 * (e.g. have no outstanding holds on the buffer).
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
612 * Not updated directly; only synced in arc_kstat_update.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
613 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
614 kstat_named_t arcstat_anon_evictable_data;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
615 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
616 * Number of bytes consumed by ARC buffers that meet the
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
617 * following criteria: backing buffers of type ARC_BUFC_METADATA,
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
618 * residing in the arc_anon state, and are eligible for eviction
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
619 * (e.g. have no outstanding holds on the buffer).
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
620 * Not updated directly; only synced in arc_kstat_update.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
621 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
622 kstat_named_t arcstat_anon_evictable_metadata;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
623 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
624 * Total number of bytes consumed by ARC buffers residing in the
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
625 * arc_mru state. This includes *all* buffers in the arc_mru
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
626 * state; e.g. data, metadata, evictable, and unevictable buffers
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
627 * are all included in this value.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
628 * Not updated directly; only synced in arc_kstat_update.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
629 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
630 kstat_named_t arcstat_mru_size;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
631 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
632 * Number of bytes consumed by ARC buffers that meet the
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
633 * following criteria: backing buffers of type ARC_BUFC_DATA,
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
634 * residing in the arc_mru state, and are eligible for eviction
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
635 * (e.g. have no outstanding holds on the buffer).
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
636 * Not updated directly; only synced in arc_kstat_update.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
637 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
638 kstat_named_t arcstat_mru_evictable_data;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
639 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
640 * Number of bytes consumed by ARC buffers that meet the
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
641 * following criteria: backing buffers of type ARC_BUFC_METADATA,
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
642 * residing in the arc_mru state, and are eligible for eviction
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
643 * (e.g. have no outstanding holds on the buffer).
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
644 * Not updated directly; only synced in arc_kstat_update.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
645 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
646 kstat_named_t arcstat_mru_evictable_metadata;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
647 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
648 * Total number of bytes that *would have been* consumed by ARC
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
649 * buffers in the arc_mru_ghost state. The key thing to note
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
650 * here, is the fact that this size doesn't actually indicate
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
651 * RAM consumption. The ghost lists only consist of headers and
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
652 * don't actually have ARC buffers linked off of these headers.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
653 * Thus, *if* the headers had associated ARC buffers, these
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
654 * buffers *would have* consumed this number of bytes.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
655 * Not updated directly; only synced in arc_kstat_update.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
656 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
657 kstat_named_t arcstat_mru_ghost_size;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
658 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
659 * Number of bytes that *would have been* consumed by ARC
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
660 * buffers that are eligible for eviction, of type
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
661 * ARC_BUFC_DATA, and linked off the arc_mru_ghost state.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
662 * Not updated directly; only synced in arc_kstat_update.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
663 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
664 kstat_named_t arcstat_mru_ghost_evictable_data;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
665 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
666 * Number of bytes that *would have been* consumed by ARC
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
667 * buffers that are eligible for eviction, of type
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
668 * ARC_BUFC_METADATA, and linked off the arc_mru_ghost state.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
669 * Not updated directly; only synced in arc_kstat_update.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
670 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
671 kstat_named_t arcstat_mru_ghost_evictable_metadata;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
672 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
673 * Total number of bytes consumed by ARC buffers residing in the
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
674 * arc_mfu state. This includes *all* buffers in the arc_mfu
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
675 * state; e.g. data, metadata, evictable, and unevictable buffers
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
676 * are all included in this value.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
677 * Not updated directly; only synced in arc_kstat_update.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
678 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
679 kstat_named_t arcstat_mfu_size;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
680 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
681 * Number of bytes consumed by ARC buffers that are eligible for
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
682 * eviction, of type ARC_BUFC_DATA, and reside in the arc_mfu
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
683 * state.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
684 * Not updated directly; only synced in arc_kstat_update.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
685 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
686 kstat_named_t arcstat_mfu_evictable_data;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
687 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
688 * Number of bytes consumed by ARC buffers that are eligible for
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
689 * eviction, of type ARC_BUFC_METADATA, and reside in the
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
690 * arc_mfu state.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
691 * Not updated directly; only synced in arc_kstat_update.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
692 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
693 kstat_named_t arcstat_mfu_evictable_metadata;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
694 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
695 * Total number of bytes that *would have been* consumed by ARC
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
696 * buffers in the arc_mfu_ghost state. See the comment above
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
697 * arcstat_mru_ghost_size for more details.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
698 * Not updated directly; only synced in arc_kstat_update.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
699 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
700 kstat_named_t arcstat_mfu_ghost_size;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
701 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
702 * Number of bytes that *would have been* consumed by ARC
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
703 * buffers that are eligible for eviction, of type
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
704 * ARC_BUFC_DATA, and linked off the arc_mfu_ghost state.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
705 * Not updated directly; only synced in arc_kstat_update.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
706 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
707 kstat_named_t arcstat_mfu_ghost_evictable_data;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
708 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
709 * Number of bytes that *would have been* consumed by ARC
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
710 * buffers that are eligible for eviction, of type
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
711 * ARC_BUFC_METADATA, and linked off the arc_mru_ghost state.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
712 * Not updated directly; only synced in arc_kstat_update.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
713 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
714 kstat_named_t arcstat_mfu_ghost_evictable_metadata;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
715 kstat_named_t arcstat_l2_hits;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
716 kstat_named_t arcstat_l2_misses;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
717 kstat_named_t arcstat_l2_feeds;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
718 kstat_named_t arcstat_l2_rw_clash;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
719 kstat_named_t arcstat_l2_read_bytes;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
720 kstat_named_t arcstat_l2_write_bytes;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
721 kstat_named_t arcstat_l2_writes_sent;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
722 kstat_named_t arcstat_l2_writes_done;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
723 kstat_named_t arcstat_l2_writes_error;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
724 kstat_named_t arcstat_l2_writes_lock_retry;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
725 kstat_named_t arcstat_l2_evict_lock_retry;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
726 kstat_named_t arcstat_l2_evict_reading;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
727 kstat_named_t arcstat_l2_evict_l1cached;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
728 kstat_named_t arcstat_l2_free_on_write;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
729 kstat_named_t arcstat_l2_abort_lowmem;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
730 kstat_named_t arcstat_l2_cksum_bad;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
731 kstat_named_t arcstat_l2_io_error;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
732 kstat_named_t arcstat_l2_lsize;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
733 kstat_named_t arcstat_l2_psize;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
734 /* Not updated directly; only synced in arc_kstat_update. */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
735 kstat_named_t arcstat_l2_hdr_size;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
736 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
737 * Number of L2ARC log blocks written. These are used for restoring the
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
738 * L2ARC. Updated during writing of L2ARC log blocks.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
739 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
740 kstat_named_t arcstat_l2_log_blk_writes;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
741 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
742 * Moving average of the aligned size of the L2ARC log blocks, in
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
743 * bytes. Updated during L2ARC rebuild and during writing of L2ARC
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
744 * log blocks.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
745 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
746 kstat_named_t arcstat_l2_log_blk_avg_asize;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
747 /* Aligned size of L2ARC log blocks on L2ARC devices. */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
748 kstat_named_t arcstat_l2_log_blk_asize;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
749 /* Number of L2ARC log blocks present on L2ARC devices. */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
750 kstat_named_t arcstat_l2_log_blk_count;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
751 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
752 * Moving average of the aligned size of L2ARC restored data, in bytes,
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
753 * to the aligned size of their metadata in L2ARC, in bytes.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
754 * Updated during L2ARC rebuild and during writing of L2ARC log blocks.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
755 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
756 kstat_named_t arcstat_l2_data_to_meta_ratio;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
757 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
758 * Number of times the L2ARC rebuild was successful for an L2ARC device.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
759 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
760 kstat_named_t arcstat_l2_rebuild_success;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
761 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
762 * Number of times the L2ARC rebuild failed because the device header
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
763 * was in an unsupported format or corrupted.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
764 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
765 kstat_named_t arcstat_l2_rebuild_abort_unsupported;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
766 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
767 * Number of times the L2ARC rebuild failed because of IO errors
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
768 * while reading a log block.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
769 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
770 kstat_named_t arcstat_l2_rebuild_abort_io_errors;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
771 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
772 * Number of times the L2ARC rebuild failed because of IO errors when
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
773 * reading the device header.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
774 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
775 kstat_named_t arcstat_l2_rebuild_abort_dh_errors;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
776 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
777 * Number of L2ARC log blocks which failed to be restored due to
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
778 * checksum errors.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
779 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
780 kstat_named_t arcstat_l2_rebuild_abort_cksum_lb_errors;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
781 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
782 * Number of times the L2ARC rebuild was aborted due to low system
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
783 * memory.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
784 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
785 kstat_named_t arcstat_l2_rebuild_abort_lowmem;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
786 /* Logical size of L2ARC restored data, in bytes. */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
787 kstat_named_t arcstat_l2_rebuild_size;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
788 /* Aligned size of L2ARC restored data, in bytes. */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
789 kstat_named_t arcstat_l2_rebuild_asize;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
790 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
791 * Number of L2ARC log entries (buffers) that were successfully
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
792 * restored in ARC.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
793 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
794 kstat_named_t arcstat_l2_rebuild_bufs;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
795 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
796 * Number of L2ARC log entries (buffers) already cached in ARC. These
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
797 * were not restored again.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
798 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
799 kstat_named_t arcstat_l2_rebuild_bufs_precached;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
800 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
801 * Number of L2ARC log blocks that were restored successfully. Each
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
802 * log block may hold up to L2ARC_LOG_BLK_MAX_ENTRIES buffers.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
803 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
804 kstat_named_t arcstat_l2_rebuild_log_blks;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
805 kstat_named_t arcstat_memory_throttle_count;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
806 /* Not updated directly; only synced in arc_kstat_update. */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
807 kstat_named_t arcstat_meta_used;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
808 kstat_named_t arcstat_meta_limit;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
809 kstat_named_t arcstat_meta_max;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
810 kstat_named_t arcstat_meta_min;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
811 kstat_named_t arcstat_async_upgrade_sync;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
812 kstat_named_t arcstat_demand_hit_predictive_prefetch;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
813 kstat_named_t arcstat_demand_hit_prescient_prefetch;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
814 } arc_stats_t;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
815
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
816 #define ARCSTAT(stat) (arc_stats.stat.value.ui64)
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
817
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
818 #define ARCSTAT_INCR(stat, val) \
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
819 atomic_add_64(&arc_stats.stat.value.ui64, (val))
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
820
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
821 #define ARCSTAT_BUMP(stat) ARCSTAT_INCR(stat, 1)
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
822 #define ARCSTAT_BUMPDOWN(stat) ARCSTAT_INCR(stat, -1)
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
823
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
824 /*
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
825 * There are several ARC variables that are critical to export as kstats --
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
826 * but we don't want to have to grovel around in the kstat whenever we wish to
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
827 * manipulate them. For these variables, we therefore define them to be in
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
828 * terms of the statistic variable. This assures that we are not introducing
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
829 * the possibility of inconsistency by having shadow copies of the variables,
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
830 * while still allowing the code to be readable.
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
831 */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
832 #define arc_p ARCSTAT(arcstat_p) /* target size of MRU */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
833 #define arc_c ARCSTAT(arcstat_c) /* target size of cache */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
834 #define arc_c_min ARCSTAT(arcstat_c_min) /* min target cache size */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
835 #define arc_c_max ARCSTAT(arcstat_c_max) /* max target cache size */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
836 #define arc_meta_limit ARCSTAT(arcstat_meta_limit) /* max size for metadata */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
837 #define arc_meta_min ARCSTAT(arcstat_meta_min) /* min size for metadata */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
838 #define arc_meta_max ARCSTAT(arcstat_meta_max) /* max size of metadata */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
839
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
840 /* compressed size of entire arc */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
841 #define arc_compressed_size ARCSTAT(arcstat_compressed_size)
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
842 /* uncompressed size of entire arc */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
843 #define arc_uncompressed_size ARCSTAT(arcstat_uncompressed_size)
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
844 /* number of bytes in the arc from arc_buf_t's */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
845 #define arc_overhead_size ARCSTAT(arcstat_overhead_size)
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
846
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
847 extern arc_stats_t arc_stats;
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
848
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
849 /* used in zdb.c */
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
850 boolean_t l2arc_log_blkptr_valid(l2arc_dev_t *dev,
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
851 const l2arc_log_blkptr_t *lbp);
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
852
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
853 #ifdef __cplusplus
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
854 }
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
855 #endif
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
856
2c417db70a87 3525 Persistent L2ARC
George Amanakis <gamanakis@gmail.com>
parents:
diff changeset
857 #endif /* _SYS_ARC_IMPL_H */