Branch data 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 : : }
|