diff options
author | Alexander Motin <mav@FreeBSD.org> | 2021-08-17 11:55:34 -0400 |
---|---|---|
committer | Brian Behlendorf <behlendorf1@llnl.gov> | 2021-08-31 10:30:21 -0700 |
commit | 28aefb20f32d476955908d65d7940ead7f2437a5 (patch) | |
tree | 511d1fa904f44044cedb1daac7cf1d77d16c1d57 | |
parent | 772f58cccd0a261448ec3417d9e279eb6106cd2f (diff) |
Optimize arc_l2c_only lists assertions
It is very expensive and not informative to call multilist_is_empty()
for each arc_change_state() on debug builds to check for impossible.
Instead implement special index function for arc_l2c_only->arcs_list,
multilists, panicking on any attempt to use it.
Reviewed-by: Mark Maybee <mark.maybee@delphix.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Alexander Motin <mav@FreeBSD.org>
Closes #12421
-rw-r--r-- | module/zfs/arc.c | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/module/zfs/arc.c b/module/zfs/arc.c index a440d189d..b821ebba3 100644 --- a/module/zfs/arc.c +++ b/module/zfs/arc.c @@ -2579,13 +2579,6 @@ arc_change_state(arc_state_t *new_state, arc_buf_hdr_t *hdr, l2arc_hdr_arcstats_increment_state(hdr); } } - - /* - * L2 headers should never be on the L2 state list since they don't - * have L1 headers allocated. - */ - ASSERT(multilist_is_empty(&arc_l2c_only->arcs_list[ARC_BUFC_DATA]) && - multilist_is_empty(&arc_l2c_only->arcs_list[ARC_BUFC_METADATA])); } void @@ -7462,6 +7455,12 @@ arc_state_multilist_index_func(multilist_t *ml, void *obj) multilist_get_num_sublists(ml)); } +static unsigned int +arc_state_l2c_multilist_index_func(multilist_t *ml, void *obj) +{ + panic("Header %p insert into arc_l2c_only %p", obj, ml); +} + #define WARN_IF_TUNING_IGNORED(tuning, value, do_warn) do { \ if ((do_warn) && (tuning) && ((tuning) != (value))) { \ cmn_err(CE_WARN, \ @@ -7609,14 +7608,18 @@ arc_state_init(void) sizeof (arc_buf_hdr_t), offsetof(arc_buf_hdr_t, b_l1hdr.b_arc_node), arc_state_multilist_index_func); + /* + * L2 headers should never be on the L2 state list since they don't + * have L1 headers allocated. Special index function asserts that. + */ multilist_create(&arc_l2c_only->arcs_list[ARC_BUFC_METADATA], sizeof (arc_buf_hdr_t), offsetof(arc_buf_hdr_t, b_l1hdr.b_arc_node), - arc_state_multilist_index_func); + arc_state_l2c_multilist_index_func); multilist_create(&arc_l2c_only->arcs_list[ARC_BUFC_DATA], sizeof (arc_buf_hdr_t), offsetof(arc_buf_hdr_t, b_l1hdr.b_arc_node), - arc_state_multilist_index_func); + arc_state_l2c_multilist_index_func); zfs_refcount_create(&arc_anon->arcs_esize[ARC_BUFC_METADATA]); zfs_refcount_create(&arc_anon->arcs_esize[ARC_BUFC_DATA]); |