ftl: superblock in shared memory

Signed-off-by: Artur Paszkiewicz <artur.paszkiewicz@intel.com>
Signed-off-by: Kozlowski Mateusz <mateusz.kozlowski@intel.com>
Change-Id: I86e2cbf364ae3075aad2e09429754027df33eadf
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/13342
Community-CI: Mellanox Build Bot
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
This commit is contained in:
Artur Paszkiewicz 2022-06-09 14:51:45 +02:00 committed by Jim Harris
parent 818b9c053b
commit f45c007512
6 changed files with 66 additions and 0 deletions

View File

@ -47,6 +47,10 @@ struct spdk_ftl_dev {
/* FTL superblock */
struct ftl_superblock *sb;
/* FTL shm superblock */
struct ftl_superblock_shm *sb_shm;
struct ftl_md *sb_shm_md;
/* Queue of registered IO channels */
TAILQ_HEAD(, ftl_io_channel) ioch_queue;
@ -145,6 +149,9 @@ struct spdk_ftl_dev {
/* Writer for GC IOs */
struct ftl_writer writer_gc;
/* Retry init sequence */
bool init_retry;
};
void ftl_apply_limits(struct spdk_ftl_dev *dev);

View File

@ -132,8 +132,20 @@ static void
dev_init_cb(struct spdk_ftl_dev *dev, void *_ctx, int status)
{
struct ftl_dev_init_ctx *ctx = _ctx;
int rc;
if (status) {
if (dev->init_retry) {
FTL_NOTICELOG(dev, "Startup retry\n");
rc = spdk_ftl_dev_init(&dev->conf, ctx->cb_fn, ctx->cb_arg);
if (!rc) {
free_dev(dev);
free(ctx);
return;
}
FTL_NOTICELOG(dev, "Startup retry failed: %d\n", rc);
}
free_dev(dev);
dev = NULL;
}

View File

@ -47,4 +47,21 @@ struct ftl_superblock_md_region {
uint64_t blk_sz;
};
struct ftl_superblock_shm {
/* SHM initialization completed */
bool shm_ready;
/* SHM status - fast restart */
bool shm_clean;
/* Used to continue trim after SHM recovery */
struct {
bool in_progress;
uint64_t start_lba;
uint64_t num_blocks;
} trim;
struct ftl_superblock_gc_info gc_info;
};
#endif /* FTL_SB_COMMON_H */

View File

@ -170,6 +170,7 @@ ftl_mngt_init_default_sb(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt
sb->header.version = FTL_METADATA_VERSION_CURRENT;
sb->uuid = dev->conf.uuid;
sb->clean = 0;
dev->sb_shm->shm_clean = false;
/* Max 16 IO depth per band relocate */
sb->max_reloc_qdepth = 16;
@ -191,6 +192,7 @@ ftl_mngt_set_dirty(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt)
struct ftl_superblock *sb = dev->sb;
sb->clean = 0;
dev->sb_shm->shm_clean = false;
sb->header.crc = get_sb_crc(sb);
persist(dev, mngt, FTL_LAYOUT_REGION_TYPE_SB);
}
@ -258,6 +260,18 @@ ftl_mngt_superblock_init(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt
FTL_NOTICELOG(dev, "Create new FTL, UUID %s\n", uuid);
}
/* Allocate md buf */
dev->sb_shm = NULL;
dev->sb_shm_md = ftl_md_create(dev, spdk_divide_round_up(sizeof(*dev->sb_shm), FTL_BLOCK_SIZE),
0, "sb_shm",
md_create_flags, NULL);
if (dev->sb_shm_md == NULL) {
ftl_mngt_fail_step(mngt);
return;
}
dev->sb_shm = ftl_md_get_buffer(dev->sb_shm_md);
/* Setup the layout of a superblock */
if (ftl_layout_setup_superblock(dev)) {
ftl_mngt_fail_step(mngt);
@ -308,5 +322,9 @@ ftl_mngt_superblock_deinit(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mn
layout->md[FTL_LAYOUT_REGION_TYPE_SB_BASE] = NULL;
}
ftl_md_destroy(dev->sb_shm_md);
dev->sb_shm_md = NULL;
dev->sb_shm = NULL;
ftl_mngt_next_step(mngt);
}

View File

@ -139,6 +139,7 @@ void
ftl_mngt_finalize_startup(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt)
{
dev->initialized = 1;
dev->sb_shm->shm_ready = true;
ftl_writer_resume(&dev->writer_user);
ftl_writer_resume(&dev->writer_gc);

View File

@ -115,6 +115,15 @@ ftl_md_setup_obj(struct ftl_md *md, int flags,
}
}
static void
ftl_md_invalidate_shm(struct ftl_md *md)
{
if (md->dev->sb_shm && md->dev->sb_shm->shm_ready) {
md->dev->init_retry = true;
md->dev->sb_shm->shm_ready = false;
}
}
static void
ftl_md_create_shm(struct ftl_md *md, uint64_t vss_blksz, int flags)
{
@ -138,6 +147,7 @@ ftl_md_create_shm(struct ftl_md *md, uint64_t vss_blksz, int flags)
/* If specified, unlink before create a new SHM object */
if (flags & FTL_MD_CREATE_SHM_NEW) {
if (md->shm_unlink(md->name) < 0 && errno != ENOENT) {
ftl_md_invalidate_shm(md);
return;
}
open_flags += O_CREAT | O_TRUNC;
@ -215,6 +225,7 @@ err_shm:
md->shm_unlink(md->name);
md->shm_fd = -1;
}
ftl_md_invalidate_shm(md);
}
static void