xref: /spdk/lib/ftl/mngt/ftl_mngt_misc.c (revision 17147949cf81a6e3a45fb773f0b4c0cf8df5cd4f)
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