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:
parent
818b9c053b
commit
f45c007512
@ -47,6 +47,10 @@ struct spdk_ftl_dev {
|
|||||||
/* FTL superblock */
|
/* FTL superblock */
|
||||||
struct ftl_superblock *sb;
|
struct ftl_superblock *sb;
|
||||||
|
|
||||||
|
/* FTL shm superblock */
|
||||||
|
struct ftl_superblock_shm *sb_shm;
|
||||||
|
struct ftl_md *sb_shm_md;
|
||||||
|
|
||||||
/* Queue of registered IO channels */
|
/* Queue of registered IO channels */
|
||||||
TAILQ_HEAD(, ftl_io_channel) ioch_queue;
|
TAILQ_HEAD(, ftl_io_channel) ioch_queue;
|
||||||
|
|
||||||
@ -145,6 +149,9 @@ struct spdk_ftl_dev {
|
|||||||
|
|
||||||
/* Writer for GC IOs */
|
/* Writer for GC IOs */
|
||||||
struct ftl_writer writer_gc;
|
struct ftl_writer writer_gc;
|
||||||
|
|
||||||
|
/* Retry init sequence */
|
||||||
|
bool init_retry;
|
||||||
};
|
};
|
||||||
|
|
||||||
void ftl_apply_limits(struct spdk_ftl_dev *dev);
|
void ftl_apply_limits(struct spdk_ftl_dev *dev);
|
||||||
|
@ -132,8 +132,20 @@ static void
|
|||||||
dev_init_cb(struct spdk_ftl_dev *dev, void *_ctx, int status)
|
dev_init_cb(struct spdk_ftl_dev *dev, void *_ctx, int status)
|
||||||
{
|
{
|
||||||
struct ftl_dev_init_ctx *ctx = _ctx;
|
struct ftl_dev_init_ctx *ctx = _ctx;
|
||||||
|
int rc;
|
||||||
|
|
||||||
if (status) {
|
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);
|
free_dev(dev);
|
||||||
dev = NULL;
|
dev = NULL;
|
||||||
}
|
}
|
||||||
|
@ -47,4 +47,21 @@ struct ftl_superblock_md_region {
|
|||||||
uint64_t blk_sz;
|
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 */
|
#endif /* FTL_SB_COMMON_H */
|
||||||
|
@ -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->header.version = FTL_METADATA_VERSION_CURRENT;
|
||||||
sb->uuid = dev->conf.uuid;
|
sb->uuid = dev->conf.uuid;
|
||||||
sb->clean = 0;
|
sb->clean = 0;
|
||||||
|
dev->sb_shm->shm_clean = false;
|
||||||
|
|
||||||
/* Max 16 IO depth per band relocate */
|
/* Max 16 IO depth per band relocate */
|
||||||
sb->max_reloc_qdepth = 16;
|
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;
|
struct ftl_superblock *sb = dev->sb;
|
||||||
|
|
||||||
sb->clean = 0;
|
sb->clean = 0;
|
||||||
|
dev->sb_shm->shm_clean = false;
|
||||||
sb->header.crc = get_sb_crc(sb);
|
sb->header.crc = get_sb_crc(sb);
|
||||||
persist(dev, mngt, FTL_LAYOUT_REGION_TYPE_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);
|
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 */
|
/* Setup the layout of a superblock */
|
||||||
if (ftl_layout_setup_superblock(dev)) {
|
if (ftl_layout_setup_superblock(dev)) {
|
||||||
ftl_mngt_fail_step(mngt);
|
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;
|
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);
|
ftl_mngt_next_step(mngt);
|
||||||
}
|
}
|
||||||
|
@ -139,6 +139,7 @@ void
|
|||||||
ftl_mngt_finalize_startup(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt)
|
ftl_mngt_finalize_startup(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt)
|
||||||
{
|
{
|
||||||
dev->initialized = 1;
|
dev->initialized = 1;
|
||||||
|
dev->sb_shm->shm_ready = true;
|
||||||
|
|
||||||
ftl_writer_resume(&dev->writer_user);
|
ftl_writer_resume(&dev->writer_user);
|
||||||
ftl_writer_resume(&dev->writer_gc);
|
ftl_writer_resume(&dev->writer_gc);
|
||||||
|
@ -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
|
static void
|
||||||
ftl_md_create_shm(struct ftl_md *md, uint64_t vss_blksz, int flags)
|
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 specified, unlink before create a new SHM object */
|
||||||
if (flags & FTL_MD_CREATE_SHM_NEW) {
|
if (flags & FTL_MD_CREATE_SHM_NEW) {
|
||||||
if (md->shm_unlink(md->name) < 0 && errno != ENOENT) {
|
if (md->shm_unlink(md->name) < 0 && errno != ENOENT) {
|
||||||
|
ftl_md_invalidate_shm(md);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
open_flags += O_CREAT | O_TRUNC;
|
open_flags += O_CREAT | O_TRUNC;
|
||||||
@ -215,6 +225,7 @@ err_shm:
|
|||||||
md->shm_unlink(md->name);
|
md->shm_unlink(md->name);
|
||||||
md->shm_fd = -1;
|
md->shm_fd = -1;
|
||||||
}
|
}
|
||||||
|
ftl_md_invalidate_shm(md);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
Loading…
Reference in New Issue
Block a user