Commit 6d6179ff authored by Mateusz Kozlowski's avatar Mateusz Kozlowski Committed by Konrad Sztyber
Browse files

lib/ftl: Add new metadata region P2L IO LOG



Change-Id: I8c818d3ae117bf4b92437141ad225ac339ffdf0a
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/+/19618


Reviewed-by: default avatarJim Harris <jim.harris@samsung.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
Community-CI: Mellanox Build Bot
parent 59b53280
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -37,7 +37,7 @@ C_SRCS += utils/ftl_layout_tracker_bdev.c
C_SRCS += upgrade/ftl_layout_upgrade.c upgrade/ftl_sb_upgrade.c upgrade/ftl_p2l_upgrade.c
C_SRCS += upgrade/ftl_band_upgrade.c upgrade/ftl_chunk_upgrade.c upgrade/ftl_trim_upgrade.c
C_SRCS += upgrade/ftl_sb_v3.c upgrade/ftl_sb_v5.c
C_SRCS += nvc/ftl_nvc_dev.c nvc/ftl_nvc_bdev_vss.c nvc/ftl_nvc_bdev_non_vss.c
C_SRCS += nvc/ftl_nvc_dev.c nvc/ftl_nvc_bdev_vss.c nvc/ftl_nvc_bdev_non_vss.c nvc/ftl_nvc_bdev_common.c
C_SRCS += base/ftl_base_dev.c base/ftl_base_bdev.c
ifeq ($(CONFIG_DEBUG),y)
C_SRCS += ftl_trace.c
+4 −0
Original line number Diff line number Diff line
@@ -28,6 +28,10 @@

#define FTL_P2L_VERSION_CURRENT FTL_P2L_VERSION_2

#define FTL_P2L_LOG_VERSION_0	0

#define FTL_P2L_LOG_VERSION_CURRENT FTL_P2L_LOG_VERSION_0

/*
 * This type represents address in the ftl address space. Values from 0 to based bdev size are
 * mapped directly to base device lbas. Values above that represent nv cache lbas.
+17 −7
Original line number Diff line number Diff line
@@ -100,7 +100,9 @@ ftl_md_region_name(enum ftl_layout_region_type reg_type)
		[FTL_LAYOUT_REGION_TYPE_TRIM_MD] = "trim_md",
		[FTL_LAYOUT_REGION_TYPE_TRIM_MD_MIRROR] = "trim_md_mirror",
		[FTL_LAYOUT_REGION_TYPE_TRIM_LOG] = "trim_log",
		[FTL_LAYOUT_REGION_TYPE_TRIM_LOG_MIRROR] = "trim_log_mirror"
		[FTL_LAYOUT_REGION_TYPE_TRIM_LOG_MIRROR] = "trim_log_mirror",
		[FTL_LAYOUT_REGION_TYPE_P2L_LOG_IO_MIN] = "p2l_log_io1",
		[FTL_LAYOUT_REGION_TYPE_P2L_LOG_IO_MAX] = "p2l_log_io2",
	};
	const char *reg_name = md_region_name[reg_type];

@@ -109,9 +111,19 @@ ftl_md_region_name(enum ftl_layout_region_type reg_type)
	return reg_name;
}

static bool
is_region_disabled(struct ftl_layout_region *region)
{
	return region->current.blocks == 0 && region->current.offset == FTL_ADDR_INVALID;
}

static void
dump_region(struct spdk_ftl_dev *dev, struct ftl_layout_region *region)
{
	if (is_region_disabled(region)) {
		return;
	}

	assert(!(region->current.offset % superblock_region_blocks(dev)));
	assert(!(region->current.blocks % superblock_region_blocks(dev)));

@@ -122,12 +134,6 @@ dump_region(struct spdk_ftl_dev *dev, struct ftl_layout_region *region)
		      blocks2mib(region->current.blocks));
}

static bool
is_region_disabled(struct ftl_layout_region *region)
{
	return region->current.blocks == 0 && region->current.offset == FTL_ADDR_INVALID;
}

int
ftl_validate_regions(struct spdk_ftl_dev *dev, struct ftl_layout *layout)
{
@@ -513,6 +519,10 @@ layout_setup_default_nvc(struct spdk_ftl_dev *dev)
	}
	layout->region[FTL_LAYOUT_REGION_TYPE_NVC_MD].mirror_type = FTL_LAYOUT_REGION_TYPE_NVC_MD_MIRROR;

	if (dev->nv_cache.nvc_type->ops.setup_layout) {
		return dev->nv_cache.nvc_type->ops.setup_layout(dev);
	}

	return 0;

error:
+7 −1
Original line number Diff line number Diff line
@@ -16,6 +16,9 @@ struct ftl_layout_tracker_bdev;
#define FTL_LAYOUT_REGION_TYPE_P2L_COUNT \
	(FTL_LAYOUT_REGION_TYPE_P2L_CKPT_MAX - FTL_LAYOUT_REGION_TYPE_P2L_CKPT_MIN + 1)

#define FTL_LAYOUT_REGION_TYPE_P2L_LOG_IO_COUNT \
	(FTL_LAYOUT_REGION_TYPE_P2L_LOG_IO_MAX - FTL_LAYOUT_REGION_TYPE_P2L_LOG_IO_MIN + 1)

enum ftl_layout_region_type {
	/* Superblock describing the basic FTL information */
	FTL_LAYOUT_REGION_TYPE_SB = 0,
@@ -64,8 +67,11 @@ enum ftl_layout_region_type {
	FTL_LAYOUT_REGION_TYPE_TRIM_LOG = 16,
	/* Mirror log for the transaction of trim */
	FTL_LAYOUT_REGION_TYPE_TRIM_LOG_MIRROR = 17,
	/* P2L IO logs for non-VSS cache */
	FTL_LAYOUT_REGION_TYPE_P2L_LOG_IO_MIN = 18,
	FTL_LAYOUT_REGION_TYPE_P2L_LOG_IO_MAX = 19,

	FTL_LAYOUT_REGION_TYPE_MAX = 18
	FTL_LAYOUT_REGION_TYPE_MAX = 20
};

/* last nvc/base region in terms of lba address space */
+2 −0
Original line number Diff line number Diff line
@@ -45,6 +45,8 @@ is_buffer_needed(enum ftl_layout_region_type type)
#endif
	case FTL_LAYOUT_REGION_TYPE_TRIM_MD_MIRROR:
	case FTL_LAYOUT_REGION_TYPE_TRIM_LOG_MIRROR:
	case FTL_LAYOUT_REGION_TYPE_P2L_LOG_IO_MIN:
	case FTL_LAYOUT_REGION_TYPE_P2L_LOG_IO_MAX:
		return false;

	default:
Loading