Commit b5cf795b authored by Mateusz Kozlowski's avatar Mateusz Kozlowski Committed by Ben Walker
Browse files

lib/ftl: Add band properties



In expert mode FTL band properties are available. The following
info is reported: id, state, and validity.

Change-Id: Ib228b69281fb1aa69e0f801f896ce4375f585042
Signed-off-by: default avatarMariusz Barczak <Mariusz.Barczak@solidigmtechnology.com>
Signed-off-by: default avatarMateusz Kozlowski <mateusz.kozlowski@solidigm.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/19047


Reviewed-by: default avatarJim Harris <jim.harris@samsung.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarBen Walker <ben@nvidia.com>
Community-CI: Mellanox Build Bot
parent ebcb0d71
Loading
Loading
Loading
Loading
+21 −4
Original line number Diff line number Diff line
@@ -135,6 +135,23 @@ ftl_band_tail_md_addr(struct ftl_band *band)
	return addr;
}

const char *
ftl_band_get_state_name(struct ftl_band *band)
{
	static const char *names[] = {
		"FREE", "PREPARING", "OPENING", "OPEN", "FULL", "CLOSING",
		"CLOSED",
	};

	assert(band->md->state < SPDK_COUNTOF(names));
	if (band->md->state < SPDK_COUNTOF(names)) {
		return names[band->md->state];
	} else {
		assert(false);
		return "?";
	}
}

void
ftl_band_set_state(struct ftl_band *band, enum ftl_band_state state)
{
@@ -429,8 +446,8 @@ ftl_p2l_map_pool_elem_size(struct spdk_ftl_dev *dev)
	return ftl_tail_md_num_blocks(dev) * FTL_BLOCK_SIZE;
}

static double
_band_invalidity(struct ftl_band *band)
double
ftl_band_invalidity(struct ftl_band *band)
{
	double valid = band->p2l_map.num_valid;
	double count = ftl_band_user_blocks(band);
@@ -449,7 +466,7 @@ dump_bands_under_relocation(struct spdk_ftl_dev *dev)

		FTL_DEBUGLOG(dev, "Band, id %u, phys_is %u, wr cnt = %u, invalidity = %u%%\n",
			     band->id, band->phys_id, (uint32_t)band->md->wr_cnt,
			     (uint32_t)(_band_invalidity(band) * 100));
			     (uint32_t)(ftl_band_invalidity(band) * 100));
	}
}

@@ -490,7 +507,7 @@ get_band_phys_info(struct spdk_ftl_dev *dev, uint64_t phys_id,
			continue;
		}

		*invalidity += _band_invalidity(band);
		*invalidity += ftl_band_invalidity(band);
	}

	*invalidity /= dev->num_logical_bands_in_physical;
+2 −0
Original line number Diff line number Diff line
@@ -158,6 +158,7 @@ uint64_t ftl_band_block_offset_from_addr(struct ftl_band *band, ftl_addr addr);
ftl_addr ftl_band_addr_from_block_offset(struct ftl_band *band, uint64_t block_off);
void ftl_band_set_type(struct ftl_band *band, enum ftl_band_type type);
void ftl_band_set_state(struct ftl_band *band, enum ftl_band_state state);
const char *ftl_band_get_state_name(struct ftl_band *band);
void ftl_band_acquire_p2l_map(struct ftl_band *band);
int ftl_band_alloc_p2l_map(struct ftl_band *band);
int ftl_band_open_p2l_map(struct ftl_band *band);
@@ -188,6 +189,7 @@ void ftl_band_basic_rq_read(struct ftl_band *band, struct ftl_basic_rq *brq);
void ftl_band_get_next_gc(struct spdk_ftl_dev *dev, ftl_band_ops_cb cb, void *cntx);
void ftl_band_read_tail_brq_md(struct ftl_band *band, ftl_band_md_cb cb, void *cntx);
void ftl_band_initialize_free_state(struct ftl_band *band);
double ftl_band_invalidity(struct ftl_band *band);

static inline void
ftl_band_set_owner(struct ftl_band *band,
+20 −0
Original line number Diff line number Diff line
@@ -326,6 +326,24 @@ finalize_init_gc(struct spdk_ftl_dev *dev)
	return 0;
}

static void
ftl_property_dump_base_dev(struct spdk_ftl_dev *dev, const struct ftl_property *property,
			   struct spdk_json_write_ctx *w)
{
	uint64_t i;
	struct ftl_band *band;

	spdk_json_write_named_array_begin(w, "bands");
	for (i = 0, band = dev->bands; i < ftl_get_num_bands(dev); i++, band++) {
		spdk_json_write_object_begin(w);
		spdk_json_write_named_uint64(w, "id", i);
		spdk_json_write_named_string(w, "state", ftl_band_get_state_name(band));
		spdk_json_write_named_double(w, "validity", 1.0 - ftl_band_invalidity(band));
		spdk_json_write_object_end(w);
	}
	spdk_json_write_array_end(w);
}

void
ftl_mngt_finalize_init_bands(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt)
{
@@ -336,6 +354,8 @@ ftl_mngt_finalize_init_bands(struct spdk_ftl_dev *dev, struct ftl_mngt_process *
	bool fast_startup = ftl_fast_startup(dev);

	ftl_recover_max_seq(dev);
	ftl_property_register(dev, "base_device", NULL, 0, NULL, NULL, ftl_property_dump_base_dev, NULL,
			      NULL, true);

	TAILQ_FOREACH_SAFE(band, &dev->free_bands, queue_entry, temp_band) {
		band->md->df_p2l_map = FTL_DF_OBJ_ID_INVALID;