From 0e0f3d9af21452a8b438ca44b42fbf223ca63155 Mon Sep 17 00:00:00 2001 From: Kozlowski Mateusz Date: Mon, 30 May 2022 11:25:58 +0200 Subject: [PATCH] FTL: Shared memory recovery Adds valid map and L2P restroration for shared memory (crash) recovery. Signed-off-by: Kozlowski Mateusz Signed-off-by: Artur Paszkiewicz Change-Id: Ia4e0cc6cd552ea61dca8985a26aa55c84a1233db Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/13369 Tested-by: SPDK CI Jenkins Community-CI: Mellanox Build Bot Reviewed-by: Jim Harris Reviewed-by: Ben Walker --- lib/ftl/mngt/ftl_mngt_recovery.c | 42 ++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/lib/ftl/mngt/ftl_mngt_recovery.c b/lib/ftl/mngt/ftl_mngt_recovery.c index c64308660..43e9658a7 100644 --- a/lib/ftl/mngt/ftl_mngt_recovery.c +++ b/lib/ftl/mngt/ftl_mngt_recovery.c @@ -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) {