metaslab_impl.h revision 260768
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 40extern "C" { 41#endif 42 43struct 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 uint64_t mc_minblocksize; 54}; 55 56struct metaslab_group { 57 kmutex_t mg_lock; 58 avl_tree_t mg_metaslab_tree; 59 uint64_t mg_aliquot; 60 uint64_t mg_bonus_area; 61 uint64_t mg_alloc_failures; 62 boolean_t mg_allocatable; /* can we allocate? */ 63 uint64_t mg_free_capacity; /* percentage free */ 64 int64_t mg_bias; 65 int64_t mg_activation_count; 66 metaslab_class_t *mg_class; 67 vdev_t *mg_vd; 68 metaslab_group_t *mg_prev; 69 metaslab_group_t *mg_next; 70}; 71 72/* 73 * Each metaslab maintains an in-core free map (ms_map) that contains the 74 * current list of free segments. As blocks are allocated, the allocated 75 * segment is removed from the ms_map and added to a per txg allocation map. 76 * As blocks are freed, they are added to the per txg free map. These per 77 * txg maps allow us to process all allocations and frees in syncing context 78 * where it is safe to update the on-disk space maps. 79 * 80 * Each metaslab's free space is tracked in a space map object in the MOS, 81 * which is only updated in syncing context. Each time we sync a txg, 82 * we append the allocs and frees from that txg to the space map object. 83 * When the txg is done syncing, metaslab_sync_done() updates ms_smo 84 * to ms_smo_syncing. Everything in ms_smo is always safe to allocate. 85 * 86 * To load the in-core free map we read the space map object from disk. 87 * This object contains a series of alloc and free records that are 88 * combined to make up the list of all free segments in this metaslab. These 89 * segments are represented in-core by the ms_map and are stored in an 90 * AVL tree. 91 * 92 * As the space map objects grows (as a result of the appends) it will 93 * eventually become space-inefficient. When the space map object is 94 * zfs_condense_pct/100 times the size of the minimal on-disk representation, 95 * we rewrite it in its minimized form. 96 */ 97struct metaslab { 98 kmutex_t ms_lock; /* metaslab lock */ 99 space_map_obj_t ms_smo; /* synced space map object */ 100 space_map_obj_t ms_smo_syncing; /* syncing space map object */ 101 space_map_t *ms_allocmap[TXG_SIZE]; /* allocated this txg */ 102 space_map_t *ms_freemap[TXG_SIZE]; /* freed this txg */ 103 space_map_t *ms_defermap[TXG_DEFER_SIZE]; /* deferred frees */ 104 space_map_t *ms_map; /* in-core free space map */ 105 int64_t ms_deferspace; /* sum of ms_defermap[] space */ 106 uint64_t ms_weight; /* weight vs. others in group */ 107 metaslab_group_t *ms_group; /* metaslab group */ 108 avl_node_t ms_group_node; /* node in metaslab group tree */ 109 txg_node_t ms_txg_node; /* per-txg dirty metaslab links */ 110}; 111 112#ifdef __cplusplus 113} 114#endif 115 116#endif /* _SYS_METASLAB_IMPL_H */ 117