mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-25 11:47:43 +03:00
Optimize allocation throttling
Remove mc_lock use from metaslab_class_throttle_*(). The math there is based on refcounts and so atomic, so the only race possible there is between zfs_refcount_count() and zfs_refcount_add(). But in most cases metaslab_class_throttle_reserve() is called with the allocator lock held, which covers the race. In cases where the lock is not held, GANG_ALLOCATION() or METASLAB_MUST_RESERVE are set, and so we do not use zfs_refcount_count(). And even if we assume some other non-existing scenario, the worst that may happen from this race is few more I/Os get to allocation earlier, that is not a problem. Move locks and data of different allocators into different cache lines to avoid false sharing. Group spa_alloc_* arrays together into single array of aligned struct spa_alloc spa_allocs. Align struct metaslab_class_allocator. Reviewed-by: Paul Dagnelie <pcd@delphix.com> Reviewed-by: Ryan Moeller <ryan@iXsystems.com> Reviewed-by: Don Brady <don.brady@delphix.com> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored-By: iXsystems, Inc. Closes #12314
This commit is contained in:
+6
-6
@@ -9197,9 +9197,9 @@ spa_sync(spa_t *spa, uint64_t txg)
|
||||
spa->spa_sync_pass = 0;
|
||||
|
||||
for (int i = 0; i < spa->spa_alloc_count; i++) {
|
||||
mutex_enter(&spa->spa_alloc_locks[i]);
|
||||
VERIFY0(avl_numnodes(&spa->spa_alloc_trees[i]));
|
||||
mutex_exit(&spa->spa_alloc_locks[i]);
|
||||
mutex_enter(&spa->spa_allocs[i].spaa_lock);
|
||||
VERIFY0(avl_numnodes(&spa->spa_allocs[i].spaa_tree));
|
||||
mutex_exit(&spa->spa_allocs[i].spaa_lock);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -9309,9 +9309,9 @@ spa_sync(spa_t *spa, uint64_t txg)
|
||||
dsl_pool_sync_done(dp, txg);
|
||||
|
||||
for (int i = 0; i < spa->spa_alloc_count; i++) {
|
||||
mutex_enter(&spa->spa_alloc_locks[i]);
|
||||
VERIFY0(avl_numnodes(&spa->spa_alloc_trees[i]));
|
||||
mutex_exit(&spa->spa_alloc_locks[i]);
|
||||
mutex_enter(&spa->spa_allocs[i].spaa_lock);
|
||||
VERIFY0(avl_numnodes(&spa->spa_allocs[i].spaa_tree));
|
||||
mutex_exit(&spa->spa_allocs[i].spaa_lock);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user