FTL: Shared memory recovery

Adds valid map and L2P restroration for shared memory (crash) recovery.

Signed-off-by: Kozlowski Mateusz <mateusz.kozlowski@intel.com>
Signed-off-by: Artur Paszkiewicz <artur.paszkiewicz@intel.com>
Change-Id: Ia4e0cc6cd552ea61dca8985a26aa55c84a1233db
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/13369
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Mellanox Build Bot
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
This commit is contained in:
Kozlowski Mateusz 2022-05-30 11:25:58 +02:00 committed by Jim Harris
parent 764a3675a9
commit 0e0f3d9af2

View File

@ -37,6 +37,7 @@ struct ftl_mngt_recovery_ctx {
};
static const struct ftl_mngt_process_desc g_desc_recovery;
static const struct ftl_mngt_process_desc g_desc_recovery_shm;
static void
recovery_iter_advance(struct spdk_ftl_dev *dev, struct ftl_mngt_recovery_ctx *ctx)
@ -215,6 +216,23 @@ ftl_mngt_recover_seq_id(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt)
ftl_mngt_next_step(mngt);
}
static void
ftl_mngt_restore_valid_counters(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt)
{
ftl_valid_map_load_state(dev);
ftl_mngt_next_step(mngt);
}
static void
ftl_mngt_recovery_shm_l2p(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt)
{
if (ftl_fast_recovery(dev)) {
ftl_mngt_call_process(mngt, &g_desc_recovery_shm);
} else {
ftl_mngt_skip_step(mngt);
}
}
/*
* Loading of FTL after dirty shutdown. Recovers metadata, L2P, decides on amount of recovery
* iterations to be executed (dependent on ratio of L2P cache size and total L2P size)
@ -245,6 +263,10 @@ static const struct ftl_mngt_process_desc g_desc_recovery = {
.action = ftl_mngt_init_l2p,
.cleanup = ftl_mngt_deinit_l2p
},
{
.name = "Recover L2P from shared memory",
.action = ftl_mngt_recovery_shm_l2p,
},
{
.name = "Finalize band initialization",
.action = ftl_mngt_finalize_init_bands,
@ -266,6 +288,26 @@ static const struct ftl_mngt_process_desc g_desc_recovery = {
}
};
/*
* Shared memory specific steps for dirty shutdown recovery - main task is rebuilding the state of
* L2P cache (paged in/out status, dirtiness etc. of individual pages).
*/
static const struct ftl_mngt_process_desc g_desc_recovery_shm = {
.name = "FTL recovery from SHM",
.ctx_size = sizeof(struct ftl_mngt_recovery_ctx),
.steps = {
{
.name = "Restore L2P from SHM",
.action = ftl_mngt_restore_l2p,
},
{
.name = "Restore valid maps counters",
.action = ftl_mngt_restore_valid_counters,
},
{}
}
};
void
ftl_mngt_recover(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt)
{