1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26 /* 27 * Copyright (c) 2013 by Delphix. All rights reserved. 28 */ 29 30 #ifndef _SYS_METASLAB_IMPL_H 31 #define _SYS_METASLAB_IMPL_H 32 33 #include <sys/metaslab.h> 34 #include <sys/space_map.h> 35 #include <sys/vdev.h> 36 #include <sys/txg.h> 37 #include <sys/avl.h> 38 39 #ifdef __cplusplus 40 extern "C" { 41 #endif 42 43 struct metaslab_class { 44 spa_t *mc_spa; 45 metaslab_group_t *mc_rotor; 46 space_map_ops_t *mc_ops; 47 uint64_t mc_aliquot; 48 uint64_t mc_alloc_groups; /* # of allocatable groups */ 49 uint64_t mc_alloc; /* total allocated space */ 50 uint64_t mc_deferred; /* total deferred frees */ 51 uint64_t mc_space; /* total space (alloc + free) */ 52 uint64_t mc_dspace; /* total deflated space */ 53 }; 54 55 struct metaslab_group { 56 kmutex_t mg_lock; 57 avl_tree_t mg_metaslab_tree; 58 uint64_t mg_aliquot; 59 uint64_t mg_bonus_area; 60 uint64_t mg_alloc_failures; 61 boolean_t mg_allocatable; /* can we allocate? */ 62 uint64_t mg_free_capacity; /* percentage free */ 63 int64_t mg_bias; 64 int64_t mg_activation_count; 65 metaslab_class_t *mg_class; 66 vdev_t *mg_vd; 67 metaslab_group_t *mg_prev; 68 metaslab_group_t *mg_next; 69 }; 70 71 /* 72 * Each metaslab maintains an in-core free map (ms_map) that contains the 73 * current list of free segments. As blocks are allocated, the allocated 74 * segment is removed from the ms_map and added to a per txg allocation map. 75 * As blocks are freed, they are added to the per txg free map. These per 76 * txg maps allow us to process all allocations and frees in syncing context 77 * where it is safe to update the on-disk space maps. 78 * 79 * Each metaslab's free space is tracked in a space map object in the MOS, 80 * which is only updated in syncing context. Each time we sync a txg, 81 * we append the allocs and frees from that txg to the space map object. 82 * When the txg is done syncing, metaslab_sync_done() updates ms_smo 83 * to ms_smo_syncing. Everything in ms_smo is always safe to allocate. 84 * 85 * To load the in-core free map we read the space map object from disk. 86 * This object contains a series of alloc and free records that are 87 * combined to make up the list of all free segments in this metaslab. These 88 * segments are represented in-core by the ms_map and are stored in an 89 * AVL tree. 90 * 91 * As the space map objects grows (as a result of the appends) it will 92 * eventually become space-inefficient. When the space map object is 93 * zfs_condense_pct/100 times the size of the minimal on-disk representation, 94 * we rewrite it in its minimized form. 95 */ 96 struct metaslab { 97 kmutex_t ms_lock; /* metaslab lock */ 98 space_map_obj_t ms_smo; /* synced space map object */ 99 space_map_obj_t ms_smo_syncing; /* syncing space map object */ 100 space_map_t *ms_allocmap[TXG_SIZE]; /* allocated this txg */ 101 space_map_t *ms_freemap[TXG_SIZE]; /* freed this txg */ 102 space_map_t *ms_defermap[TXG_DEFER_SIZE]; /* deferred frees */ 103 space_map_t *ms_map; /* in-core free space map */ 104 int64_t ms_deferspace; /* sum of ms_defermap[] space */ 105 uint64_t ms_weight; /* weight vs. others in group */ 106 metaslab_group_t *ms_group; /* metaslab group */ 107 avl_node_t ms_group_node; /* node in metaslab group tree */ 108 txg_node_t ms_txg_node; /* per-txg dirty metaslab links */ 109 }; 110 111 #ifdef __cplusplus 112 } 113 #endif 114 115 #endif /* _SYS_METASLAB_IMPL_H */