unnecessary alloc/free in dsl_scan_visitbp()
Clean up code in dsl_scan_visitbp() by removing an unnecessary alloc/free and `goto`. This has the side benefit of reducing CPU usage, which is only really noticeable if we are not doing i/o for the leaf blocks, like when `zfs_no_scrub_io` is set. Reviewed-by: Alexander Motin <mav@FreeBSD.org> Reviewed-by: Mark Maybee <mark.maybee@delphix.com> Reviewed-by: Richard Yao <richard.yao@alumni.stonybrook.edu> Signed-off-by: Matthew Ahrens <mahrens@delphix.com> Closes #15549
This commit is contained in:
parent
30d581121b
commit
67894a597f
|
@ -2142,7 +2142,7 @@ dsl_scan_check_resume(dsl_scan_t *scn, const dnode_phys_t *dnp,
|
||||||
return (B_FALSE);
|
return (B_FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dsl_scan_visitbp(blkptr_t *bp, const zbookmark_phys_t *zb,
|
static void dsl_scan_visitbp(const blkptr_t *bp, const zbookmark_phys_t *zb,
|
||||||
dnode_phys_t *dnp, dsl_dataset_t *ds, dsl_scan_t *scn,
|
dnode_phys_t *dnp, dsl_dataset_t *ds, dsl_scan_t *scn,
|
||||||
dmu_objset_type_t ostype, dmu_tx_t *tx);
|
dmu_objset_type_t ostype, dmu_tx_t *tx);
|
||||||
inline __attribute__((always_inline)) static void dsl_scan_visitdnode(
|
inline __attribute__((always_inline)) static void dsl_scan_visitdnode(
|
||||||
|
@ -2307,12 +2307,11 @@ dsl_scan_visitdnode(dsl_scan_t *scn, dsl_dataset_t *ds,
|
||||||
* first 5; we want them to be useful.
|
* first 5; we want them to be useful.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
dsl_scan_visitbp(blkptr_t *bp, const zbookmark_phys_t *zb,
|
dsl_scan_visitbp(const blkptr_t *bp, const zbookmark_phys_t *zb,
|
||||||
dnode_phys_t *dnp, dsl_dataset_t *ds, dsl_scan_t *scn,
|
dnode_phys_t *dnp, dsl_dataset_t *ds, dsl_scan_t *scn,
|
||||||
dmu_objset_type_t ostype, dmu_tx_t *tx)
|
dmu_objset_type_t ostype, dmu_tx_t *tx)
|
||||||
{
|
{
|
||||||
dsl_pool_t *dp = scn->scn_dp;
|
dsl_pool_t *dp = scn->scn_dp;
|
||||||
blkptr_t *bp_toread = NULL;
|
|
||||||
|
|
||||||
if (dsl_scan_check_suspend(scn, zb))
|
if (dsl_scan_check_suspend(scn, zb))
|
||||||
return;
|
return;
|
||||||
|
@ -2353,11 +2352,8 @@ dsl_scan_visitbp(blkptr_t *bp, const zbookmark_phys_t *zb,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
bp_toread = kmem_alloc(sizeof (blkptr_t), KM_SLEEP);
|
if (dsl_scan_recurse(scn, ds, ostype, dnp, bp, zb, tx) != 0)
|
||||||
*bp_toread = *bp;
|
return;
|
||||||
|
|
||||||
if (dsl_scan_recurse(scn, ds, ostype, dnp, bp_toread, zb, tx) != 0)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If dsl_scan_ddt() has already visited this block, it will have
|
* If dsl_scan_ddt() has already visited this block, it will have
|
||||||
|
@ -2367,7 +2363,7 @@ dsl_scan_visitbp(blkptr_t *bp, const zbookmark_phys_t *zb,
|
||||||
if (ddt_class_contains(dp->dp_spa,
|
if (ddt_class_contains(dp->dp_spa,
|
||||||
scn->scn_phys.scn_ddt_class_max, bp)) {
|
scn->scn_phys.scn_ddt_class_max, bp)) {
|
||||||
scn->scn_ddt_contained_this_txg++;
|
scn->scn_ddt_contained_this_txg++;
|
||||||
goto out;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -2379,13 +2375,10 @@ dsl_scan_visitbp(blkptr_t *bp, const zbookmark_phys_t *zb,
|
||||||
*/
|
*/
|
||||||
if (BP_PHYSICAL_BIRTH(bp) > scn->scn_phys.scn_cur_max_txg) {
|
if (BP_PHYSICAL_BIRTH(bp) > scn->scn_phys.scn_cur_max_txg) {
|
||||||
scn->scn_gt_max_this_txg++;
|
scn->scn_gt_max_this_txg++;
|
||||||
goto out;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
scan_funcs[scn->scn_phys.scn_func](dp, bp, zb);
|
scan_funcs[scn->scn_phys.scn_func](dp, bp, zb);
|
||||||
|
|
||||||
out:
|
|
||||||
kmem_free(bp_toread, sizeof (blkptr_t));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
Loading…
Reference in New Issue