@@ -457,7 +457,9 @@ metaslab_class_destroy(metaslab_class_t *mc)
457457 spa_t * spa = mc -> mc_spa ;
458458
459459 ASSERT0 (mc -> mc_alloc );
460+ ASSERT0 (mc -> mc_dalloc );
460461 ASSERT0 (mc -> mc_deferred );
462+ ASSERT0 (mc -> mc_ddeferred );
461463 ASSERT0 (mc -> mc_space );
462464 ASSERT0 (mc -> mc_dspace );
463465
@@ -573,8 +575,10 @@ metaslab_class_balance(metaslab_class_t *mc, boolean_t onsync)
573575 * relative to average. Bigger vdevs should get more to
574576 * fill up at the same time as smaller ones.
575577 */
576- if (mc -> mc_space > 0 && vs -> vs_space > 0 ) {
577- ratio = vs -> vs_space / (mc -> mc_space / (mc -> mc_groups *
578+ uint64_t mc_space = atomic_load_64 (& mc -> mc_space );
579+ uint64_t vs_space = atomic_load_64 (& vs -> vs_space );
580+ if (mc_space > 0 && vs_space > 0 ) {
581+ ratio = vs_space / (mc_space / (mc -> mc_groups *
578582 256 ) + 1 );
579583 mg_aliquot = mg_aliquot * ratio / 256 ;
580584 }
@@ -595,18 +599,20 @@ metaslab_class_balance(metaslab_class_t *mc, boolean_t onsync)
595599 * queue depth, stronger enforcing the free space balance.
596600 */
597601 if (metaslab_bias_enabled &&
598- mc -> mc_space > 0 && vs -> vs_space > 0 ) {
599- uint64_t vs_free = vs -> vs_space > vs -> vs_alloc ?
600- vs -> vs_space - vs -> vs_alloc : 0 ;
601- uint64_t mc_free = mc -> mc_space > mc -> mc_alloc ?
602- mc -> mc_space - mc -> mc_alloc : 0 ;
602+ mc_space > 0 && vs_space > 0 ) {
603+ uint64_t mc_alloc = atomic_load_64 (& mc -> mc_alloc );
604+ uint64_t vs_alloc = atomic_load_64 (& vs -> vs_alloc );
605+ uint64_t vs_free = vs_space > vs_alloc ?
606+ vs_space - vs_alloc : 0 ;
607+ uint64_t mc_free = mc_space > mc_alloc ?
608+ mc_space - mc_alloc : 0 ;
603609 /*
604610 * vs_fr is 16 bit fixed-point free space fraction.
605611 * mc_fr is 8 bit fixed-point free space fraction.
606612 * ratio as their quotient is 8 bit fixed-point.
607613 */
608- uint_t vs_fr = vs_free / (vs -> vs_space / 65536 + 1 );
609- uint_t mc_fr = mc_free / (mc -> mc_space / 256 + 1 );
614+ uint_t vs_fr = vs_free / (vs_space / 65536 + 1 );
615+ uint_t mc_fr = mc_free / (mc_space / 256 + 1 );
610616 ratio = vs_fr / (mc_fr + 1 );
611617 mg -> mg_aliquot = mg_aliquot * ratio / 256 ;
612618 /* From 2.5x at 25% full to 1x at 75%. */
@@ -693,10 +699,13 @@ metaslab_class_rotate(metaslab_group_t *mg, int allocator, uint64_t psize,
693699
694700static void
695701metaslab_class_space_update (metaslab_class_t * mc , int64_t alloc_delta ,
696- int64_t defer_delta , int64_t space_delta , int64_t dspace_delta )
702+ int64_t dalloc_delta , int64_t deferred_delta , int64_t ddeferred_delta ,
703+ int64_t space_delta , int64_t dspace_delta )
697704{
698705 atomic_add_64 (& mc -> mc_alloc , alloc_delta );
699- atomic_add_64 (& mc -> mc_deferred , defer_delta );
706+ atomic_add_64 (& mc -> mc_dalloc , dalloc_delta );
707+ atomic_add_64 (& mc -> mc_deferred , deferred_delta );
708+ atomic_add_64 (& mc -> mc_ddeferred , ddeferred_delta );
700709 atomic_add_64 (& mc -> mc_space , space_delta );
701710 atomic_add_64 (& mc -> mc_dspace , dspace_delta );
702711}
@@ -710,25 +719,34 @@ metaslab_class_get_name(metaslab_class_t *mc)
710719uint64_t
711720metaslab_class_get_alloc (metaslab_class_t * mc )
712721{
713- return (mc -> mc_alloc );
722+ return (atomic_load_64 (& mc -> mc_alloc ));
723+ }
724+
725+ uint64_t
726+ metaslab_class_get_dalloc (metaslab_class_t * mc )
727+ {
728+ return (spa_deflate (mc -> mc_spa ) ? atomic_load_64 (& mc -> mc_dalloc ) :
729+ atomic_load_64 (& mc -> mc_alloc ));
714730}
715731
716732uint64_t
717733metaslab_class_get_deferred (metaslab_class_t * mc )
718734{
719- return (mc -> mc_deferred );
735+ return (spa_deflate (mc -> mc_spa ) ? atomic_load_64 (& mc -> mc_ddeferred ) :
736+ atomic_load_64 (& mc -> mc_deferred ));
720737}
721738
722739uint64_t
723740metaslab_class_get_space (metaslab_class_t * mc )
724741{
725- return (mc -> mc_space );
742+ return (atomic_load_64 ( & mc -> mc_space ) );
726743}
727744
728745uint64_t
729746metaslab_class_get_dspace (metaslab_class_t * mc )
730747{
731- return (spa_deflate (mc -> mc_spa ) ? mc -> mc_dspace : mc -> mc_space );
748+ return (spa_deflate (mc -> mc_spa ) ? atomic_load_64 (& mc -> mc_dspace ) :
749+ atomic_load_64 (& mc -> mc_space ));
732750}
733751
734752void
@@ -2841,16 +2859,21 @@ metaslab_set_selected_txg(metaslab_t *msp, uint64_t txg)
28412859}
28422860
28432861void
2844- metaslab_space_update (vdev_t * vd , metaslab_class_t * mc , int64_t alloc_delta ,
2862+ metaslab_space_update (metaslab_group_t * mg , int64_t alloc_delta ,
28452863 int64_t defer_delta , int64_t space_delta )
28462864{
2865+ vdev_t * vd = mg -> mg_vd ;
2866+ int64_t dalloc_delta = vdev_deflated_space (vd , alloc_delta );
2867+ int64_t ddefer_delta = vdev_deflated_space (vd , defer_delta );
2868+ int64_t dspace_delta = vdev_deflated_space (vd , space_delta );
2869+
28472870 vdev_space_update (vd , alloc_delta , defer_delta , space_delta );
28482871
28492872 ASSERT3P (vd -> vdev_spa -> spa_root_vdev , = = , vd -> vdev_parent );
28502873 ASSERT (vd -> vdev_ms_count != 0 );
28512874
2852- metaslab_class_space_update (mc , alloc_delta , defer_delta , space_delta ,
2853- vdev_deflated_space ( vd , space_delta ) );
2875+ metaslab_class_space_update (mg -> mg_class , alloc_delta , dalloc_delta ,
2876+ defer_delta , ddefer_delta , space_delta , dspace_delta );
28542877}
28552878
28562879int
@@ -2962,8 +2985,7 @@ metaslab_init(metaslab_group_t *mg, uint64_t id, uint64_t object,
29622985 */
29632986 if (txg <= TXG_INITIAL ) {
29642987 metaslab_sync_done (ms , 0 );
2965- metaslab_space_update (vd , mg -> mg_class ,
2966- metaslab_allocated_space (ms ), 0 , 0 );
2988+ metaslab_space_update (mg , metaslab_allocated_space (ms ), 0 , 0 );
29672989 }
29682990
29692991 if (txg != 0 ) {
@@ -3025,9 +3047,8 @@ metaslab_fini(metaslab_t *msp)
30253047 * subtracted.
30263048 */
30273049 if (!msp -> ms_new ) {
3028- metaslab_space_update (vd , mg -> mg_class ,
3029- - metaslab_allocated_space (msp ), 0 , - msp -> ms_size );
3030-
3050+ metaslab_space_update (mg , - metaslab_allocated_space (msp ), 0 ,
3051+ - msp -> ms_size );
30313052 }
30323053 space_map_close (msp -> ms_sm );
30333054 msp -> ms_sm = NULL ;
@@ -4537,7 +4558,7 @@ metaslab_sync_done(metaslab_t *msp, uint64_t txg)
45374558
45384559 if (msp -> ms_new ) {
45394560 /* this is a new metaslab, add its capacity to the vdev */
4540- metaslab_space_update (vd , mg -> mg_class , 0 , 0 , msp -> ms_size );
4561+ metaslab_space_update (mg , 0 , 0 , msp -> ms_size );
45414562
45424563 /* there should be no allocations nor frees at this point */
45434564 VERIFY0 (msp -> ms_allocated_this_txg );
@@ -4566,8 +4587,7 @@ metaslab_sync_done(metaslab_t *msp, uint64_t txg)
45664587 } else {
45674588 defer_delta -= zfs_range_tree_space (* defer_tree );
45684589 }
4569- metaslab_space_update (vd , mg -> mg_class , alloc_delta + defer_delta ,
4570- defer_delta , 0 );
4590+ metaslab_space_update (mg , alloc_delta + defer_delta , defer_delta , 0 );
45714591
45724592 if (spa_syncing_log_sm (spa ) == NULL ) {
45734593 /*
0 commit comments