]> git.proxmox.com Git - mirror_zfs.git/blobdiff - include/sys/metaslab_impl.h
Use a struct to organize metaslab-group-allocator fields
[mirror_zfs.git] / include / sys / metaslab_impl.h
index 29bc8cd5e118863965063d713271dfa39ed04bf1..4a7475256a2bb9b03df79c2fa4bb19bfbd36b362 100644 (file)
@@ -36,6 +36,7 @@
 #include <sys/vdev.h>
 #include <sys/txg.h>
 #include <sys/avl.h>
+#include <sys/multilist.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -194,8 +195,24 @@ struct metaslab_class {
        uint64_t                mc_space;       /* total space (alloc + free) */
        uint64_t                mc_dspace;      /* total deflated space */
        uint64_t                mc_histogram[RANGE_TREE_HISTOGRAM_SIZE];
+
+       /*
+        * List of all loaded metaslabs in the class, sorted in order of most
+        * recent use.
+        */
+       multilist_t             *mc_metaslab_txg_list;
 };
 
+/*
+ * Per-allocator data structure.
+ */
+typedef struct metaslab_group_allocator {
+       uint64_t        mga_cur_max_alloc_queue_depth;
+       zfs_refcount_t  mga_alloc_queue_depth;
+       metaslab_t      *mga_primary;
+       metaslab_t      *mga_secondary;
+} metaslab_group_allocator_t;
+
 /*
  * Metaslab groups encapsulate all the allocatable regions (i.e. metaslabs)
  * of a top-level vdev. They are linked together to form a circular linked
@@ -207,8 +224,6 @@ struct metaslab_class {
  */
 struct metaslab_group {
        kmutex_t                mg_lock;
-       metaslab_t              **mg_primaries;
-       metaslab_t              **mg_secondaries;
        avl_tree_t              mg_metaslab_tree;
        uint64_t                mg_aliquot;
        boolean_t               mg_allocatable;         /* can we allocate? */
@@ -256,9 +271,8 @@ struct metaslab_group {
         * groups are unable to handle their share of allocations.
         */
        uint64_t                mg_max_alloc_queue_depth;
-       uint64_t                *mg_cur_max_alloc_queue_depth;
-       zfs_refcount_t          *mg_alloc_queue_depth;
        int                     mg_allocators;
+       metaslab_group_allocator_t *mg_allocator; /* array */
        /*
         * A metalab group that can no longer allocate the minimum block
         * size will set mg_no_free_space. Once a metaslab group is out
@@ -378,6 +392,7 @@ struct metaslab {
        range_tree_t    *ms_allocating[TXG_SIZE];
        range_tree_t    *ms_allocatable;
        uint64_t        ms_allocated_this_txg;
+       uint64_t        ms_allocating_total;
 
        /*
         * The following range trees are accessed only from syncing context.
@@ -475,6 +490,13 @@ struct metaslab {
         * stay cached.
         */
        uint64_t        ms_selected_txg;
+       /*
+        * ms_load/unload_time can be used for performance monitoring
+        * (e.g. by dtrace or mdb).
+        */
+       hrtime_t        ms_load_time;   /* time last loaded */
+       hrtime_t        ms_unload_time; /* time last unloaded */
+       hrtime_t        ms_selected_time; /* time last allocated from */
 
        uint64_t        ms_alloc_txg;   /* last successful alloc (debug only) */
        uint64_t        ms_max_size;    /* maximum allocatable size     */
@@ -494,13 +516,18 @@ struct metaslab {
         * only difference is that the ms_allocatable_by_size is ordered by
         * segment sizes.
         */
-       avl_tree_t      ms_allocatable_by_size;
+       zfs_btree_t             ms_allocatable_by_size;
+       zfs_btree_t             ms_unflushed_frees_by_size;
        uint64_t        ms_lbas[MAX_LBAS];
 
        metaslab_group_t *ms_group;     /* metaslab group               */
        avl_node_t      ms_group_node;  /* node in metaslab group tree  */
        txg_node_t      ms_txg_node;    /* per-txg dirty metaslab links */
        avl_node_t      ms_spa_txg_node; /* node in spa_metaslabs_by_txg */
+       /*
+        * Node in metaslab class's selected txg list
+        */
+       multilist_node_t        ms_class_txg_node;
 
        /*
         * Allocs and frees that are committed to the vdev log spacemap but