Line data Source code
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
115 0 : 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 0 : if (dev->conf.fast_shutdown) {
120 0 : pdesc = &desc_fast_shutdown;
121 : } else {
122 0 : pdesc = &desc_shutdown;
123 : }
124 0 : return ftl_mngt_process_execute(dev, pdesc, cb, cb_cntx);
125 : }
|