Skip to content

Commit a497c5f

Browse files
authored
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 <gamanakis@gmail.com> Reviewed-by: Tony Hutter <hutter2@llnl.gov> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored by: iXsystems, Inc. Closes #17204
1 parent 8f08dbf commit a497c5f

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
@@ -3560,12 +3560,9 @@ dbuf_issue_final_prefetch_done(zio_t *zio, const zbookmark_phys_t *zb,
35603560
static void
35613561
dbuf_issue_final_prefetch(dbuf_prefetch_arg_t *dpa, blkptr_t *bp)
35623562
{
3563-
ASSERT(!BP_IS_REDACTED(bp) ||
3564-
dsl_dataset_feature_is_active(
3565-
dpa->dpa_dnode->dn_objset->os_dsl_dataset,
3566-
SPA_FEATURE_REDACTED_DATASETS));
3567-
3568-
if (BP_IS_HOLE(bp) || BP_IS_EMBEDDED(bp) || BP_IS_REDACTED(bp))
3563+
ASSERT(!BP_IS_HOLE(bp));
3564+
ASSERT(!BP_IS_REDACTED(bp));
3565+
if (BP_IS_EMBEDDED(bp))
35693566
return (dbuf_prefetch_fini(dpa, B_FALSE));
35703567

35713568
int zio_flags = ZIO_FLAG_CANFAIL | ZIO_FLAG_SPECULATIVE;
@@ -3651,10 +3648,10 @@ dbuf_prefetch_indirect_done(zio_t *zio, const zbookmark_phys_t *zb,
36513648
blkptr_t *bp = ((blkptr_t *)abuf->b_data) +
36523649
P2PHASE(nextblkid, 1ULL << dpa->dpa_epbs);
36533650

3654-
ASSERT(!BP_IS_REDACTED(bp) || (dpa->dpa_dnode &&
3651+
ASSERT(!BP_IS_REDACTED(bp) || dpa->dpa_dnode == NULL ||
36553652
dsl_dataset_feature_is_active(
36563653
dpa->dpa_dnode->dn_objset->os_dsl_dataset,
3657-
SPA_FEATURE_REDACTED_DATASETS)));
3654+
SPA_FEATURE_REDACTED_DATASETS));
36583655
if (BP_IS_HOLE(bp) || BP_IS_REDACTED(bp)) {
36593656
arc_buf_destroy(abuf, private);
36603657
dbuf_prefetch_fini(dpa, B_TRUE);
@@ -3667,8 +3664,14 @@ dbuf_prefetch_indirect_done(zio_t *zio, const zbookmark_phys_t *zb,
36673664
zbookmark_phys_t zb;
36683665

36693666
/* flag if L2ARC eligible, l2arc_noprefetch then decides */
3670-
if (dpa->dpa_aflags & ARC_FLAG_L2CACHE)
3671-
iter_aflags |= ARC_FLAG_L2CACHE;
3667+
if (dpa->dpa_dnode) {
3668+
if (dnode_level_is_l2cacheable(bp, dpa->dpa_dnode,
3669+
dpa->dpa_curlevel))
3670+
iter_aflags |= ARC_FLAG_L2CACHE;
3671+
} else {
3672+
if (dpa->dpa_aflags & ARC_FLAG_L2CACHE)
3673+
iter_aflags |= ARC_FLAG_L2CACHE;
3674+
}
36723675

36733676
ASSERT3U(dpa->dpa_curlevel, ==, BP_GET_LEVEL(bp));
36743677

@@ -3807,7 +3810,7 @@ dbuf_prefetch_impl(dnode_t *dn, int64_t level, uint64_t blkid,
38073810
zbookmark_phys_t zb;
38083811

38093812
/* flag if L2ARC eligible, l2arc_noprefetch then decides */
3810-
if (dnode_level_is_l2cacheable(&bp, dn, level))
3813+
if (dnode_level_is_l2cacheable(&bp, dn, curlevel))
38113814
iter_aflags |= ARC_FLAG_L2CACHE;
38123815

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

0 commit comments

Comments
 (0)