Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause
2 : : * Copyright 2023 Solidigm All Rights Reserved
3 : : */
4 : :
5 : : #include "ftl_nvc_bdev_common.h"
6 : : #include "ftl_nvc_dev.h"
7 : : #include "ftl_core.h"
8 : : #include "ftl_layout.h"
9 : : #include "utils/ftl_layout_tracker_bdev.h"
10 : : #include "mngt/ftl_mngt.h"
11 : :
12 : : bool
13 : 0 : ftl_nvc_bdev_common_is_chunk_active(struct spdk_ftl_dev *dev, uint64_t chunk_offset)
14 : : {
15 : 0 : const struct ftl_layout_tracker_bdev_region_props *reg_free = ftl_layout_tracker_bdev_insert_region(
16 [ # # # # ]: 0 : dev->nvc_layout_tracker, FTL_LAYOUT_REGION_TYPE_INVALID, 0, chunk_offset,
17 [ # # # # : 0 : dev->layout.nvc.chunk_data_blocks);
# # # # ]
18 : :
19 [ # # # # : 0 : assert(!reg_free || reg_free->type == FTL_LAYOUT_REGION_TYPE_FREE);
# # # # #
# ]
20 : 0 : return reg_free != NULL;
21 : : }
22 : :
23 : : static void
24 : 0 : md_region_setup(struct spdk_ftl_dev *dev, enum ftl_layout_region_type reg_type,
25 : : struct ftl_layout_region *region)
26 : : {
27 [ # # # # ]: 0 : assert(region);
28 [ # # # # ]: 0 : region->type = reg_type;
29 [ # # # # ]: 0 : region->mirror_type = FTL_LAYOUT_REGION_TYPE_INVALID;
30 [ # # # # ]: 0 : region->name = ftl_md_region_name(reg_type);
31 : :
32 [ # # # # : 0 : region->bdev_desc = dev->nv_cache.bdev_desc;
# # # # #
# ]
33 [ # # # # : 0 : region->ioch = dev->nv_cache.cache_ioch;
# # # # #
# ]
34 [ # # # # : 0 : region->vss_blksz = dev->nv_cache.md_size;
# # # # #
# ]
35 : 0 : }
36 : :
37 : : int
38 : 0 : ftl_nvc_bdev_common_region_create(struct spdk_ftl_dev *dev, enum ftl_layout_region_type reg_type,
39 : : uint32_t reg_version, size_t reg_blks)
40 : : {
41 : : const struct ftl_layout_tracker_bdev_region_props *reg_props;
42 : :
43 [ # # # # ]: 0 : assert(reg_type < FTL_LAYOUT_REGION_TYPE_MAX);
44 : 0 : reg_blks = ftl_md_region_align_blocks(dev, reg_blks);
45 : :
46 [ # # # # ]: 0 : reg_props = ftl_layout_tracker_bdev_add_region(dev->nvc_layout_tracker, reg_type, reg_version,
47 : 0 : reg_blks, 0);
48 [ # # ]: 0 : if (!reg_props) {
49 : 0 : return -1;
50 : : }
51 [ # # # # : 0 : assert(reg_props->type == reg_type);
# # # # ]
52 [ # # # # : 0 : assert(reg_props->ver == reg_version);
# # # # ]
53 [ # # # # : 0 : assert(reg_props->blk_sz == reg_blks);
# # # # ]
54 [ # # # # : 0 : assert(reg_props->blk_offs + reg_blks <= dev->layout.nvc.total_blocks);
# # # # #
# # # # #
# # ]
55 : 0 : return 0;
56 : 0 : }
57 : :
58 : : int
59 : 0 : ftl_nvc_bdev_common_region_open(struct spdk_ftl_dev *dev, enum ftl_layout_region_type reg_type,
60 : : uint32_t reg_version,
61 : : size_t entry_size, size_t entry_count, struct ftl_layout_region *region)
62 : : {
63 : 0 : const struct ftl_layout_tracker_bdev_region_props *reg_search_ctx = NULL;
64 : 0 : uint64_t reg_blks = ftl_md_region_blocks(dev, entry_size * entry_count);
65 : :
66 [ # # # # ]: 0 : assert(reg_type < FTL_LAYOUT_REGION_TYPE_MAX);
67 : :
68 : 0 : while (true) {
69 [ # # # # ]: 0 : ftl_layout_tracker_bdev_find_next_region(dev->nvc_layout_tracker, reg_type, ®_search_ctx);
70 [ # # # # : 0 : if (!reg_search_ctx || reg_search_ctx->ver == reg_version) {
# # # # ]
71 : 0 : break;
72 : : }
73 : : }
74 : :
75 [ # # # # : 0 : if (!reg_search_ctx || reg_search_ctx->blk_sz < reg_blks) {
# # # # ]
76 : : /* Region not found or insufficient space */
77 : 0 : return -1;
78 : : }
79 : :
80 [ # # ]: 0 : if (!region) {
81 : 0 : return 0;
82 : : }
83 : :
84 : 0 : md_region_setup(dev, reg_type, region);
85 : :
86 [ # # # # : 0 : region->entry_size = entry_size / FTL_BLOCK_SIZE;
# # ]
87 [ # # # # ]: 0 : region->num_entries = entry_count;
88 : :
89 [ # # # # : 0 : region->current.version = reg_version;
# # ]
90 [ # # # # : 0 : region->current.offset = reg_search_ctx->blk_offs;
# # # # #
# ]
91 [ # # # # : 0 : region->current.blocks = reg_search_ctx->blk_sz;
# # # # #
# ]
92 : :
93 : 0 : return 0;
94 : 0 : }
|