diff --git a/include/sys/metaslab.h b/include/sys/metaslab.h index 5fe3a2006..4d57e52e8 100644 --- a/include/sys/metaslab.h +++ b/include/sys/metaslab.h @@ -102,8 +102,8 @@ void metaslab_trace_move(zio_alloc_list_t *, zio_alloc_list_t *); void metaslab_trace_init(zio_alloc_list_t *); void metaslab_trace_fini(zio_alloc_list_t *); -metaslab_class_t *metaslab_class_create(spa_t *, const metaslab_ops_t *, - boolean_t); +metaslab_class_t *metaslab_class_create(spa_t *, const char *, + const metaslab_ops_t *, boolean_t); void metaslab_class_destroy(metaslab_class_t *); void metaslab_class_validate(metaslab_class_t *); void metaslab_class_balance(metaslab_class_t *mc, boolean_t onsync); @@ -114,6 +114,7 @@ boolean_t metaslab_class_throttle_reserve(metaslab_class_t *, int, zio_t *, boolean_t, boolean_t *); boolean_t metaslab_class_throttle_unreserve(metaslab_class_t *, int, zio_t *); void metaslab_class_evict_old(metaslab_class_t *, uint64_t); +const char *metaslab_class_get_name(metaslab_class_t *); uint64_t metaslab_class_get_alloc(metaslab_class_t *); uint64_t metaslab_class_get_space(metaslab_class_t *); uint64_t metaslab_class_get_dspace(metaslab_class_t *); diff --git a/include/sys/metaslab_impl.h b/include/sys/metaslab_impl.h index 501ccf3cb..83fbe620f 100644 --- a/include/sys/metaslab_impl.h +++ b/include/sys/metaslab_impl.h @@ -181,7 +181,8 @@ typedef struct metaslab_class_allocator { struct metaslab_class { kmutex_t mc_lock; spa_t *mc_spa; - const metaslab_ops_t *mc_ops; + const char *mc_name; + const metaslab_ops_t *mc_ops; /* * Track the number of metaslab groups that have been initialized diff --git a/module/zfs/metaslab.c b/module/zfs/metaslab.c index 42c432163..43b94eba2 100644 --- a/module/zfs/metaslab.c +++ b/module/zfs/metaslab.c @@ -412,7 +412,8 @@ metaslab_stat_fini(void) * ========================================================================== */ metaslab_class_t * -metaslab_class_create(spa_t *spa, const metaslab_ops_t *ops, boolean_t is_log) +metaslab_class_create(spa_t *spa, const char *name, + const metaslab_ops_t *ops, boolean_t is_log) { metaslab_class_t *mc; @@ -420,6 +421,7 @@ metaslab_class_create(spa_t *spa, const metaslab_ops_t *ops, boolean_t is_log) mc_allocator[spa->spa_alloc_count]), KM_SLEEP); mc->mc_spa = spa; + mc->mc_name = name; mc->mc_ops = ops; mc->mc_is_log = is_log; mc->mc_alloc_io_size = SPA_OLD_MAXBLOCKSIZE; @@ -689,6 +691,12 @@ metaslab_class_space_update(metaslab_class_t *mc, int64_t alloc_delta, atomic_add_64(&mc->mc_dspace, dspace_delta); } +const char * +metaslab_class_get_name(metaslab_class_t *mc) +{ + return (mc->mc_name); +} + uint64_t metaslab_class_get_alloc(metaslab_class_t *mc) { @@ -2631,7 +2639,7 @@ metaslab_load_impl(metaslab_t *msp) ASSERT3U(max_size, <=, msp->ms_max_size); hrtime_t load_end = gethrtime(); msp->ms_load_time = load_end; - zfs_dbgmsg("metaslab_load: txg %llu, spa %s, vdev_id %llu, " + zfs_dbgmsg("metaslab_load: txg %llu, spa %s, class %s, vdev_id %llu, " "ms_id %llu, smp_length %llu, " "unflushed_allocs %llu, unflushed_frees %llu, " "freed %llu, defer %llu + %llu, unloaded time %llu ms, " @@ -2639,6 +2647,7 @@ metaslab_load_impl(metaslab_t *msp) "max size error %lld, " "old_weight %llx, new_weight %llx", (u_longlong_t)spa_syncing_txg(spa), spa_name(spa), + msp->ms_group->mg_class->mc_name, (u_longlong_t)msp->ms_group->mg_vd->vdev_id, (u_longlong_t)msp->ms_id, (u_longlong_t)space_map_length(msp->ms_sm), @@ -2744,11 +2753,12 @@ metaslab_unload(metaslab_t *msp) multilist_sublist_unlock(mls); spa_t *spa = msp->ms_group->mg_vd->vdev_spa; - zfs_dbgmsg("metaslab_unload: txg %llu, spa %s, vdev_id %llu, " - "ms_id %llu, weight %llx, " + zfs_dbgmsg("metaslab_unload: txg %llu, spa %s, class %s, " + "vdev_id %llu, ms_id %llu, weight %llx, " "selected txg %llu (%llu s ago), alloc_txg %llu, " "loaded %llu ms ago, max_size %llu", (u_longlong_t)spa_syncing_txg(spa), spa_name(spa), + msp->ms_group->mg_class->mc_name, (u_longlong_t)msp->ms_group->mg_vd->vdev_id, (u_longlong_t)msp->ms_id, (u_longlong_t)msp->ms_weight, diff --git a/module/zfs/spa.c b/module/zfs/spa.c index 29c1d4ddf..bca022af6 100644 --- a/module/zfs/spa.c +++ b/module/zfs/spa.c @@ -1687,11 +1687,15 @@ spa_activate(spa_t *spa, spa_mode_t mode) spa->spa_mode = mode; spa->spa_read_spacemaps = spa_mode_readable_spacemaps; - spa->spa_normal_class = metaslab_class_create(spa, msp, B_FALSE); - spa->spa_log_class = metaslab_class_create(spa, msp, B_TRUE); - spa->spa_embedded_log_class = metaslab_class_create(spa, msp, B_TRUE); - spa->spa_special_class = metaslab_class_create(spa, msp, B_FALSE); - spa->spa_dedup_class = metaslab_class_create(spa, msp, B_FALSE); + spa->spa_normal_class = metaslab_class_create(spa, "normal", + msp, B_FALSE); + spa->spa_log_class = metaslab_class_create(spa, "log", msp, B_TRUE); + spa->spa_embedded_log_class = metaslab_class_create(spa, + "embedded_log", msp, B_TRUE); + spa->spa_special_class = metaslab_class_create(spa, "special", + msp, B_FALSE); + spa->spa_dedup_class = metaslab_class_create(spa, "dedup", + msp, B_FALSE); /* Try to create a covering process */ mutex_enter(&spa->spa_proc_lock); diff --git a/module/zfs/zio.c b/module/zfs/zio.c index 554de6b7d..9d80062e5 100644 --- a/module/zfs/zio.c +++ b/module/zfs/zio.c @@ -4221,7 +4221,7 @@ again: zfs_dbgmsg("%s[%llu]: %s class spilling, req size %llu, " "%llu allocated of %llu", spa_name(spa), (u_longlong_t)zio->io_txg, - mc == spa_dedup_class(spa) ? "dedup" : "special", + metaslab_class_get_name(mc), (u_longlong_t)zio->io_size, (u_longlong_t)metaslab_class_get_alloc(mc), (u_longlong_t)metaslab_class_get_space(mc)); @@ -4245,10 +4245,12 @@ again: } if (zfs_flags & ZFS_DEBUG_METASLAB_ALLOC) { - zfs_dbgmsg("%s: metaslab allocation failure, " - "trying fallback: zio %px, size %llu, error %d", - spa_name(spa), zio, (u_longlong_t)zio->io_size, - error); + zfs_dbgmsg("%s: metaslab allocation failure in %s " + "class, trying fallback to %s class: zio %px, " + "size %llu, error %d", spa_name(spa), + metaslab_class_get_name(mc), + metaslab_class_get_name(newmc), + zio, (u_longlong_t)zio->io_size, error); } zio->io_metaslab_class = mc = newmc; ZIOSTAT_BUMP(ziostat_alloc_class_fallbacks);