Skip to content

Commit

Permalink
BRT: Relax brt_pending_apply() locking
Browse files Browse the repository at this point in the history
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 <[email protected]>
Reviewed-by: Brian Behlendorf <[email protected]>
Reviewed-by: Brian Atkinson <[email protected]>
Reviewed-by: Rob Norris <[email protected]>
Signed-off-by:	Alexander Motin <[email protected]>
Sponsored by:	iXsystems, Inc.
Closes #15955
  • Loading branch information
amotin authored and behlendorf committed Apr 19, 2024
1 parent 19bf54b commit 457e62d
Showing 1 changed file with 5 additions and 11 deletions.
16 changes: 5 additions & 11 deletions module/zfs/brt.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down

0 comments on commit 457e62d

Please sign in to comment.