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 trims",
36 .action = ftl_mngt_trim_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
ftl_mngt_call_dev_shutdown(struct spdk_ftl_dev * dev,ftl_mngt_completion cb,void * cb_cntx)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