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" 10b872e29fSKozlowski Mateusz #include "ftl_internal.h" 1192b5ebe0SKozlowski Mateusz #include "ftl_debug.h" 12b872e29fSKozlowski Mateusz 13b872e29fSKozlowski Mateusz void 14b872e29fSKozlowski Mateusz ftl_mngt_check_conf(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt) 15b872e29fSKozlowski Mateusz { 16b872e29fSKozlowski Mateusz if (ftl_conf_is_valid(&dev->conf)) { 17b872e29fSKozlowski Mateusz ftl_mngt_next_step(mngt); 18b872e29fSKozlowski Mateusz } else { 19b872e29fSKozlowski Mateusz ftl_mngt_fail_step(mngt); 20b872e29fSKozlowski Mateusz } 21b872e29fSKozlowski Mateusz } 225022d8f3SKozlowski Mateusz 235022d8f3SKozlowski Mateusz static void 245022d8f3SKozlowski Mateusz user_clear_cb(struct spdk_ftl_dev *dev, struct ftl_md *md, int status) 255022d8f3SKozlowski Mateusz { 265022d8f3SKozlowski Mateusz struct ftl_mngt_process *mngt = md->owner.cb_ctx; 275022d8f3SKozlowski Mateusz 285022d8f3SKozlowski Mateusz if (status) { 295022d8f3SKozlowski Mateusz FTL_ERRLOG(ftl_mngt_get_dev(mngt), "FTL NV Cache: ERROR of clearing user cache data\n"); 305022d8f3SKozlowski Mateusz ftl_mngt_fail_step(mngt); 315022d8f3SKozlowski Mateusz } else { 325022d8f3SKozlowski Mateusz ftl_mngt_next_step(mngt); 335022d8f3SKozlowski Mateusz } 345022d8f3SKozlowski Mateusz } 355022d8f3SKozlowski Mateusz 365022d8f3SKozlowski Mateusz void 375022d8f3SKozlowski Mateusz ftl_mngt_scrub_nv_cache(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt) 385022d8f3SKozlowski Mateusz { 395022d8f3SKozlowski Mateusz struct ftl_layout_region *region = &dev->layout.region[FTL_LAYOUT_REGION_TYPE_DATA_NVC]; 405022d8f3SKozlowski Mateusz struct ftl_md *md = dev->layout.md[FTL_LAYOUT_REGION_TYPE_DATA_NVC]; 415022d8f3SKozlowski Mateusz union ftl_md_vss vss; 425022d8f3SKozlowski Mateusz 435022d8f3SKozlowski Mateusz FTL_NOTICELOG(dev, "First startup needs to scrub nv cache data region, this may take some time.\n"); 445022d8f3SKozlowski Mateusz FTL_NOTICELOG(dev, "Scrubbing %lluGiB\n", region->current.blocks * FTL_BLOCK_SIZE / GiB); 455022d8f3SKozlowski Mateusz 465022d8f3SKozlowski Mateusz /* Need to scrub user data, so in case of dirty shutdown the recovery won't 475022d8f3SKozlowski Mateusz * pull in data during open chunks recovery from any previous instance 485022d8f3SKozlowski Mateusz */ 495022d8f3SKozlowski Mateusz md->cb = user_clear_cb; 505022d8f3SKozlowski Mateusz md->owner.cb_ctx = mngt; 515022d8f3SKozlowski Mateusz 525022d8f3SKozlowski Mateusz vss.version.md_version = region->current.version; 535022d8f3SKozlowski Mateusz vss.nv_cache.lba = FTL_ADDR_INVALID; 545022d8f3SKozlowski Mateusz ftl_md_clear(md, 0, &vss); 555022d8f3SKozlowski Mateusz } 565022d8f3SKozlowski Mateusz 575022d8f3SKozlowski Mateusz void 585022d8f3SKozlowski Mateusz ftl_mngt_finalize_startup(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt) 595022d8f3SKozlowski Mateusz { 605022d8f3SKozlowski Mateusz dev->initialized = 1; 615022d8f3SKozlowski Mateusz 625022d8f3SKozlowski Mateusz ftl_mngt_next_step(mngt); 635022d8f3SKozlowski Mateusz } 6492b5ebe0SKozlowski Mateusz 6592b5ebe0SKozlowski Mateusz void 66*17147949SArtur Paszkiewicz ftl_mngt_start_core_poller(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt) 67*17147949SArtur Paszkiewicz { 68*17147949SArtur Paszkiewicz dev->core_poller = SPDK_POLLER_REGISTER(ftl_core_poller, dev, 0); 69*17147949SArtur Paszkiewicz if (!dev->core_poller) { 70*17147949SArtur Paszkiewicz FTL_ERRLOG(dev, "Unable to register core poller\n"); 71*17147949SArtur Paszkiewicz ftl_mngt_fail_step(mngt); 72*17147949SArtur Paszkiewicz return; 73*17147949SArtur Paszkiewicz } 74*17147949SArtur Paszkiewicz 75*17147949SArtur Paszkiewicz ftl_mngt_next_step(mngt); 76*17147949SArtur Paszkiewicz } 77*17147949SArtur Paszkiewicz 78*17147949SArtur Paszkiewicz void 79*17147949SArtur Paszkiewicz ftl_mngt_stop_core_poller(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt) 80*17147949SArtur Paszkiewicz { 81*17147949SArtur Paszkiewicz dev->halt = true; 82*17147949SArtur Paszkiewicz 83*17147949SArtur Paszkiewicz if (dev->core_poller) { 84*17147949SArtur Paszkiewicz ftl_mngt_continue_step(mngt); 85*17147949SArtur Paszkiewicz } else { 86*17147949SArtur Paszkiewicz ftl_mngt_next_step(mngt); 87*17147949SArtur Paszkiewicz } 88*17147949SArtur Paszkiewicz } 89*17147949SArtur Paszkiewicz 90*17147949SArtur Paszkiewicz void 9192b5ebe0SKozlowski Mateusz ftl_mngt_dump_stats(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt) 9292b5ebe0SKozlowski Mateusz { 9392b5ebe0SKozlowski Mateusz ftl_dev_dump_stats(dev); 9492b5ebe0SKozlowski Mateusz ftl_mngt_next_step(mngt); 9592b5ebe0SKozlowski Mateusz } 96