]> git.proxmox.com Git - mirror_zfs.git/commitdiff
BRT: Relax brt_pending_apply() locking
authorAlexander Motin <mav@FreeBSD.org>
Mon, 25 Mar 2024 21:59:55 +0000 (17:59 -0400)
committerGitHub <noreply@github.com>
Mon, 25 Mar 2024 21:59:55 +0000 (14:59 -0700)
Since brt_pending_apply() is running in syncing context, no other
brt_pending_tree accesses are possible for the TXG.  We don't need
to acquire brt_pending_lock here.

Reviewed-by: Pawel Jakub Dawidek <pawel@dawidek.net>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Brian Atkinson <batkinson@lanl.gov>
Reviewed-by: Rob Norris <robn@despairlabs.com>
Signed-off-by: Alexander Motin <mav@FreeBSD.org>
Sponsored by: iXsystems, Inc.
Closes #15955

module/zfs/brt.c

index 5e10df9dfe56924a0b82975bedec42a8534ccb0f..416caeb11c7ef1aa4922da42998058b9a26cfa41 100644 (file)
@@ -1473,26 +1473,23 @@ brt_pending_remove(spa_t *spa, const blkptr_t *bp, dmu_tx_t *tx)
 void
 brt_pending_apply(spa_t *spa, uint64_t txg)
 {
-       brt_t *brt;
+       brt_t *brt = spa->spa_brt;
        brt_pending_entry_t *bpe;
        avl_tree_t *pending_tree;
-       kmutex_t *pending_lock;
        void *c;
 
        ASSERT3U(txg, !=, 0);
 
-       brt = spa->spa_brt;
+       /*
+        * We are in syncing context, so no other brt_pending_tree accesses
+        * are possible for the TXG. Don't need to acquire brt_pending_lock.
+        */
        pending_tree = &brt->brt_pending_tree[txg & TXG_MASK];
-       pending_lock = &brt->brt_pending_lock[txg & TXG_MASK];
-
-       mutex_enter(pending_lock);
 
        c = NULL;
        while ((bpe = avl_destroy_nodes(pending_tree, &c)) != NULL) {
                boolean_t added_to_ddt;
 
-               mutex_exit(pending_lock);
-
                for (int i = 0; i < bpe->bpe_count; i++) {
                        /*
                         * If the block has DEDUP bit set, it means that it
@@ -1510,10 +1507,7 @@ brt_pending_apply(spa_t *spa, uint64_t txg)
                }
 
                kmem_cache_free(brt_pending_entry_cache, bpe);
-               mutex_enter(pending_lock);
        }
-
-       mutex_exit(pending_lock);
 }
 
 static void