diff --git a/lib/ftl/ftl_band.c b/lib/ftl/ftl_band.c index 098fe0928..e6b9e25c9 100644 --- a/lib/ftl/ftl_band.c +++ b/lib/ftl/ftl_band.c @@ -196,6 +196,13 @@ ftl_band_user_blocks_left(const struct ftl_band *band, size_t offset) return tail_md_offset - offset; } +size_t +ftl_band_user_blocks(const struct ftl_band *band) +{ + return ftl_get_num_blocks_in_band(band->dev) - + ftl_tail_md_num_blocks(band->dev); +} + struct ftl_band * ftl_band_from_addr(struct spdk_ftl_dev *dev, ftl_addr addr) { diff --git a/lib/ftl/ftl_band.h b/lib/ftl/ftl_band.h index c98ff1c6c..7fec554d2 100644 --- a/lib/ftl/ftl_band.h +++ b/lib/ftl/ftl_band.h @@ -137,6 +137,7 @@ void ftl_band_release_p2l_map(struct ftl_band *band); ftl_addr ftl_band_next_xfer_addr(struct ftl_band *band, ftl_addr addr, size_t num_blocks); ftl_addr ftl_band_next_addr(struct ftl_band *band, ftl_addr addr, size_t offset); size_t ftl_band_user_blocks_left(const struct ftl_band *band, size_t offset); +size_t ftl_band_user_blocks(const struct ftl_band *band); void ftl_band_set_addr(struct ftl_band *band, uint64_t lba, ftl_addr addr); struct ftl_band *ftl_band_from_addr(struct spdk_ftl_dev *dev, ftl_addr addr); ftl_addr ftl_band_tail_md_addr(struct ftl_band *band); diff --git a/lib/ftl/ftl_debug.c b/lib/ftl/ftl_debug.c index 72db1a768..c129090d9 100644 --- a/lib/ftl/ftl_debug.c +++ b/lib/ftl/ftl_debug.c @@ -5,13 +5,59 @@ #include "spdk/ftl.h" #include "ftl_debug.h" +#include "ftl_band.h" + +/* TODO: Switch to INFOLOG instead, we can control the printing via spdk_log_get_flag */ +#if defined(DEBUG) + +static const char *ftl_band_state_str[] = { + "free", + "prep", + "opening", + "open", + "full", + "closing", + "closed", + "max" +}; + +void +ftl_dev_dump_bands(struct spdk_ftl_dev *dev) +{ + uint64_t i; + + if (!dev->bands) { + return; + } + + FTL_NOTICELOG(dev, "Bands validity:\n"); + for (i = 0; i < ftl_get_num_bands(dev); ++i) { + FTL_NOTICELOG(dev, " Band %3zu: %8zu / %zu \twr_cnt: %"PRIu64 + "\tstate: %s\n", + i + 1, dev->bands[i].p2l_map.num_valid, + ftl_band_user_blocks(&dev->bands[i]), + dev->bands[i].md->wr_cnt, + ftl_band_state_str[dev->bands[i].md->state]); + } +} + +#endif /* defined(DEBUG) */ void ftl_dev_dump_stats(const struct spdk_ftl_dev *dev) { - size_t total = 0; + uint64_t i, total = 0; char uuid[SPDK_UUID_STRING_LEN]; + if (!dev->bands) { + return; + } + + /* Count the number of valid LBAs */ + for (i = 0; i < ftl_get_num_bands(dev); ++i) { + total += dev->bands[i].p2l_map.num_valid; + } + spdk_uuid_fmt_lower(uuid, sizeof(uuid), &dev->conf.uuid); FTL_NOTICELOG(dev, "\n"); FTL_NOTICELOG(dev, "device UUID: %s\n", uuid); diff --git a/lib/ftl/ftl_debug.h b/lib/ftl/ftl_debug.h index 7af6ea05f..32083c221 100644 --- a/lib/ftl/ftl_debug.h +++ b/lib/ftl/ftl_debug.h @@ -7,8 +7,20 @@ #define FTL_DEBUG_H #include "ftl_internal.h" +#include "ftl_band.h" #include "ftl_core.h" +typedef void (*ftl_band_validate_md_cb)(struct ftl_band *band, bool valid); + +#if defined(DEBUG) +void ftl_dev_dump_bands(struct spdk_ftl_dev *dev); +#else +static inline void +ftl_dev_dump_bands(struct spdk_ftl_dev *dev) +{ +} +#endif + void ftl_dev_dump_stats(const struct spdk_ftl_dev *dev); #endif /* FTL_DEBUG_H */ diff --git a/lib/ftl/mngt/ftl_mngt_misc.c b/lib/ftl/mngt/ftl_mngt_misc.c index 692b455aa..81c421b13 100644 --- a/lib/ftl/mngt/ftl_mngt_misc.c +++ b/lib/ftl/mngt/ftl_mngt_misc.c @@ -173,6 +173,7 @@ ftl_mngt_stop_core_poller(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mng void ftl_mngt_dump_stats(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt) { + ftl_dev_dump_bands(dev); ftl_dev_dump_stats(dev); ftl_mngt_next_step(mngt); }