equal
deleted
inserted
replaced
185 } |
185 } |
186 |
186 |
187 static void |
187 static void |
188 metaslab_group_sort(metaslab_group_t *mg, metaslab_t *msp, uint64_t weight) |
188 metaslab_group_sort(metaslab_group_t *mg, metaslab_t *msp, uint64_t weight) |
189 { |
189 { |
|
190 /* |
|
191 * Although in principle the weight can be any value, in |
|
192 * practice we do not use values in the range [1, 510]. |
|
193 */ |
|
194 ASSERT(weight >= SPA_MINBLOCKSIZE-1 || weight == 0); |
190 ASSERT(MUTEX_HELD(&msp->ms_lock)); |
195 ASSERT(MUTEX_HELD(&msp->ms_lock)); |
191 |
196 |
192 mutex_enter(&mg->mg_lock); |
197 mutex_enter(&mg->mg_lock); |
193 ASSERT(msp->ms_group == mg); |
198 ASSERT(msp->ms_group == mg); |
194 avl_remove(&mg->mg_metaslab_tree, msp); |
199 avl_remove(&mg->mg_metaslab_tree, msp); |
432 } |
437 } |
433 |
438 |
434 static void |
439 static void |
435 metaslab_passivate(metaslab_t *msp, uint64_t size) |
440 metaslab_passivate(metaslab_t *msp, uint64_t size) |
436 { |
441 { |
|
442 /* |
|
443 * If size < SPA_MINBLOCKSIZE, then we will not allocate from |
|
444 * this metaslab again. In that case, it had better be empty, |
|
445 * or we would be leaving space on the table. |
|
446 */ |
|
447 ASSERT(size >= SPA_MINBLOCKSIZE || msp->ms_map.sm_space == 0); |
437 metaslab_group_sort(msp->ms_group, msp, MIN(msp->ms_weight, size)); |
448 metaslab_group_sort(msp->ms_group, msp, MIN(msp->ms_weight, size)); |
438 ASSERT((msp->ms_weight & METASLAB_ACTIVE_MASK) == 0); |
449 ASSERT((msp->ms_weight & METASLAB_ACTIVE_MASK) == 0); |
439 } |
450 } |
440 |
451 |
441 /* |
452 /* |
656 mutex_enter(&msp->ms_lock); |
667 mutex_enter(&msp->ms_lock); |
657 |
668 |
658 if ((msp->ms_weight & METASLAB_WEIGHT_SECONDARY) && |
669 if ((msp->ms_weight & METASLAB_WEIGHT_SECONDARY) && |
659 activation_weight == METASLAB_WEIGHT_PRIMARY) { |
670 activation_weight == METASLAB_WEIGHT_PRIMARY) { |
660 metaslab_passivate(msp, |
671 metaslab_passivate(msp, |
661 (msp->ms_weight & ~METASLAB_ACTIVE_MASK) / |
672 msp->ms_weight & ~METASLAB_ACTIVE_MASK); |
662 METASLAB_SMO_BONUS_MULTIPLIER); |
|
663 mutex_exit(&msp->ms_lock); |
673 mutex_exit(&msp->ms_lock); |
664 continue; |
674 continue; |
665 } |
675 } |
666 |
676 |
667 if (metaslab_activate(msp, activation_weight) != 0) { |
677 if (metaslab_activate(msp, activation_weight) != 0) { |