BRT: Change brt_pending_tree sorting order
It does not look important how exactly brt_pending_tree is sorted. When cloning large file, it is quite likely that all of its blocks have identical physical birth times, so comparing them first does not provide useful entropy, while accesses additional cache line. In most cases combination of vdev and offset provides unique result and physical birth time comparison is not even needed. Meanwhile, when traversing the tree inside brt_pending_apply(), it can be beneficial for dbuf cache and CPU cache hits to group processing by vdev and so by the per-VDEV BRT ZAPs. Reviewed-by: Rob Norris <robn@despairlabs.com> Reviewed-by: Brian Atkinson <batkinson@lanl.gov> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored by: iXsystems, Inc. Closes #15954
This commit is contained in:
parent
fa5de0c5cd
commit
f7c1db6366
|
@ -1420,13 +1420,14 @@ brt_pending_entry_compare(const void *x1, const void *x2)
|
||||||
const blkptr_t *bp1 = &bpe1->bpe_bp, *bp2 = &bpe2->bpe_bp;
|
const blkptr_t *bp1 = &bpe1->bpe_bp, *bp2 = &bpe2->bpe_bp;
|
||||||
int cmp;
|
int cmp;
|
||||||
|
|
||||||
cmp = TREE_CMP(BP_PHYSICAL_BIRTH(bp1), BP_PHYSICAL_BIRTH(bp2));
|
|
||||||
if (cmp == 0) {
|
|
||||||
cmp = TREE_CMP(DVA_GET_VDEV(&bp1->blk_dva[0]),
|
cmp = TREE_CMP(DVA_GET_VDEV(&bp1->blk_dva[0]),
|
||||||
DVA_GET_VDEV(&bp2->blk_dva[0]));
|
DVA_GET_VDEV(&bp2->blk_dva[0]));
|
||||||
if (cmp == 0) {
|
if (cmp == 0) {
|
||||||
cmp = TREE_CMP(DVA_GET_OFFSET(&bp1->blk_dva[0]),
|
cmp = TREE_CMP(DVA_GET_OFFSET(&bp1->blk_dva[0]),
|
||||||
DVA_GET_OFFSET(&bp2->blk_dva[0]));
|
DVA_GET_OFFSET(&bp2->blk_dva[0]));
|
||||||
|
if (unlikely(cmp == 0)) {
|
||||||
|
cmp = TREE_CMP(BP_PHYSICAL_BIRTH(bp1),
|
||||||
|
BP_PHYSICAL_BIRTH(bp2));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue