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 "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 : 3 : test_alloc_dev(size_t size) 19 : : { 20 : : struct spdk_ftl_dev *dev; 21 : : 22 : 3 : dev = calloc(1, sizeof(*dev)); 23 : : 24 : 3 : dev->num_lbas = L2P_TABLE_SIZE; 25 : 3 : dev->l2p = calloc(L2P_TABLE_SIZE, size); 26 : 3 : dev->layout.l2p.addr_size = size; 27 : : 28 [ + - ]: 3 : if (size > sizeof(uint32_t)) { 29 : 3 : dev->layout.base.total_blocks = ~(~0ULL << 33); 30 : : } else { 31 : 0 : dev->layout.base.total_blocks = 1024; 32 : : } 33 : : 34 : 3 : return dev; 35 : : } 36 : : 37 : : static int 38 : 3 : setup_l2p_64bit(void) 39 : : { 40 : 3 : g_dev = test_alloc_dev(sizeof(uint64_t)); 41 : 3 : return 0; 42 : : } 43 : : 44 : : static void 45 : 3 : clean_l2p(void) 46 : : { 47 : : size_t l2p_elem_size; 48 : : 49 [ - + ]: 3 : if (ftl_addr_packed(g_dev)) { 50 : 0 : l2p_elem_size = sizeof(uint32_t); 51 : : } else { 52 : 3 : l2p_elem_size = sizeof(uint64_t); 53 : : } 54 [ - + ]: 3 : memset(g_dev->l2p, 0, g_dev->num_lbas * l2p_elem_size); 55 : 3 : } 56 : : 57 : : static int 58 : 3 : cleanup(void) 59 : : { 60 : 3 : free(g_dev->l2p); 61 : 3 : free(g_dev); 62 : 3 : g_dev = NULL; 63 : 3 : return 0; 64 : : } 65 : : 66 : : void 67 : 1536 : ftl_l2p_set(struct spdk_ftl_dev *dev, uint64_t lba, ftl_addr addr) 68 : : { 69 : 1536 : ((uint64_t *)dev->l2p)[lba] = addr; 70 : 1536 : } 71 : : 72 : : ftl_addr 73 : 3072 : ftl_l2p_get(struct spdk_ftl_dev *dev, uint64_t lba) 74 : : { 75 : 3072 : return ((uint64_t *)dev->l2p)[lba]; 76 : : } 77 : : 78 : : static void 79 : 3 : test_addr_cached(void) 80 : : { 81 : : ftl_addr addr; 82 : : size_t i; 83 : : 84 : : /* Set every other LBA is cached */ 85 [ + + ]: 1539 : for (i = 0; i < L2P_TABLE_SIZE; i += 2) { 86 : 1536 : addr = ftl_addr_from_nvc_offset(g_dev, i); 87 : 1536 : ftl_l2p_set(g_dev, i, addr); 88 : : } 89 : : 90 : : /* Check every even LBA is cached while others are not */ 91 [ + + ]: 3075 : for (i = 0; i < L2P_TABLE_SIZE; ++i) { 92 : 3072 : addr = ftl_l2p_get(g_dev, i); 93 : : 94 [ + + ]: 3072 : if (i % 2 == 0) { 95 : 1536 : CU_ASSERT_TRUE(ftl_addr_in_nvc(g_dev, addr)); 96 : 1536 : CU_ASSERT_EQUAL(ftl_addr_to_nvc_offset(g_dev, addr), i); 97 : : } else { 98 : 1536 : CU_ASSERT_FALSE(ftl_addr_in_nvc(g_dev, addr)); 99 : : } 100 : : } 101 : 3 : clean_l2p(); 102 : 3 : } 103 : : 104 : : int 105 : 3 : main(int argc, char **argv) 106 : : { 107 : 3 : CU_pSuite suite64 = NULL; 108 : : unsigned int num_failures; 109 : : 110 : 3 : CU_initialize_registry(); 111 : : 112 : 3 : suite64 = CU_add_suite("ftl_addr64_suite", setup_l2p_64bit, cleanup); 113 : : 114 : 3 : CU_ADD_TEST(suite64, test_addr_cached); 115 : : 116 : 3 : num_failures = spdk_ut_run_tests(argc, argv, NULL); 117 : 3 : CU_cleanup_registry(); 118 : : 119 : 3 : return num_failures; 120 : : }