Include class name into struct metaslab_class

With increasing number of metaslab classes it can be helpful for
debugging to know what we are looking at.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Rob Norris <rob.norris@klarasystems.com>
Signed-off-by:	Alexander Motin <mav@FreeBSD.org>
Sponsored by:	iXsystems, Inc.
Closes #17409
This commit is contained in:
Alexander Motin 2025-06-03 11:12:59 -04:00 committed by GitHub
parent 108562344c
commit 68817d28c5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 35 additions and 17 deletions

View File

@ -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_init(zio_alloc_list_t *);
void metaslab_trace_fini(zio_alloc_list_t *); void metaslab_trace_fini(zio_alloc_list_t *);
metaslab_class_t *metaslab_class_create(spa_t *, const metaslab_ops_t *, metaslab_class_t *metaslab_class_create(spa_t *, const char *,
boolean_t); const metaslab_ops_t *, boolean_t);
void metaslab_class_destroy(metaslab_class_t *); void metaslab_class_destroy(metaslab_class_t *);
void metaslab_class_validate(metaslab_class_t *); void metaslab_class_validate(metaslab_class_t *);
void metaslab_class_balance(metaslab_class_t *mc, boolean_t onsync); 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, boolean_t *);
boolean_t metaslab_class_throttle_unreserve(metaslab_class_t *, int, zio_t *); boolean_t metaslab_class_throttle_unreserve(metaslab_class_t *, int, zio_t *);
void metaslab_class_evict_old(metaslab_class_t *, uint64_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_alloc(metaslab_class_t *);
uint64_t metaslab_class_get_space(metaslab_class_t *); uint64_t metaslab_class_get_space(metaslab_class_t *);
uint64_t metaslab_class_get_dspace(metaslab_class_t *); uint64_t metaslab_class_get_dspace(metaslab_class_t *);

View File

@ -181,7 +181,8 @@ typedef struct metaslab_class_allocator {
struct metaslab_class { struct metaslab_class {
kmutex_t mc_lock; kmutex_t mc_lock;
spa_t *mc_spa; 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 * Track the number of metaslab groups that have been initialized

View File

@ -412,7 +412,8 @@ metaslab_stat_fini(void)
* ========================================================================== * ==========================================================================
*/ */
metaslab_class_t * 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; 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_allocator[spa->spa_alloc_count]), KM_SLEEP);
mc->mc_spa = spa; mc->mc_spa = spa;
mc->mc_name = name;
mc->mc_ops = ops; mc->mc_ops = ops;
mc->mc_is_log = is_log; mc->mc_is_log = is_log;
mc->mc_alloc_io_size = SPA_OLD_MAXBLOCKSIZE; 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); atomic_add_64(&mc->mc_dspace, dspace_delta);
} }
const char *
metaslab_class_get_name(metaslab_class_t *mc)
{
return (mc->mc_name);
}
uint64_t uint64_t
metaslab_class_get_alloc(metaslab_class_t *mc) 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); ASSERT3U(max_size, <=, msp->ms_max_size);
hrtime_t load_end = gethrtime(); hrtime_t load_end = gethrtime();
msp->ms_load_time = load_end; 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, " "ms_id %llu, smp_length %llu, "
"unflushed_allocs %llu, unflushed_frees %llu, " "unflushed_allocs %llu, unflushed_frees %llu, "
"freed %llu, defer %llu + %llu, unloaded time %llu ms, " "freed %llu, defer %llu + %llu, unloaded time %llu ms, "
@ -2639,6 +2647,7 @@ metaslab_load_impl(metaslab_t *msp)
"max size error %lld, " "max size error %lld, "
"old_weight %llx, new_weight %llx", "old_weight %llx, new_weight %llx",
(u_longlong_t)spa_syncing_txg(spa), spa_name(spa), (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_group->mg_vd->vdev_id,
(u_longlong_t)msp->ms_id, (u_longlong_t)msp->ms_id,
(u_longlong_t)space_map_length(msp->ms_sm), (u_longlong_t)space_map_length(msp->ms_sm),
@ -2744,11 +2753,12 @@ metaslab_unload(metaslab_t *msp)
multilist_sublist_unlock(mls); multilist_sublist_unlock(mls);
spa_t *spa = msp->ms_group->mg_vd->vdev_spa; spa_t *spa = msp->ms_group->mg_vd->vdev_spa;
zfs_dbgmsg("metaslab_unload: txg %llu, spa %s, vdev_id %llu, " zfs_dbgmsg("metaslab_unload: txg %llu, spa %s, class %s, "
"ms_id %llu, weight %llx, " "vdev_id %llu, ms_id %llu, weight %llx, "
"selected txg %llu (%llu s ago), alloc_txg %llu, " "selected txg %llu (%llu s ago), alloc_txg %llu, "
"loaded %llu ms ago, max_size %llu", "loaded %llu ms ago, max_size %llu",
(u_longlong_t)spa_syncing_txg(spa), spa_name(spa), (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_group->mg_vd->vdev_id,
(u_longlong_t)msp->ms_id, (u_longlong_t)msp->ms_id,
(u_longlong_t)msp->ms_weight, (u_longlong_t)msp->ms_weight,

View File

@ -1687,11 +1687,15 @@ spa_activate(spa_t *spa, spa_mode_t mode)
spa->spa_mode = mode; spa->spa_mode = mode;
spa->spa_read_spacemaps = spa_mode_readable_spacemaps; spa->spa_read_spacemaps = spa_mode_readable_spacemaps;
spa->spa_normal_class = metaslab_class_create(spa, msp, B_FALSE); spa->spa_normal_class = metaslab_class_create(spa, "normal",
spa->spa_log_class = metaslab_class_create(spa, msp, B_TRUE); msp, B_FALSE);
spa->spa_embedded_log_class = metaslab_class_create(spa, msp, B_TRUE); spa->spa_log_class = metaslab_class_create(spa, "log", msp, B_TRUE);
spa->spa_special_class = metaslab_class_create(spa, msp, B_FALSE); spa->spa_embedded_log_class = metaslab_class_create(spa,
spa->spa_dedup_class = metaslab_class_create(spa, msp, B_FALSE); "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 */ /* Try to create a covering process */
mutex_enter(&spa->spa_proc_lock); mutex_enter(&spa->spa_proc_lock);

View File

@ -4221,7 +4221,7 @@ again:
zfs_dbgmsg("%s[%llu]: %s class spilling, req size %llu, " zfs_dbgmsg("%s[%llu]: %s class spilling, req size %llu, "
"%llu allocated of %llu", "%llu allocated of %llu",
spa_name(spa), (u_longlong_t)zio->io_txg, 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)zio->io_size,
(u_longlong_t)metaslab_class_get_alloc(mc), (u_longlong_t)metaslab_class_get_alloc(mc),
(u_longlong_t)metaslab_class_get_space(mc)); (u_longlong_t)metaslab_class_get_space(mc));
@ -4245,10 +4245,12 @@ again:
} }
if (zfs_flags & ZFS_DEBUG_METASLAB_ALLOC) { if (zfs_flags & ZFS_DEBUG_METASLAB_ALLOC) {
zfs_dbgmsg("%s: metaslab allocation failure, " zfs_dbgmsg("%s: metaslab allocation failure in %s "
"trying fallback: zio %px, size %llu, error %d", "class, trying fallback to %s class: zio %px, "
spa_name(spa), zio, (u_longlong_t)zio->io_size, "size %llu, error %d", spa_name(spa),
error); metaslab_class_get_name(mc),
metaslab_class_get_name(newmc),
zio, (u_longlong_t)zio->io_size, error);
} }
zio->io_metaslab_class = mc = newmc; zio->io_metaslab_class = mc = newmc;
ZIOSTAT_BUMP(ziostat_alloc_class_fallbacks); ZIOSTAT_BUMP(ziostat_alloc_class_fallbacks);