From 811a027e436507a7d248f56171ffcf37571f4238 Mon Sep 17 00:00:00 2001 From: Kozlowski Mateusz Date: Tue, 23 Aug 2022 13:52:12 +0200 Subject: [PATCH] ftl: Add helper functions for creating md regions Helper functions which determine which md regions will be stored in shm. Signed-off-by: Kozlowski Mateusz Change-Id: I94cbfca66dfb56457a350874dbd1de63a2e07661 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/14159 Tested-by: SPDK CI Jenkins Reviewed-by: Ben Walker Reviewed-by: Jim Harris --- lib/ftl/mngt/ftl_mngt_md.c | 5 ++--- lib/ftl/mngt/ftl_mngt_misc.c | 2 +- lib/ftl/utils/ftl_md.c | 31 +++++++++++++++++++++++++++++++ lib/ftl/utils/ftl_md.h | 27 +++++++++++++++++++++++++++ 4 files changed, 61 insertions(+), 4 deletions(-) diff --git a/lib/ftl/mngt/ftl_mngt_md.c b/lib/ftl/mngt/ftl_mngt_md.c index 7c50fe8e0..ed79e99a7 100644 --- a/lib/ftl/mngt/ftl_mngt_md.c +++ b/lib/ftl/mngt/ftl_mngt_md.c @@ -62,9 +62,8 @@ ftl_mngt_init_md(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt) */ continue; } - md_flags = is_buffer_needed(i) ? - FTL_MD_CREATE_SHM | FTL_MD_CREATE_SHM_NEW : - FTL_MD_CREATE_NO_MEM; + md_flags = is_buffer_needed(i) ? ftl_md_create_region_flags(dev, + region->type) : FTL_MD_CREATE_NO_MEM; layout->md[i] = ftl_md_create(dev, region->current.blocks, region->vss_blksz, region->name, md_flags, region); if (NULL == layout->md[i]) { diff --git a/lib/ftl/mngt/ftl_mngt_misc.c b/lib/ftl/mngt/ftl_mngt_misc.c index 7af1c0e9a..858ecded5 100644 --- a/lib/ftl/mngt/ftl_mngt_misc.c +++ b/lib/ftl/mngt/ftl_mngt_misc.c @@ -30,7 +30,7 @@ init_p2l_map_pool(struct spdk_ftl_dev *dev) void *p2l_pool_buf; dev->p2l_pool_md = ftl_md_create(dev, p2l_pool_buf_blks, 0, "p2l_pool", - FTL_MD_CREATE_SHM | FTL_MD_CREATE_SHM_NEW, NULL); + ftl_md_create_shm_flags(dev), NULL); if (!dev->p2l_pool_md) { return -ENOMEM; } diff --git a/lib/ftl/utils/ftl_md.c b/lib/ftl/utils/ftl_md.c index 45341e362..56e388932 100644 --- a/lib/ftl/utils/ftl_md.c +++ b/lib/ftl/utils/ftl_md.c @@ -1100,3 +1100,34 @@ ftl_md_set_region(struct ftl_md *md, return 0; } + +int +ftl_md_create_region_flags(struct spdk_ftl_dev *dev, int region_type) +{ + int flags = FTL_MD_CREATE_SHM; + + switch (region_type) { + case FTL_LAYOUT_REGION_TYPE_SB: + if (dev->conf.mode & SPDK_FTL_MODE_CREATE) { + flags |= FTL_MD_CREATE_SHM_NEW; + } + break; + + case FTL_LAYOUT_REGION_TYPE_BAND_MD: + case FTL_LAYOUT_REGION_TYPE_NVC_MD: + flags |= FTL_MD_CREATE_SHM_NEW; + break; + default: + return FTL_MD_CREATE_HEAP; + } + + return flags; +} + +int +ftl_md_create_shm_flags(struct spdk_ftl_dev *dev) +{ + int flags = FTL_MD_CREATE_SHM | FTL_MD_CREATE_SHM_NEW; + + return flags; +} diff --git a/lib/ftl/utils/ftl_md.h b/lib/ftl/utils/ftl_md.h index 697821a8f..2835dc27b 100644 --- a/lib/ftl/utils/ftl_md.h +++ b/lib/ftl/utils/ftl_md.h @@ -321,4 +321,31 @@ void ftl_md_clear(struct ftl_md *md, int pattern, union ftl_md_vss *vss_pattern) */ uint64_t ftl_md_xfer_blocks(struct spdk_ftl_dev *dev); +/** + * @brief Return the md creation flags for a given md region type + * + * Controls MD regions backed up on SHM via FTL_MD_CREATE_SHM. + * FTL_MD_CREATE_SHM_NEW is added for: + * 1. superblock upon SPDK_FTL_MODE_CREATE flag set, + * 2. other regions if not in a fast startup mode. + * + * @param dev The FTL device + * @param region_type MD region type + * + * @return MD creation flags + */ +int ftl_md_create_region_flags(struct spdk_ftl_dev *dev, int region_type); + +/** + * @brief Return the SHM-backed md creation flags + * + * FTL_MD_CREATE_SHM is always set. + * FTL_MD_CREATE_SHM_NEW is added if not in a fast startup mode. + * + * @param dev The FTL device + * + * @return MD creation flags + */ +int ftl_md_create_shm_flags(struct spdk_ftl_dev *dev); + #endif /* FTL_MD_H */