]> git.proxmox.com Git - mirror_zfs.git/commitdiff
BRT: Change brt_pending_tree sorting order
authorAlexander Motin <mav@FreeBSD.org>
Thu, 21 Mar 2024 22:42:21 +0000 (18:42 -0400)
committerGitHub <noreply@github.com>
Thu, 21 Mar 2024 22:42:21 +0000 (15:42 -0700)
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

module/zfs/brt.c

index 225ddaca1e5410c7245645a4fbf45255c20c18a8..3d565cd1397c7633d464438ca723a11521c79bbe 100644 (file)
@@ -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;
        int cmp;
 
-       cmp = TREE_CMP(BP_PHYSICAL_BIRTH(bp1), BP_PHYSICAL_BIRTH(bp2));
+       cmp = TREE_CMP(DVA_GET_VDEV(&bp1->blk_dva[0]),
+           DVA_GET_VDEV(&bp2->blk_dva[0]));
        if (cmp == 0) {
-               cmp = TREE_CMP(DVA_GET_VDEV(&bp1->blk_dva[0]),
-                   DVA_GET_VDEV(&bp2->blk_dva[0]));
-               if (cmp == 0) {
-                       cmp = TREE_CMP(DVA_GET_OFFSET(&bp1->blk_dva[0]),
-                           DVA_GET_OFFSET(&bp2->blk_dva[0]));
+               cmp = TREE_CMP(DVA_GET_OFFSET(&bp1->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));
                }
        }