xref: /spdk/test/unit/lib/ftl/ftl_l2p/ftl_l2p_ut.c (revision 8afdeef3becfe9409cc9e7372bd0bc10e8b7d46d)
1 /*   SPDX-License-Identifier: BSD-3-Clause
2  *   Copyright (C) 2022 Intel Corporation.
3  *   All rights reserved.
4  */
5 
6 #include "spdk/stdinc.h"
7 
8 #include "spdk_internal/cunit.h"
9 #include "common/lib/test_env.c"
10 
11 #include "ftl/ftl_core.h"
12 
13 #define L2P_TABLE_SIZE 1024
14 
15 static struct spdk_ftl_dev *g_dev;
16 
17 static struct spdk_ftl_dev *
18 test_alloc_dev(size_t size)
19 {
20 	struct spdk_ftl_dev *dev;
21 
22 	dev = calloc(1, sizeof(*dev));
23 
24 	dev->num_lbas = L2P_TABLE_SIZE;
25 	dev->l2p = calloc(L2P_TABLE_SIZE, size);
26 	dev->layout.l2p.addr_size = size;
27 
28 	if (size > sizeof(uint32_t)) {
29 		dev->layout.base.total_blocks = ~(~0ULL << 33);
30 	} else {
31 		dev->layout.base.total_blocks = 1024;
32 	}
33 
34 	return dev;
35 }
36 
37 static int
38 setup_l2p_64bit(void)
39 {
40 	g_dev = test_alloc_dev(sizeof(uint64_t));
41 	return 0;
42 }
43 
44 static void
45 clean_l2p(void)
46 {
47 	size_t l2p_elem_size;
48 
49 	if (ftl_addr_packed(g_dev)) {
50 		l2p_elem_size = sizeof(uint32_t);
51 	} else {
52 		l2p_elem_size = sizeof(uint64_t);
53 	}
54 	memset(g_dev->l2p, 0, g_dev->num_lbas * l2p_elem_size);
55 }
56 
57 static int
58 cleanup(void)
59 {
60 	free(g_dev->l2p);
61 	free(g_dev);
62 	g_dev = NULL;
63 	return 0;
64 }
65 
66 void
67 ftl_l2p_set(struct spdk_ftl_dev *dev, uint64_t lba, ftl_addr addr)
68 {
69 	((uint64_t *)dev->l2p)[lba] = addr;
70 }
71 
72 ftl_addr
73 ftl_l2p_get(struct spdk_ftl_dev *dev, uint64_t lba)
74 {
75 	return ((uint64_t *)dev->l2p)[lba];
76 }
77 
78 static void
79 test_addr_cached(void)
80 {
81 	ftl_addr addr;
82 	size_t i;
83 
84 	/* Set every other LBA is cached */
85 	for (i = 0; i < L2P_TABLE_SIZE; i += 2) {
86 		addr = ftl_addr_from_nvc_offset(g_dev, i);
87 		ftl_l2p_set(g_dev, i, addr);
88 	}
89 
90 	/* Check every even LBA is cached while others are not */
91 	for (i = 0; i < L2P_TABLE_SIZE; ++i) {
92 		addr = ftl_l2p_get(g_dev, i);
93 
94 		if (i % 2 == 0) {
95 			CU_ASSERT_TRUE(ftl_addr_in_nvc(g_dev, addr));
96 			CU_ASSERT_EQUAL(ftl_addr_to_nvc_offset(g_dev, addr), i);
97 		} else {
98 			CU_ASSERT_FALSE(ftl_addr_in_nvc(g_dev, addr));
99 		}
100 	}
101 	clean_l2p();
102 }
103 
104 int
105 main(int argc, char **argv)
106 {
107 	CU_pSuite suite64 = NULL;
108 	unsigned int num_failures;
109 
110 	CU_initialize_registry();
111 
112 	suite64 = CU_add_suite("ftl_addr64_suite", setup_l2p_64bit, cleanup);
113 
114 	CU_ADD_TEST(suite64, test_addr_cached);
115 
116 	num_failures = spdk_ut_run_tests(argc, argv, NULL);
117 	CU_cleanup_registry();
118 
119 	return num_failures;
120 }
121