Skip to content

Commit 8b30639

Browse files
amotinixhamza
authored andcommitted
Improve L2 caching control for prefetched indirects
dbuf_prefetch_impl() should look on level of current indirect, not the target prefetch level. dbuf_prefetch_indirect_done() should call dnode_level_is_l2cacheable() if we have dpa_dnode to pass it. It should fix some both false positive and negative L2ARC caching. While there, fix redacted feature activation assertions. One was always true, while another could give false positive if dpa_dnode is NULL. George Amanakis <[email protected]> Reviewed-by: Tony Hutter <[email protected]> Signed-off-by: Alexander Motin <[email protected]> Sponsored by: iXsystems, Inc. Closes openzfs#17204
1 parent 561cb8e commit 8b30639

File tree

1 file changed

+14
-11
lines changed

1 file changed

+14
-11
lines changed

module/zfs/dbuf.c

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3591,12 +3591,9 @@ dbuf_issue_final_prefetch_done(zio_t *zio, const zbookmark_phys_t *zb,
35913591
static void
35923592
dbuf_issue_final_prefetch(dbuf_prefetch_arg_t *dpa, blkptr_t *bp)
35933593
{
3594-
ASSERT(!BP_IS_REDACTED(bp) ||
3595-
dsl_dataset_feature_is_active(
3596-
dpa->dpa_dnode->dn_objset->os_dsl_dataset,
3597-
SPA_FEATURE_REDACTED_DATASETS));
3598-
3599-
if (BP_IS_HOLE(bp) || BP_IS_EMBEDDED(bp) || BP_IS_REDACTED(bp))
3594+
ASSERT(!BP_IS_HOLE(bp));
3595+
ASSERT(!BP_IS_REDACTED(bp));
3596+
if (BP_IS_EMBEDDED(bp))
36003597
return (dbuf_prefetch_fini(dpa, B_FALSE));
36013598

36023599
int zio_flags = ZIO_FLAG_CANFAIL | ZIO_FLAG_SPECULATIVE;
@@ -3682,10 +3679,10 @@ dbuf_prefetch_indirect_done(zio_t *zio, const zbookmark_phys_t *zb,
36823679
blkptr_t *bp = ((blkptr_t *)abuf->b_data) +
36833680
P2PHASE(nextblkid, 1ULL << dpa->dpa_epbs);
36843681

3685-
ASSERT(!BP_IS_REDACTED(bp) || (dpa->dpa_dnode &&
3682+
ASSERT(!BP_IS_REDACTED(bp) || dpa->dpa_dnode == NULL ||
36863683
dsl_dataset_feature_is_active(
36873684
dpa->dpa_dnode->dn_objset->os_dsl_dataset,
3688-
SPA_FEATURE_REDACTED_DATASETS)));
3685+
SPA_FEATURE_REDACTED_DATASETS));
36893686
if (BP_IS_HOLE(bp) || BP_IS_REDACTED(bp)) {
36903687
arc_buf_destroy(abuf, private);
36913688
dbuf_prefetch_fini(dpa, B_TRUE);
@@ -3698,8 +3695,14 @@ dbuf_prefetch_indirect_done(zio_t *zio, const zbookmark_phys_t *zb,
36983695
zbookmark_phys_t zb;
36993696

37003697
/* flag if L2ARC eligible, l2arc_noprefetch then decides */
3701-
if (dpa->dpa_aflags & ARC_FLAG_L2CACHE)
3702-
iter_aflags |= ARC_FLAG_L2CACHE;
3698+
if (dpa->dpa_dnode) {
3699+
if (dnode_level_is_l2cacheable(bp, dpa->dpa_dnode,
3700+
dpa->dpa_curlevel))
3701+
iter_aflags |= ARC_FLAG_L2CACHE;
3702+
} else {
3703+
if (dpa->dpa_aflags & ARC_FLAG_L2CACHE)
3704+
iter_aflags |= ARC_FLAG_L2CACHE;
3705+
}
37033706

37043707
ASSERT3U(dpa->dpa_curlevel, ==, BP_GET_LEVEL(bp));
37053708

@@ -3838,7 +3841,7 @@ dbuf_prefetch_impl(dnode_t *dn, int64_t level, uint64_t blkid,
38383841
zbookmark_phys_t zb;
38393842

38403843
/* flag if L2ARC eligible, l2arc_noprefetch then decides */
3841-
if (dnode_level_is_l2cacheable(&bp, dn, level))
3844+
if (dnode_level_is_l2cacheable(&bp, dn, curlevel))
38423845
iter_aflags |= ARC_FLAG_L2CACHE;
38433846

38443847
SET_BOOKMARK(&zb, ds != NULL ? ds->ds_object : DMU_META_OBJSET,

0 commit comments

Comments
 (0)