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