@@ -433,10 +433,12 @@ metaslab_class_destroy(metaslab_class_t *mc)
433433{
434434 spa_t * spa = mc -> mc_spa ;
435435
436- ASSERT (mc -> mc_alloc == 0 );
437- ASSERT (mc -> mc_deferred == 0 );
438- ASSERT (mc -> mc_space == 0 );
439- ASSERT (mc -> mc_dspace == 0 );
436+ ASSERT0 (mc -> mc_alloc );
437+ ASSERT0 (mc -> mc_dalloc );
438+ ASSERT0 (mc -> mc_deferred );
439+ ASSERT0 (mc -> mc_ddeferred );
440+ ASSERT0 (mc -> mc_space );
441+ ASSERT0 (mc -> mc_dspace );
440442
441443 for (int i = 0 ; i < spa -> spa_alloc_count ; i ++ ) {
442444 metaslab_class_allocator_t * mca = & mc -> mc_allocator [i ];
@@ -477,36 +479,48 @@ metaslab_class_validate(metaslab_class_t *mc)
477479
478480static void
479481metaslab_class_space_update (metaslab_class_t * mc , int64_t alloc_delta ,
480- int64_t defer_delta , int64_t space_delta , int64_t dspace_delta )
482+ int64_t dalloc_delta , int64_t deferred_delta , int64_t ddeferred_delta ,
483+ int64_t space_delta , int64_t dspace_delta )
481484{
482485 atomic_add_64 (& mc -> mc_alloc , alloc_delta );
483- atomic_add_64 (& mc -> mc_deferred , defer_delta );
486+ atomic_add_64 (& mc -> mc_dalloc , dalloc_delta );
487+ atomic_add_64 (& mc -> mc_deferred , deferred_delta );
488+ atomic_add_64 (& mc -> mc_ddeferred , ddeferred_delta );
484489 atomic_add_64 (& mc -> mc_space , space_delta );
485490 atomic_add_64 (& mc -> mc_dspace , dspace_delta );
486491}
487492
488493uint64_t
489494metaslab_class_get_alloc (metaslab_class_t * mc )
490495{
491- return (mc -> mc_alloc );
496+ return (atomic_load_64 (& mc -> mc_alloc ));
497+ }
498+
499+ uint64_t
500+ metaslab_class_get_dalloc (metaslab_class_t * mc )
501+ {
502+ return (spa_deflate (mc -> mc_spa ) ? atomic_load_64 (& mc -> mc_dalloc ) :
503+ atomic_load_64 (& mc -> mc_alloc ));
492504}
493505
494506uint64_t
495507metaslab_class_get_deferred (metaslab_class_t * mc )
496508{
497- return (mc -> mc_deferred );
509+ return (spa_deflate (mc -> mc_spa ) ? atomic_load_64 (& mc -> mc_ddeferred ) :
510+ atomic_load_64 (& mc -> mc_deferred ));
498511}
499512
500513uint64_t
501514metaslab_class_get_space (metaslab_class_t * mc )
502515{
503- return (mc -> mc_space );
516+ return (atomic_load_64 ( & mc -> mc_space ) );
504517}
505518
506519uint64_t
507520metaslab_class_get_dspace (metaslab_class_t * mc )
508521{
509- return (spa_deflate (mc -> mc_spa ) ? mc -> mc_dspace : mc -> mc_space );
522+ return (spa_deflate (mc -> mc_spa ) ? atomic_load_64 (& mc -> mc_dspace ) :
523+ atomic_load_64 (& mc -> mc_space ));
510524}
511525
512526void
@@ -2631,16 +2645,21 @@ metaslab_set_selected_txg(metaslab_t *msp, uint64_t txg)
26312645}
26322646
26332647void
2634- metaslab_space_update (vdev_t * vd , metaslab_class_t * mc , int64_t alloc_delta ,
2648+ metaslab_space_update (metaslab_group_t * mg , int64_t alloc_delta ,
26352649 int64_t defer_delta , int64_t space_delta )
26362650{
2651+ vdev_t * vd = mg -> mg_vd ;
2652+ int64_t dalloc_delta = vdev_deflated_space (vd , alloc_delta );
2653+ int64_t ddefer_delta = vdev_deflated_space (vd , defer_delta );
2654+ int64_t dspace_delta = vdev_deflated_space (vd , space_delta );
2655+
26372656 vdev_space_update (vd , alloc_delta , defer_delta , space_delta );
26382657
26392658 ASSERT3P (vd -> vdev_spa -> spa_root_vdev , = = , vd -> vdev_parent );
26402659 ASSERT (vd -> vdev_ms_count != 0 );
26412660
2642- metaslab_class_space_update (mc , alloc_delta , defer_delta , space_delta ,
2643- vdev_deflated_space ( vd , space_delta ) );
2661+ metaslab_class_space_update (mg -> mg_class , alloc_delta , dalloc_delta ,
2662+ defer_delta , ddefer_delta , space_delta , dspace_delta );
26442663}
26452664
26462665int
@@ -2738,8 +2757,7 @@ metaslab_init(metaslab_group_t *mg, uint64_t id, uint64_t object,
27382757 */
27392758 if (txg <= TXG_INITIAL ) {
27402759 metaslab_sync_done (ms , 0 );
2741- metaslab_space_update (vd , mg -> mg_class ,
2742- metaslab_allocated_space (ms ), 0 , 0 );
2760+ metaslab_space_update (mg , metaslab_allocated_space (ms ), 0 , 0 );
27432761 }
27442762
27452763 if (txg != 0 ) {
@@ -2801,9 +2819,8 @@ metaslab_fini(metaslab_t *msp)
28012819 * subtracted.
28022820 */
28032821 if (!msp -> ms_new ) {
2804- metaslab_space_update (vd , mg -> mg_class ,
2805- - metaslab_allocated_space (msp ), 0 , - msp -> ms_size );
2806-
2822+ metaslab_space_update (mg , - metaslab_allocated_space (msp ), 0 ,
2823+ - msp -> ms_size );
28072824 }
28082825 space_map_close (msp -> ms_sm );
28092826 msp -> ms_sm = NULL ;
@@ -4290,7 +4307,7 @@ metaslab_sync_done(metaslab_t *msp, uint64_t txg)
42904307
42914308 if (msp -> ms_new ) {
42924309 /* this is a new metaslab, add its capacity to the vdev */
4293- metaslab_space_update (vd , mg -> mg_class , 0 , 0 , msp -> ms_size );
4310+ metaslab_space_update (mg , 0 , 0 , msp -> ms_size );
42944311
42954312 /* there should be no allocations nor frees at this point */
42964313 VERIFY0 (msp -> ms_allocated_this_txg );
@@ -4318,8 +4335,7 @@ metaslab_sync_done(metaslab_t *msp, uint64_t txg)
43184335 } else {
43194336 defer_delta -= range_tree_space (* defer_tree );
43204337 }
4321- metaslab_space_update (vd , mg -> mg_class , alloc_delta + defer_delta ,
4322- defer_delta , 0 );
4338+ metaslab_space_update (mg , alloc_delta + defer_delta , defer_delta , 0 );
43234339
43244340 if (spa_syncing_log_sm (spa ) == NULL ) {
43254341 /*
@@ -5253,8 +5269,16 @@ metaslab_alloc_dva(spa_t *spa, metaslab_class_t *mc, uint64_t psize,
52535269 */
52545270 if (mca -> mca_aliquot == 0 && metaslab_bias_enabled ) {
52555271 vdev_stat_t * vs = & vd -> vdev_stat ;
5256- int64_t vs_free = vs -> vs_space - vs -> vs_alloc ;
5257- int64_t mc_free = mc -> mc_space - mc -> mc_alloc ;
5272+ uint64_t vs_space =
5273+ atomic_load_64 (& vs -> vs_space );
5274+ uint64_t mc_space =
5275+ atomic_load_64 (& mc -> mc_space );
5276+ uint64_t mc_alloc =
5277+ atomic_load_64 (& mc -> mc_alloc );
5278+ uint64_t vs_alloc =
5279+ atomic_load_64 (& vs -> vs_alloc );
5280+ int64_t vs_free = vs_space - vs_alloc ;
5281+ int64_t mc_free = mc_space - mc_alloc ;
52585282 int64_t ratio ;
52595283
52605284 /*
0 commit comments