xref: /spdk/lib/ftl/mngt/ftl_mngt_shutdown.c (revision 45a053c5777494f4e8ce4bc1191c9de3920377f7)
1 /*   SPDX-License-Identifier: BSD-3-Clause
2  *   Copyright (C) 2022 Intel Corporation.
3  *   All rights reserved.
4  */
5 
6 #include "ftl_core.h"
7 #include "ftl_mngt.h"
8 #include "ftl_mngt_steps.h"
9 
10 /*
11  * Steps executed during clean shutdown - includes persisting metadata and rolling
12  * back any setup steps executed during startup (closing bdevs, io channels, etc)
13  */
14 static const struct ftl_mngt_process_desc desc_shutdown = {
15 	.name = "FTL shutdown",
16 	.error_handler = ftl_mngt_rollback_device,
17 	.steps = {
18 		{
19 			.name = "Deinit core IO channel",
20 			.action = ftl_mngt_deinit_io_channel
21 		},
22 		{
23 			.name = "Unregister IO device",
24 			.action = ftl_mngt_unregister_io_device
25 		},
26 		{
27 			.name = "Stop core poller",
28 			.action = ftl_mngt_stop_core_poller
29 		},
30 		{
31 			.name = "Persist L2P",
32 			.action = ftl_mngt_persist_l2p
33 		},
34 		{
35 			.name = "Finish L2P unmaps",
36 			.action = ftl_mngt_unmap_l2p,
37 		},
38 		{
39 			.name = "Persist metadata",
40 			.action = ftl_mngt_persist_md
41 		},
42 		{
43 			.name = "Set FTL clean state",
44 			.action = ftl_mngt_set_clean
45 		},
46 		{
47 			.name = "Dump statistics",
48 			.action = ftl_mngt_dump_stats
49 		},
50 		{
51 			.name = "Deinitialize L2P",
52 			.action = ftl_mngt_deinit_l2p
53 		},
54 		{
55 			.name = "Deinitialize P2L checkpointing",
56 			.action = ftl_mngt_p2l_deinit_ckpt
57 		},
58 		{
59 			.name = "Rollback FTL device",
60 			.action = ftl_mngt_rollback_device
61 		},
62 		{}
63 	}
64 };
65 
66 /*
67  * Steps executed during fast clean shutdown (shutting down to shared memory). Utilizes
68  * minimum amount of metadata persistence and rolls back any setup steps executed during
69  * startup (closing bdevs, io channels, etc)
70  */
71 static const struct ftl_mngt_process_desc desc_fast_shutdown = {
72 	.name = "FTL fast shutdown",
73 	.steps = {
74 		{
75 			.name = "Deinit core IO channel",
76 			.action = ftl_mngt_deinit_io_channel
77 		},
78 		{
79 			.name = "Unregister IO device",
80 			.action = ftl_mngt_unregister_io_device
81 		},
82 		{
83 			.name = "Stop core poller",
84 			.action = ftl_mngt_stop_core_poller
85 		},
86 		{
87 			.name = "Fast persist metadata",
88 			.action = ftl_mngt_fast_persist_md
89 		},
90 		{
91 			.name = "Set FTL SHM clean state",
92 			.action = ftl_mngt_set_shm_clean
93 		},
94 		{
95 			.name = "Dump statistics",
96 			.action = ftl_mngt_dump_stats
97 		},
98 		{
99 			.name = "Deinitialize L2P",
100 			.action = ftl_mngt_deinit_l2p
101 		},
102 		{
103 			.name = "Deinitialize P2L checkpointing",
104 			.action = ftl_mngt_p2l_deinit_ckpt
105 		},
106 		{
107 			.name = "Rollback FTL device",
108 			.action = ftl_mngt_rollback_device
109 		},
110 		{}
111 	}
112 };
113 
114 int
115 ftl_mngt_call_dev_shutdown(struct spdk_ftl_dev *dev, ftl_mngt_completion cb, void *cb_cntx)
116 {
117 	const struct ftl_mngt_process_desc *pdesc;
118 
119 	if (dev->conf.fast_shutdown) {
120 		pdesc = &desc_fast_shutdown;
121 	} else {
122 		pdesc = &desc_shutdown;
123 	}
124 	return ftl_mngt_process_execute(dev, pdesc, cb, cb_cntx);
125 }
126