1b872e29fSKozlowski Mateusz /* SPDX-License-Identifier: BSD-3-Clause 2b872e29fSKozlowski Mateusz * Copyright (c) Intel Corporation. 3b872e29fSKozlowski Mateusz * All rights reserved. 4b872e29fSKozlowski Mateusz */ 5b872e29fSKozlowski Mateusz 6b872e29fSKozlowski Mateusz #include "ftl_core.h" 7b872e29fSKozlowski Mateusz #include "ftl_utils.h" 8b872e29fSKozlowski Mateusz #include "ftl_mngt.h" 9b872e29fSKozlowski Mateusz #include "ftl_mngt_steps.h" 10c7213b9cSArtur Paszkiewicz #include "ftl_band.h" 11b872e29fSKozlowski Mateusz #include "ftl_internal.h" 12a68a12a4SKozlowski Mateusz #include "ftl_nv_cache.h" 1392b5ebe0SKozlowski Mateusz #include "ftl_debug.h" 14b872e29fSKozlowski Mateusz 15b872e29fSKozlowski Mateusz void 16b872e29fSKozlowski Mateusz ftl_mngt_check_conf(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt) 17b872e29fSKozlowski Mateusz { 18b872e29fSKozlowski Mateusz if (ftl_conf_is_valid(&dev->conf)) { 19b872e29fSKozlowski Mateusz ftl_mngt_next_step(mngt); 20b872e29fSKozlowski Mateusz } else { 21b872e29fSKozlowski Mateusz ftl_mngt_fail_step(mngt); 22b872e29fSKozlowski Mateusz } 23b872e29fSKozlowski Mateusz } 245022d8f3SKozlowski Mateusz 25c7213b9cSArtur Paszkiewicz static int 26c7213b9cSArtur Paszkiewicz init_p2l_map_pool(struct spdk_ftl_dev *dev) 27c7213b9cSArtur Paszkiewicz { 28c7213b9cSArtur Paszkiewicz size_t p2l_pool_el_blks = spdk_divide_round_up(ftl_p2l_map_pool_elem_size(dev), FTL_BLOCK_SIZE); 29c7213b9cSArtur Paszkiewicz 30c7213b9cSArtur Paszkiewicz dev->p2l_pool = ftl_mempool_create(P2L_MEMPOOL_SIZE, 31c7213b9cSArtur Paszkiewicz p2l_pool_el_blks * FTL_BLOCK_SIZE, 32c7213b9cSArtur Paszkiewicz FTL_BLOCK_SIZE, 33c7213b9cSArtur Paszkiewicz SPDK_ENV_SOCKET_ID_ANY); 34c7213b9cSArtur Paszkiewicz if (!dev->p2l_pool) { 35c7213b9cSArtur Paszkiewicz return -ENOMEM; 36c7213b9cSArtur Paszkiewicz } 37c7213b9cSArtur Paszkiewicz 38c7213b9cSArtur Paszkiewicz return 0; 39c7213b9cSArtur Paszkiewicz } 40c7213b9cSArtur Paszkiewicz 41c7213b9cSArtur Paszkiewicz static int 42c7213b9cSArtur Paszkiewicz init_band_md_pool(struct spdk_ftl_dev *dev) 43c7213b9cSArtur Paszkiewicz { 44c7213b9cSArtur Paszkiewicz dev->band_md_pool = ftl_mempool_create(P2L_MEMPOOL_SIZE, 45c7213b9cSArtur Paszkiewicz sizeof(struct ftl_band_md), 46c7213b9cSArtur Paszkiewicz FTL_BLOCK_SIZE, 47c7213b9cSArtur Paszkiewicz SPDK_ENV_SOCKET_ID_ANY); 48c7213b9cSArtur Paszkiewicz if (!dev->band_md_pool) { 49c7213b9cSArtur Paszkiewicz return -ENOMEM; 50c7213b9cSArtur Paszkiewicz } 51c7213b9cSArtur Paszkiewicz 52c7213b9cSArtur Paszkiewicz return 0; 53c7213b9cSArtur Paszkiewicz } 54c7213b9cSArtur Paszkiewicz 55c7213b9cSArtur Paszkiewicz void 56c7213b9cSArtur Paszkiewicz ftl_mngt_init_mem_pools(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt) 57c7213b9cSArtur Paszkiewicz { 58c7213b9cSArtur Paszkiewicz if (init_p2l_map_pool(dev)) { 59c7213b9cSArtur Paszkiewicz ftl_mngt_fail_step(mngt); 60c7213b9cSArtur Paszkiewicz } 61c7213b9cSArtur Paszkiewicz 62c7213b9cSArtur Paszkiewicz if (init_band_md_pool(dev)) { 63c7213b9cSArtur Paszkiewicz ftl_mngt_fail_step(mngt); 64c7213b9cSArtur Paszkiewicz } 65c7213b9cSArtur Paszkiewicz 66c7213b9cSArtur Paszkiewicz ftl_mngt_next_step(mngt); 67c7213b9cSArtur Paszkiewicz } 68c7213b9cSArtur Paszkiewicz 69c7213b9cSArtur Paszkiewicz void 70c7213b9cSArtur Paszkiewicz ftl_mngt_deinit_mem_pools(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt) 71c7213b9cSArtur Paszkiewicz { 72c7213b9cSArtur Paszkiewicz if (dev->p2l_pool) { 73c7213b9cSArtur Paszkiewicz ftl_mempool_destroy(dev->p2l_pool); 74c7213b9cSArtur Paszkiewicz dev->p2l_pool = NULL; 75c7213b9cSArtur Paszkiewicz } 76c7213b9cSArtur Paszkiewicz 77c7213b9cSArtur Paszkiewicz if (dev->band_md_pool) { 78c7213b9cSArtur Paszkiewicz ftl_mempool_destroy(dev->band_md_pool); 79c7213b9cSArtur Paszkiewicz dev->band_md_pool = NULL; 80c7213b9cSArtur Paszkiewicz } 81c7213b9cSArtur Paszkiewicz 82c7213b9cSArtur Paszkiewicz ftl_mngt_next_step(mngt); 83c7213b9cSArtur Paszkiewicz } 84c7213b9cSArtur Paszkiewicz 85a68a12a4SKozlowski Mateusz void 86a68a12a4SKozlowski Mateusz ftl_mngt_init_nv_cache(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt) 87a68a12a4SKozlowski Mateusz { 88a68a12a4SKozlowski Mateusz if (ftl_nv_cache_init(dev)) { 89a68a12a4SKozlowski Mateusz FTL_ERRLOG(dev, "Unable to initialize persistent cache\n"); 90a68a12a4SKozlowski Mateusz ftl_mngt_fail_step(mngt); 91a68a12a4SKozlowski Mateusz return; 92a68a12a4SKozlowski Mateusz } 93a68a12a4SKozlowski Mateusz 94a68a12a4SKozlowski Mateusz ftl_mngt_next_step(mngt); 95a68a12a4SKozlowski Mateusz } 96a68a12a4SKozlowski Mateusz 97a68a12a4SKozlowski Mateusz void 98a68a12a4SKozlowski Mateusz ftl_mngt_deinit_nv_cache(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt) 99a68a12a4SKozlowski Mateusz { 100a68a12a4SKozlowski Mateusz ftl_nv_cache_deinit(dev); 101a68a12a4SKozlowski Mateusz ftl_mngt_next_step(mngt); 102a68a12a4SKozlowski Mateusz } 103a68a12a4SKozlowski Mateusz 1045022d8f3SKozlowski Mateusz static void 1055022d8f3SKozlowski Mateusz user_clear_cb(struct spdk_ftl_dev *dev, struct ftl_md *md, int status) 1065022d8f3SKozlowski Mateusz { 1075022d8f3SKozlowski Mateusz struct ftl_mngt_process *mngt = md->owner.cb_ctx; 1085022d8f3SKozlowski Mateusz 1095022d8f3SKozlowski Mateusz if (status) { 1105022d8f3SKozlowski Mateusz FTL_ERRLOG(ftl_mngt_get_dev(mngt), "FTL NV Cache: ERROR of clearing user cache data\n"); 1115022d8f3SKozlowski Mateusz ftl_mngt_fail_step(mngt); 1125022d8f3SKozlowski Mateusz } else { 1135022d8f3SKozlowski Mateusz ftl_mngt_next_step(mngt); 1145022d8f3SKozlowski Mateusz } 1155022d8f3SKozlowski Mateusz } 1165022d8f3SKozlowski Mateusz 1175022d8f3SKozlowski Mateusz void 1185022d8f3SKozlowski Mateusz ftl_mngt_scrub_nv_cache(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt) 1195022d8f3SKozlowski Mateusz { 1205022d8f3SKozlowski Mateusz struct ftl_layout_region *region = &dev->layout.region[FTL_LAYOUT_REGION_TYPE_DATA_NVC]; 1215022d8f3SKozlowski Mateusz struct ftl_md *md = dev->layout.md[FTL_LAYOUT_REGION_TYPE_DATA_NVC]; 1225022d8f3SKozlowski Mateusz union ftl_md_vss vss; 1235022d8f3SKozlowski Mateusz 1245022d8f3SKozlowski Mateusz FTL_NOTICELOG(dev, "First startup needs to scrub nv cache data region, this may take some time.\n"); 1255022d8f3SKozlowski Mateusz FTL_NOTICELOG(dev, "Scrubbing %lluGiB\n", region->current.blocks * FTL_BLOCK_SIZE / GiB); 1265022d8f3SKozlowski Mateusz 1275022d8f3SKozlowski Mateusz /* Need to scrub user data, so in case of dirty shutdown the recovery won't 1285022d8f3SKozlowski Mateusz * pull in data during open chunks recovery from any previous instance 1295022d8f3SKozlowski Mateusz */ 1305022d8f3SKozlowski Mateusz md->cb = user_clear_cb; 1315022d8f3SKozlowski Mateusz md->owner.cb_ctx = mngt; 1325022d8f3SKozlowski Mateusz 1335022d8f3SKozlowski Mateusz vss.version.md_version = region->current.version; 1345022d8f3SKozlowski Mateusz vss.nv_cache.lba = FTL_ADDR_INVALID; 1355022d8f3SKozlowski Mateusz ftl_md_clear(md, 0, &vss); 1365022d8f3SKozlowski Mateusz } 1375022d8f3SKozlowski Mateusz 1385022d8f3SKozlowski Mateusz void 1395022d8f3SKozlowski Mateusz ftl_mngt_finalize_startup(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt) 1405022d8f3SKozlowski Mateusz { 1415022d8f3SKozlowski Mateusz dev->initialized = 1; 142*f45c0075SArtur Paszkiewicz dev->sb_shm->shm_ready = true; 1435022d8f3SKozlowski Mateusz 14431cf6336SKozlowski Mateusz ftl_writer_resume(&dev->writer_user); 14531cf6336SKozlowski Mateusz ftl_writer_resume(&dev->writer_gc); 146a68a12a4SKozlowski Mateusz ftl_nv_cache_resume(&dev->nv_cache); 147a68a12a4SKozlowski Mateusz 1485022d8f3SKozlowski Mateusz ftl_mngt_next_step(mngt); 1495022d8f3SKozlowski Mateusz } 15092b5ebe0SKozlowski Mateusz 15192b5ebe0SKozlowski Mateusz void 15217147949SArtur Paszkiewicz ftl_mngt_start_core_poller(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt) 15317147949SArtur Paszkiewicz { 15417147949SArtur Paszkiewicz dev->core_poller = SPDK_POLLER_REGISTER(ftl_core_poller, dev, 0); 15517147949SArtur Paszkiewicz if (!dev->core_poller) { 15617147949SArtur Paszkiewicz FTL_ERRLOG(dev, "Unable to register core poller\n"); 15717147949SArtur Paszkiewicz ftl_mngt_fail_step(mngt); 15817147949SArtur Paszkiewicz return; 15917147949SArtur Paszkiewicz } 16017147949SArtur Paszkiewicz 16117147949SArtur Paszkiewicz ftl_mngt_next_step(mngt); 16217147949SArtur Paszkiewicz } 16317147949SArtur Paszkiewicz 16417147949SArtur Paszkiewicz void 16517147949SArtur Paszkiewicz ftl_mngt_stop_core_poller(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt) 16617147949SArtur Paszkiewicz { 16717147949SArtur Paszkiewicz dev->halt = true; 16817147949SArtur Paszkiewicz 16917147949SArtur Paszkiewicz if (dev->core_poller) { 17017147949SArtur Paszkiewicz ftl_mngt_continue_step(mngt); 17117147949SArtur Paszkiewicz } else { 17217147949SArtur Paszkiewicz ftl_mngt_next_step(mngt); 17317147949SArtur Paszkiewicz } 17417147949SArtur Paszkiewicz } 17517147949SArtur Paszkiewicz 17617147949SArtur Paszkiewicz void 17792b5ebe0SKozlowski Mateusz ftl_mngt_dump_stats(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt) 17892b5ebe0SKozlowski Mateusz { 17988d1c3a6SKozlowski Mateusz ftl_dev_dump_bands(dev); 18092b5ebe0SKozlowski Mateusz ftl_dev_dump_stats(dev); 18192b5ebe0SKozlowski Mateusz ftl_mngt_next_step(mngt); 18292b5ebe0SKozlowski Mateusz } 183