FTL: Add debug function for dumping band information

Signed-off-by: Kozlowski Mateusz <mateusz.kozlowski@intel.com>
Signed-off-by: Artur Paszkiewicz <artur.paszkiewicz@intel.com>
Change-Id: I6edef1e8e822f8428dff5f5f5da2df923191f6fc
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/13328
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
This commit is contained in:
Kozlowski Mateusz 2022-06-10 12:09:13 +02:00 committed by Jim Harris
parent 8c519d31bd
commit 88d1c3a69a
5 changed files with 68 additions and 1 deletions

View File

@ -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)
{

View File

@ -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);

View File

@ -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);

View File

@ -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 */

View File

@ -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);
}