Commit 30ef80cd authored by Mateusz Kozlowski's avatar Mateusz Kozlowski Committed by Tomasz Zawadzki
Browse files

lib/ftl: Add ftl_layout_region_get function



Non-VSS will have additional regions compared to VSS cache
implementation. Adding helper function to return existing regions (which
will have the type filled in) in FTLs already created on VSS caches.

Change-Id: Ib98fca625dfd543c3f7bb99eb99da5a24a543cb8
Signed-off-by: default avatarMateusz Kozlowski <mateusz.kozlowski@solidigm.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/19976


Reviewed-by: default avatarBen Walker <ben@nvidia.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarJim Harris <jim.harris@samsung.com>
Reviewed-by: default avatarArtur Paszkiewicz <artur.paszkiewicz@intel.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
parent 424a88a4
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -332,7 +332,7 @@ ftl_band_alloc_md_entry(struct ftl_band *band)
{
	struct spdk_ftl_dev *dev = band->dev;
	struct ftl_p2l_map *p2l_map = &band->p2l_map;
	struct ftl_layout_region *region = &dev->layout.region[FTL_LAYOUT_REGION_TYPE_BAND_MD];
	struct ftl_layout_region *region = ftl_layout_region_get(dev, FTL_LAYOUT_REGION_TYPE_BAND_MD);

	p2l_map->band_dma_md = ftl_mempool_get(dev->band_md_pool);

+3 −3
Original line number Diff line number Diff line
@@ -288,7 +288,7 @@ ftl_band_open(struct ftl_band *band, enum ftl_band_type type)
{
	struct spdk_ftl_dev *dev = band->dev;
	struct ftl_md *md = dev->layout.md[FTL_LAYOUT_REGION_TYPE_BAND_MD];
	struct ftl_layout_region *region = &dev->layout.region[FTL_LAYOUT_REGION_TYPE_BAND_MD];
	struct ftl_layout_region *region = ftl_layout_region_get(dev, FTL_LAYOUT_REGION_TYPE_BAND_MD);
	struct ftl_p2l_map *p2l_map = &band->p2l_map;

	ftl_band_set_type(band, type);
@@ -335,7 +335,7 @@ band_map_write_cb(struct ftl_basic_rq *brq)
	struct ftl_band *band = brq->io.band;
	struct ftl_p2l_map *p2l_map = &band->p2l_map;
	struct spdk_ftl_dev *dev = band->dev;
	struct ftl_layout_region *region = &dev->layout.region[FTL_LAYOUT_REGION_TYPE_BAND_MD];
	struct ftl_layout_region *region = ftl_layout_region_get(dev, FTL_LAYOUT_REGION_TYPE_BAND_MD);
	struct ftl_md *md = dev->layout.md[FTL_LAYOUT_REGION_TYPE_BAND_MD];
	uint32_t band_map_crc;

@@ -402,7 +402,7 @@ ftl_band_free(struct ftl_band *band)
	struct spdk_ftl_dev *dev = band->dev;
	struct ftl_p2l_map *p2l_map = &band->p2l_map;
	struct ftl_md *md = dev->layout.md[FTL_LAYOUT_REGION_TYPE_BAND_MD];
	struct ftl_layout_region *region = &dev->layout.region[FTL_LAYOUT_REGION_TYPE_BAND_MD];
	struct ftl_layout_region *region = ftl_layout_region_get(dev, FTL_LAYOUT_REGION_TYPE_BAND_MD);

	memcpy(p2l_map->band_dma_md, band->md, region->entry_size * FTL_BLOCK_SIZE);
	p2l_map->band_dma_md->state = FTL_BAND_STATE_FREE;
+20 −9
Original line number Diff line number Diff line
@@ -108,15 +108,15 @@ dump_region(struct spdk_ftl_dev *dev, struct ftl_layout_region *region)
int
ftl_validate_regions(struct spdk_ftl_dev *dev, struct ftl_layout *layout)
{
	uint64_t i, j;
	enum ftl_layout_region_type i, j;

	/* Validate if regions doesn't overlap each other  */
	/* TODO: major upgrades: keep track of and validate free_nvc/free_btm regions */
	for (i = 0; i < FTL_LAYOUT_REGION_TYPE_MAX; i++) {
		struct ftl_layout_region *r1 = &layout->region[i];
		struct ftl_layout_region *r1 = ftl_layout_region_get(dev, i);

		for (j = 0; j < FTL_LAYOUT_REGION_TYPE_MAX; j++) {
			struct ftl_layout_region *r2 = &layout->region[j];
			struct ftl_layout_region *r2 = ftl_layout_region_get(dev, j);

			if (r1->bdev_desc != r2->bdev_desc) {
				continue;
@@ -170,6 +170,15 @@ layout_blocks_left(struct spdk_ftl_dev *dev, struct ftl_layout_tracker_bdev *lay
	return max_reg_size;
}

struct ftl_layout_region *
ftl_layout_region_get(struct spdk_ftl_dev *dev, enum ftl_layout_region_type reg_type)
{
	struct ftl_layout_region *reg = &dev->layout.region[reg_type];

	assert(reg_type < FTL_LAYOUT_REGION_TYPE_MAX);
	return reg->type == reg_type ? reg : NULL;
}

static int
setup_layout_nvc(struct spdk_ftl_dev *dev)
{
@@ -420,19 +429,21 @@ ftl_layout_setup_superblock(struct spdk_ftl_dev *dev)
void
ftl_layout_dump(struct spdk_ftl_dev *dev)
{
	struct ftl_layout *layout = &dev->layout;
	int i;
	struct ftl_layout_region *reg;
	enum ftl_layout_region_type i;

	FTL_NOTICELOG(dev, "NV cache layout:\n");
	for (i = 0; i < FTL_LAYOUT_REGION_TYPE_MAX; ++i) {
		if (layout->region[i].bdev_desc == dev->nv_cache.bdev_desc) {
			dump_region(dev, &layout->region[i]);
		reg = ftl_layout_region_get(dev, i);
		if (reg && reg->bdev_desc == dev->nv_cache.bdev_desc) {
			dump_region(dev, reg);
		}
	}
	FTL_NOTICELOG(dev, "Base device layout:\n");
	for (i = 0; i < FTL_LAYOUT_REGION_TYPE_MAX; ++i) {
		if (layout->region[i].bdev_desc == dev->base_bdev_desc) {
			dump_region(dev, &layout->region[i]);
		reg = ftl_layout_region_get(dev, i);
		if (reg && reg->bdev_desc == dev->base_bdev_desc) {
			dump_region(dev, reg);
		}
	}
}
+11 −0
Original line number Diff line number Diff line
@@ -215,4 +215,15 @@ int ftl_validate_regions(struct spdk_ftl_dev *dev, struct ftl_layout *layout);
 */
uint64_t ftl_layout_base_md_blocks(struct spdk_ftl_dev *dev);

/**
 * @brief Get the FTL layout region
 *
 * @param dev FTL device
 * @param reg_type type of the layout region
 *
 * @return pointer to the layout region if region was created or NULL, if not created
 */
struct ftl_layout_region *ftl_layout_region_get(struct spdk_ftl_dev *dev,
		enum ftl_layout_region_type reg_type);

#endif /* FTL_LAYOUT_H */
+7 −7
Original line number Diff line number Diff line
@@ -31,7 +31,7 @@ nvc_data_region(struct ftl_nv_cache *nv_cache)
	struct spdk_ftl_dev *dev;

	dev = SPDK_CONTAINEROF(nv_cache, struct spdk_ftl_dev, nv_cache);
	return &dev->layout.region[FTL_LAYOUT_REGION_TYPE_DATA_NVC];
	return ftl_layout_region_get(dev, FTL_LAYOUT_REGION_TYPE_DATA_NVC);
}

static inline void
@@ -374,7 +374,7 @@ ftl_chunk_alloc_md_entry(struct ftl_nv_cache_chunk *chunk)
	struct ftl_nv_cache *nv_cache = chunk->nv_cache;
	struct spdk_ftl_dev *dev = SPDK_CONTAINEROF(nv_cache, struct spdk_ftl_dev, nv_cache);
	struct ftl_p2l_map *p2l_map = &chunk->p2l_map;
	struct ftl_layout_region *region = &dev->layout.region[FTL_LAYOUT_REGION_TYPE_NVC_MD];
	struct ftl_layout_region *region = ftl_layout_region_get(dev, FTL_LAYOUT_REGION_TYPE_NVC_MD);

	p2l_map->chunk_dma_md = ftl_mempool_get(nv_cache->chunk_md_pool);

@@ -413,7 +413,7 @@ ftl_chunk_alloc_chunk_free_entry(struct ftl_nv_cache_chunk *chunk)
	struct ftl_nv_cache *nv_cache = chunk->nv_cache;
	struct spdk_ftl_dev *dev = SPDK_CONTAINEROF(nv_cache, struct spdk_ftl_dev, nv_cache);
	struct ftl_p2l_map *p2l_map = &chunk->p2l_map;
	struct ftl_layout_region *region = &dev->layout.region[FTL_LAYOUT_REGION_TYPE_NVC_MD];
	struct ftl_layout_region *region = ftl_layout_region_get(dev, FTL_LAYOUT_REGION_TYPE_NVC_MD);

	p2l_map->chunk_dma_md = ftl_mempool_get(nv_cache->free_chunk_md_pool);

@@ -465,7 +465,7 @@ ftl_chunk_persist_free_state(struct ftl_nv_cache *nv_cache)
	struct spdk_ftl_dev *dev = SPDK_CONTAINEROF(nv_cache, struct spdk_ftl_dev, nv_cache);
	struct ftl_p2l_map *p2l_map;
	struct ftl_md *md = dev->layout.md[FTL_LAYOUT_REGION_TYPE_NVC_MD];
	struct ftl_layout_region *region = &dev->layout.region[FTL_LAYOUT_REGION_TYPE_NVC_MD];
	struct ftl_layout_region *region = ftl_layout_region_get(dev, FTL_LAYOUT_REGION_TYPE_NVC_MD);
	struct ftl_nv_cache_chunk *tchunk, *chunk = NULL;

	TAILQ_FOREACH_SAFE(chunk, &nv_cache->needs_free_persist_list, entry, tchunk) {
@@ -1686,7 +1686,7 @@ ftl_chunk_open(struct ftl_nv_cache_chunk *chunk)
{
	struct spdk_ftl_dev *dev = SPDK_CONTAINEROF(chunk->nv_cache, struct spdk_ftl_dev, nv_cache);
	struct ftl_p2l_map *p2l_map = &chunk->p2l_map;
	struct ftl_layout_region *region = &dev->layout.region[FTL_LAYOUT_REGION_TYPE_NVC_MD];
	struct ftl_layout_region *region = ftl_layout_region_get(dev, FTL_LAYOUT_REGION_TYPE_NVC_MD);
	struct ftl_md *md = dev->layout.md[FTL_LAYOUT_REGION_TYPE_NVC_MD];

	if (chunk_alloc_p2l_map(chunk)) {
@@ -1749,7 +1749,7 @@ chunk_map_write_cb(struct ftl_basic_rq *brq)
	struct ftl_nv_cache_chunk *chunk = brq->io.chunk;
	struct ftl_p2l_map *p2l_map = &chunk->p2l_map;
	struct spdk_ftl_dev *dev = SPDK_CONTAINEROF(chunk->nv_cache, struct spdk_ftl_dev, nv_cache);
	struct ftl_layout_region *region = &dev->layout.region[FTL_LAYOUT_REGION_TYPE_NVC_MD];
	struct ftl_layout_region *region = ftl_layout_region_get(dev, FTL_LAYOUT_REGION_TYPE_NVC_MD);
	struct ftl_md *md = dev->layout.md[FTL_LAYOUT_REGION_TYPE_NVC_MD];
	uint32_t chunk_map_crc;

@@ -1819,7 +1819,7 @@ restore_fill_p2l_map_cb(struct ftl_basic_rq *parent)
	struct ftl_p2l_map *p2l_map = &chunk->p2l_map;
	struct spdk_ftl_dev *dev = SPDK_CONTAINEROF(chunk->nv_cache, struct spdk_ftl_dev, nv_cache);
	struct ftl_md *md = dev->layout.md[FTL_LAYOUT_REGION_TYPE_NVC_MD];
	struct ftl_layout_region *region = &dev->layout.region[FTL_LAYOUT_REGION_TYPE_NVC_MD];
	struct ftl_layout_region *region = ftl_layout_region_get(dev, FTL_LAYOUT_REGION_TYPE_NVC_MD);
	uint32_t chunk_map_crc;

	/* Set original callback */
Loading