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:
parent
764a3675a9
commit
0e0f3d9af2
@ -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)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user