Lines Matching refs:mg
299 metaslab_group_t *mg;
308 if ((mg = mc->mc_rotor) == NULL)
312 vd = mg->mg_vd;
315 ASSERT3P(mg->mg_class, ==, mc);
317 } while ((mg = mg->mg_next) != mc->mc_rotor);
335 metaslab_group_t *mg;
339 if ((mg = mc->mc_rotor) == NULL) {
345 vd = mg->mg_vd;
348 } while ((mg = mg->mg_next) != mc->mc_rotor);
398 metaslab_group_t *mg = tvd->vdev_mg;
405 mg->mg_class != mc) {
410 mc_hist[i] += mg->mg_histogram[i];
436 metaslab_group_t *mg = tvd->vdev_mg;
443 mg->mg_class != mc) {
451 if (mg->mg_fragmentation == ZFS_FRAG_INVALID) {
460 fragmentation += mg->mg_fragmentation *
461 metaslab_group_get_space(mg);
485 metaslab_group_t *mg = tvd->vdev_mg;
488 mg->mg_class != mc) {
588 metaslab_group_alloc_update(metaslab_group_t *mg)
590 vdev_t *vd = mg->mg_vd;
591 metaslab_class_t *mc = mg->mg_class;
598 mutex_enter(&mg->mg_lock);
599 was_allocatable = mg->mg_allocatable;
600 was_initialized = mg->mg_initialized;
602 mg->mg_free_capacity = ((vs->vs_space - vs->vs_alloc) * 100) /
615 mg->mg_initialized = metaslab_group_initialized(mg);
616 if (!was_initialized && mg->mg_initialized) {
618 } else if (was_initialized && !mg->mg_initialized) {
622 if (mg->mg_initialized)
623 mg->mg_no_free_space = B_FALSE;
631 mg->mg_allocatable = (mg->mg_activation_count > 0 &&
632 mg->mg_free_capacity > zfs_mg_noalloc_threshold &&
633 (mg->mg_fragmentation == ZFS_FRAG_INVALID ||
634 mg->mg_fragmentation <= zfs_mg_fragmentation_threshold));
651 if (was_allocatable && !mg->mg_allocatable)
653 else if (!was_allocatable && mg->mg_allocatable)
657 mutex_exit(&mg->mg_lock);
663 metaslab_group_t *mg;
665 mg = kmem_zalloc(sizeof (metaslab_group_t), KM_SLEEP);
666 mutex_init(&mg->mg_lock, NULL, MUTEX_DEFAULT, NULL);
667 avl_create(&mg->mg_metaslab_tree, metaslab_compare,
669 mg->mg_vd = vd;
670 mg->mg_class = mc;
671 mg->mg_activation_count = 0;
672 mg->mg_initialized = B_FALSE;
673 mg->mg_no_free_space = B_TRUE;
674 refcount_create_tracked(&mg->mg_alloc_queue_depth);
676 mg->mg_taskq = taskq_create("metaslab_group_taskq", metaslab_load_pct,
679 return (mg);
683 metaslab_group_destroy(metaslab_group_t *mg)
685 ASSERT(mg->mg_prev == NULL);
686 ASSERT(mg->mg_next == NULL);
692 ASSERT(mg->mg_activation_count <= 0);
694 taskq_destroy(mg->mg_taskq);
695 avl_destroy(&mg->mg_metaslab_tree);
696 mutex_destroy(&mg->mg_lock);
697 refcount_destroy(&mg->mg_alloc_queue_depth);
698 kmem_free(mg, sizeof (metaslab_group_t));
702 metaslab_group_activate(metaslab_group_t *mg)
704 metaslab_class_t *mc = mg->mg_class;
709 ASSERT(mc->mc_rotor != mg);
710 ASSERT(mg->mg_prev == NULL);
711 ASSERT(mg->mg_next == NULL);
712 ASSERT(mg->mg_activation_count <= 0);
714 if (++mg->mg_activation_count <= 0)
717 mg->mg_aliquot = metaslab_aliquot * MAX(1, mg->mg_vd->vdev_children);
718 metaslab_group_alloc_update(mg);
721 mg->mg_prev = mg;
722 mg->mg_next = mg;
725 mg->mg_prev = mgprev;
726 mg->mg_next = mgnext;
727 mgprev->mg_next = mg;
728 mgnext->mg_prev = mg;
730 mc->mc_rotor = mg;
735 metaslab_group_passivate(metaslab_group_t *mg)
737 metaslab_class_t *mc = mg->mg_class;
742 if (--mg->mg_activation_count != 0) {
743 ASSERT(mc->mc_rotor != mg);
744 ASSERT(mg->mg_prev == NULL);
745 ASSERT(mg->mg_next == NULL);
746 ASSERT(mg->mg_activation_count < 0);
750 taskq_wait(mg->mg_taskq);
751 metaslab_group_alloc_update(mg);
753 mgprev = mg->mg_prev;
754 mgnext = mg->mg_next;
756 if (mg == mgnext) {
764 mg->mg_prev = NULL;
765 mg->mg_next = NULL;
770 metaslab_group_initialized(metaslab_group_t *mg)
772 vdev_t *vd = mg->mg_vd;
775 return (vs->vs_space != 0 && mg->mg_activation_count > 0);
779 metaslab_group_get_space(metaslab_group_t *mg)
781 return ((1ULL << mg->mg_vd->vdev_ms_shift) * mg->mg_vd->vdev_ms_count);
785 metaslab_group_histogram_verify(metaslab_group_t *mg)
788 vdev_t *vd = mg->mg_vd;
813 VERIFY3U(mg_hist[i], ==, mg->mg_histogram[i]);
819 metaslab_group_histogram_add(metaslab_group_t *mg, metaslab_t *msp)
821 metaslab_class_t *mc = mg->mg_class;
822 uint64_t ashift = mg->mg_vd->vdev_ashift;
828 mutex_enter(&mg->mg_lock);
830 mg->mg_histogram[i + ashift] +=
835 mutex_exit(&mg->mg_lock);
839 metaslab_group_histogram_remove(metaslab_group_t *mg, metaslab_t *msp)
841 metaslab_class_t *mc = mg->mg_class;
842 uint64_t ashift = mg->mg_vd->vdev_ashift;
848 mutex_enter(&mg->mg_lock);
850 ASSERT3U(mg->mg_histogram[i + ashift], >=,
855 mg->mg_histogram[i + ashift] -=
860 mutex_exit(&mg->mg_lock);
864 metaslab_group_add(metaslab_group_t *mg, metaslab_t *msp)
867 mutex_enter(&mg->mg_lock);
868 msp->ms_group = mg;
870 avl_add(&mg->mg_metaslab_tree, msp);
871 mutex_exit(&mg->mg_lock);
874 metaslab_group_histogram_add(mg, msp);
879 metaslab_group_remove(metaslab_group_t *mg, metaslab_t *msp)
882 metaslab_group_histogram_remove(mg, msp);
885 mutex_enter(&mg->mg_lock);
886 ASSERT(msp->ms_group == mg);
887 avl_remove(&mg->mg_metaslab_tree, msp);
889 mutex_exit(&mg->mg_lock);
893 metaslab_group_sort(metaslab_group_t *mg, metaslab_t *msp, uint64_t weight)
902 mutex_enter(&mg->mg_lock);
903 ASSERT(msp->ms_group == mg);
904 avl_remove(&mg->mg_metaslab_tree, msp);
906 avl_add(&mg->mg_metaslab_tree, msp);
907 mutex_exit(&mg->mg_lock);
918 metaslab_group_fragmentation(metaslab_group_t *mg)
920 vdev_t *vd = mg->mg_vd;
953 metaslab_group_allocatable(metaslab_group_t *mg, metaslab_group_t *rotor,
956 spa_t *spa = mg->mg_vd->vdev_spa;
957 metaslab_class_t *mc = mg->mg_class;
980 if (mg->mg_allocatable) {
983 uint64_t qmax = mg->mg_max_alloc_queue_depth;
992 if (mg->mg_no_free_space)
995 qdepth = refcount_count(&mg->mg_alloc_queue_depth);
1013 for (mgp = mg->mg_next; mgp != rotor; mgp = mgp->mg_next) {
1469 metaslab_init(metaslab_group_t *mg, uint64_t id, uint64_t object, uint64_t txg,
1472 vdev_t *vd = mg->mg_vd;
1508 metaslab_group_add(mg, ms);
1548 metaslab_group_t *mg = msp->ms_group;
1550 metaslab_group_remove(mg, msp);
1554 vdev_space_update(mg->mg_vd, -space_map_allocated(msp->ms_sm),
1698 metaslab_group_t *mg = msp->ms_group;
1699 vdev_t *vd = mg->mg_vd;
1835 metaslab_group_t *mg = msp->ms_group;
1837 uint8_t shift = mg->mg_vd->vdev_ashift;
2058 metaslab_group_preload(metaslab_group_t *mg)
2060 spa_t *spa = mg->mg_vd->vdev_spa;
2062 avl_tree_t *t = &mg->mg_metaslab_tree;
2066 taskq_wait(mg->mg_taskq);
2070 mutex_enter(&mg->mg_lock);
2085 VERIFY(taskq_dispatch(mg->mg_taskq, metaslab_preload,
2088 mutex_exit(&mg->mg_lock);
2258 metaslab_group_t *mg = msp->ms_group;
2259 vdev_t *vd = mg->mg_vd;
2324 metaslab_group_histogram_verify(mg);
2325 metaslab_class_histogram_verify(mg->mg_class);
2326 metaslab_group_histogram_remove(mg, msp);
2377 metaslab_group_histogram_add(mg, msp);
2378 metaslab_group_histogram_verify(mg);
2379 metaslab_class_histogram_verify(mg->mg_class);
2415 metaslab_group_t *mg = msp->ms_group;
2416 vdev_t *vd = mg->mg_vd;
2514 metaslab_group_sort(mg, msp, metaslab_weight(msp));
2535 metaslab_sync_reassess(metaslab_group_t *mg)
2537 metaslab_group_alloc_update(mg);
2538 mg->mg_fragmentation = metaslab_group_fragmentation(mg);
2543 metaslab_group_preload(mg);
2603 metaslab_trace_add(zio_alloc_list_t *zal, metaslab_group_t *mg,
2631 mat->mat_mg = mg;
2683 metaslab_group_t *mg = vdev_lookup_top(spa, vdev)->vdev_mg;
2684 if (!mg->mg_class->mc_alloc_throttle_enabled)
2687 (void) refcount_add(&mg->mg_alloc_queue_depth, tag);
2697 metaslab_group_t *mg = vdev_lookup_top(spa, vdev)->vdev_mg;
2698 if (!mg->mg_class->mc_alloc_throttle_enabled)
2701 (void) refcount_remove(&mg->mg_alloc_queue_depth, tag);
2713 metaslab_group_t *mg = vdev_lookup_top(spa, vdev)->vdev_mg;
2714 VERIFY(refcount_not_held(&mg->mg_alloc_queue_depth, tag));
2730 metaslab_group_t *mg = msp->ms_group;
2731 vdev_t *vd = mg->mg_vd;
2739 vdev_dirty(mg->mg_vd, VDD_METASLAB, msp, txg);
2757 metaslab_group_alloc_normal(metaslab_group_t *mg, zio_alloc_list_t *zal,
2768 if (DVA_GET_VDEV(&dva[i]) == mg->mg_vd->vdev_id) {
2779 avl_tree_t *t = &mg->mg_metaslab_tree;
2782 mutex_enter(&mg->mg_lock);
2804 metaslab_trace_add(zal, mg, msp, asize, d,
2831 mutex_exit(&mg->mg_lock);
2877 metaslab_trace_add(zal, mg, msp, asize, d,
2888 metaslab_trace_add(zal, mg, msp, asize, d,
2895 metaslab_trace_add(zal, mg, msp, asize, d, offset);
2950 metaslab_group_alloc(metaslab_group_t *mg, zio_alloc_list_t *zal,
2954 ASSERT(mg->mg_initialized);
2956 offset = metaslab_group_alloc_normal(mg, zal, asize, txg,
2959 mutex_enter(&mg->mg_lock);
2961 mg->mg_failed_allocations++;
2962 metaslab_trace_add(zal, mg, NULL, asize, d,
2976 mg->mg_no_free_space = B_TRUE;
2979 mg->mg_allocations++;
2980 mutex_exit(&mg->mg_lock);
3000 metaslab_group_t *mg, *rotor;
3045 mg = vd->vdev_mg;
3048 mg->mg_next != NULL)
3049 mg = mg->mg_next;
3051 mg = mc->mc_rotor;
3055 mg = vd->vdev_mg->mg_next;
3057 mg = mc->mc_rotor;
3064 if (mg->mg_class != mc || mg->mg_activation_count <= 0)
3065 mg = mc->mc_rotor;
3067 rotor = mg;
3072 ASSERT(mg->mg_activation_count == 1);
3073 vd = mg->mg_vd;
3094 allocatable = metaslab_group_allocatable(mg, rotor,
3099 metaslab_trace_add(zal, mg, NULL, psize, d,
3104 ASSERT(mg->mg_initialized);
3114 metaslab_trace_add(zal, mg, NULL, psize, d,
3119 ASSERT(mg->mg_class == mc);
3138 uint64_t offset = metaslab_group_alloc(mg, zal, asize, txg,
3168 mg->mg_bias = ((cu - vu) *
3169 (int64_t)mg->mg_aliquot) / 100;
3171 mg->mg_bias = 0;
3175 mg->mg_aliquot + mg->mg_bias) {
3176 mc->mc_rotor = mg->mg_next;
3188 mc->mc_rotor = mg->mg_next;
3190 } while ((mg = mg->mg_next) != rotor);