1488570ebSJim Harris /* SPDX-License-Identifier: BSD-3-Clause 2a6dbe372Spaul luse * Copyright (C) 2016 Intel Corporation. 3c66b68e9SAleksey Marchuk * Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. 4c9fb57a2SSeth Howell * All rights reserved. 5c9fb57a2SSeth Howell */ 6c9fb57a2SSeth Howell 7c9fb57a2SSeth Howell #include "spdk/stdinc.h" 8c9fb57a2SSeth Howell 9c9fb57a2SSeth Howell #include "spdk_internal/mock.h" 10c9fb57a2SSeth Howell 11c9fb57a2SSeth Howell #include "spdk/env.h" 12ef8dfe11SBen Walker #include "spdk/queue.h" 13a4968634SWojciech Malikowski #include "spdk/util.h" 14bd7c9e07SJim Harris #include "spdk/string.h" 15c9fb57a2SSeth Howell 16f74107fbSShuhei Matsumoto static uint32_t g_ut_num_cores; 17f74107fbSShuhei Matsumoto static bool *g_ut_cores; 18f74107fbSShuhei Matsumoto 19f74107fbSShuhei Matsumoto void allocate_cores(uint32_t num_cores); 20f74107fbSShuhei Matsumoto void free_cores(void); 21f74107fbSShuhei Matsumoto 22c9fb57a2SSeth Howell DEFINE_STUB(spdk_process_is_primary, bool, (void), true) 23f56b2300SBen Walker DEFINE_STUB(spdk_memzone_lookup, void *, (const char *name), NULL) 24cdffd225SDarek Stojaczyk DEFINE_STUB_V(spdk_pci_driver_register, (const char *name, struct spdk_pci_id *id_table, 25cdffd225SDarek Stojaczyk uint32_t flags)); 26576f08f7SDarek Stojaczyk DEFINE_STUB(spdk_pci_nvme_get_driver, struct spdk_pci_driver *, (void), NULL) 2741130653SDarek Stojaczyk DEFINE_STUB(spdk_pci_ioat_get_driver, struct spdk_pci_driver *, (void), NULL) 2876a7517cSDarek Stojaczyk DEFINE_STUB(spdk_pci_virtio_get_driver, struct spdk_pci_driver *, (void), NULL) 2942ec403bSJim Harris DEFINE_STUB(spdk_env_thread_launch_pinned, int, (uint32_t core, thread_start_fn fn, void *arg), 0); 3042ec403bSJim Harris DEFINE_STUB_V(spdk_env_thread_wait_all, (void)); 3142ec403bSJim Harris DEFINE_STUB_V(spdk_env_opts_init, (struct spdk_env_opts *opts)); 3242ec403bSJim Harris DEFINE_STUB(spdk_env_init, int, (const struct spdk_env_opts *opts), 0); 3342ec403bSJim Harris DEFINE_STUB_V(spdk_env_fini, (void)); 342ef611c1SJim Harris DEFINE_STUB(spdk_env_get_first_numa_id, int32_t, (void), 0); 352ef611c1SJim Harris DEFINE_STUB(spdk_env_get_next_numa_id, int32_t, (int32_t prev_numa_id), INT32_MAX); 3642d1bd28SJim Harris DEFINE_STUB(spdk_env_get_last_numa_id, int32_t, (void), 0); 37f74107fbSShuhei Matsumoto 38f74107fbSShuhei Matsumoto void 39f74107fbSShuhei Matsumoto allocate_cores(uint32_t num_cores) 40f74107fbSShuhei Matsumoto { 41f74107fbSShuhei Matsumoto uint32_t i; 42f74107fbSShuhei Matsumoto 43f74107fbSShuhei Matsumoto g_ut_num_cores = num_cores; 44f74107fbSShuhei Matsumoto 45f74107fbSShuhei Matsumoto g_ut_cores = calloc(num_cores, sizeof(bool)); 46f74107fbSShuhei Matsumoto assert(g_ut_cores != NULL); 47f74107fbSShuhei Matsumoto 48f74107fbSShuhei Matsumoto for (i = 0; i < num_cores; i++) { 49f74107fbSShuhei Matsumoto g_ut_cores[i] = true; 50f74107fbSShuhei Matsumoto } 51f74107fbSShuhei Matsumoto } 52f74107fbSShuhei Matsumoto 53f74107fbSShuhei Matsumoto void 54f74107fbSShuhei Matsumoto free_cores(void) 55f74107fbSShuhei Matsumoto { 56f74107fbSShuhei Matsumoto free(g_ut_cores); 57f74107fbSShuhei Matsumoto g_ut_cores = NULL; 58f74107fbSShuhei Matsumoto g_ut_num_cores = 0; 59f74107fbSShuhei Matsumoto } 60f74107fbSShuhei Matsumoto 61f74107fbSShuhei Matsumoto static uint32_t 62f74107fbSShuhei Matsumoto ut_get_next_core(uint32_t i) 63f74107fbSShuhei Matsumoto { 64f74107fbSShuhei Matsumoto i++; 65f74107fbSShuhei Matsumoto 66f74107fbSShuhei Matsumoto while (i < g_ut_num_cores) { 67f74107fbSShuhei Matsumoto if (!g_ut_cores[i]) { 68f74107fbSShuhei Matsumoto i++; 69f74107fbSShuhei Matsumoto continue; 70f74107fbSShuhei Matsumoto } 71f74107fbSShuhei Matsumoto break; 72f74107fbSShuhei Matsumoto } 73f74107fbSShuhei Matsumoto 74f74107fbSShuhei Matsumoto if (i < g_ut_num_cores) { 75f74107fbSShuhei Matsumoto return i; 76f74107fbSShuhei Matsumoto } else { 77f74107fbSShuhei Matsumoto return UINT32_MAX; 78f74107fbSShuhei Matsumoto } 79f74107fbSShuhei Matsumoto } 80f74107fbSShuhei Matsumoto 81f74107fbSShuhei Matsumoto uint32_t 82f74107fbSShuhei Matsumoto spdk_env_get_first_core(void) 83f74107fbSShuhei Matsumoto { 84f74107fbSShuhei Matsumoto return ut_get_next_core(-1); 85f74107fbSShuhei Matsumoto } 86f74107fbSShuhei Matsumoto 87f74107fbSShuhei Matsumoto uint32_t 88f74107fbSShuhei Matsumoto spdk_env_get_next_core(uint32_t prev_core) 89f74107fbSShuhei Matsumoto { 90f74107fbSShuhei Matsumoto return ut_get_next_core(prev_core); 91f74107fbSShuhei Matsumoto } 92f74107fbSShuhei Matsumoto 93f74107fbSShuhei Matsumoto uint32_t 94f74107fbSShuhei Matsumoto spdk_env_get_core_count(void) 95f74107fbSShuhei Matsumoto { 96f74107fbSShuhei Matsumoto return g_ut_num_cores; 97f74107fbSShuhei Matsumoto } 98f74107fbSShuhei Matsumoto 99f74107fbSShuhei Matsumoto uint32_t 100f74107fbSShuhei Matsumoto spdk_env_get_last_core(void) 101f74107fbSShuhei Matsumoto { 102f74107fbSShuhei Matsumoto uint32_t i; 103f74107fbSShuhei Matsumoto uint32_t last_core = UINT32_MAX; 104f74107fbSShuhei Matsumoto 105f74107fbSShuhei Matsumoto SPDK_ENV_FOREACH_CORE(i) { 106f74107fbSShuhei Matsumoto last_core = i; 107f74107fbSShuhei Matsumoto } 108f74107fbSShuhei Matsumoto 109f74107fbSShuhei Matsumoto return last_core; 110f74107fbSShuhei Matsumoto } 111f74107fbSShuhei Matsumoto 112f74107fbSShuhei Matsumoto DEFINE_RETURN_MOCK(spdk_env_get_current_core, uint32_t); 113f74107fbSShuhei Matsumoto uint32_t 114f74107fbSShuhei Matsumoto spdk_env_get_current_core(void) 115f74107fbSShuhei Matsumoto { 116f74107fbSShuhei Matsumoto HANDLE_RETURN_MOCK(spdk_env_get_current_core); 117f74107fbSShuhei Matsumoto 118f74107fbSShuhei Matsumoto return UINT32_MAX; 119f74107fbSShuhei Matsumoto } 120f74107fbSShuhei Matsumoto 12138b1eaa4SJim Harris DEFINE_RETURN_MOCK(spdk_env_get_numa_id, int32_t); 12238b1eaa4SJim Harris int32_t 12338b1eaa4SJim Harris spdk_env_get_numa_id(uint32_t core) 124f74107fbSShuhei Matsumoto { 12538b1eaa4SJim Harris HANDLE_RETURN_MOCK(spdk_env_get_numa_id); 126f74107fbSShuhei Matsumoto 127186b109dSJim Harris return SPDK_ENV_NUMA_ID_ANY; 128f74107fbSShuhei Matsumoto } 129c9fb57a2SSeth Howell 130c9fb57a2SSeth Howell /* 131f56b2300SBen Walker * These mocks don't use the DEFINE_STUB macros because 132f56b2300SBen Walker * their default implementation is more complex. 133c9fb57a2SSeth Howell */ 134c9fb57a2SSeth Howell 135f56b2300SBen Walker DEFINE_RETURN_MOCK(spdk_memzone_reserve, void *); 136c9fb57a2SSeth Howell void * 13738b1eaa4SJim Harris spdk_memzone_reserve(const char *name, size_t len, int numa_id, unsigned flags) 138c9fb57a2SSeth Howell { 139f56b2300SBen Walker HANDLE_RETURN_MOCK(spdk_memzone_reserve); 140f56b2300SBen Walker 141c9fb57a2SSeth Howell return malloc(len); 142c9fb57a2SSeth Howell } 143c9fb57a2SSeth Howell 144f56b2300SBen Walker DEFINE_RETURN_MOCK(spdk_memzone_reserve_aligned, void *); 1458681eecdSDariusz Stojaczyk void * 14638b1eaa4SJim Harris spdk_memzone_reserve_aligned(const char *name, size_t len, int numa_id, 1478681eecdSDariusz Stojaczyk unsigned flags, unsigned align) 1488681eecdSDariusz Stojaczyk { 149f56b2300SBen Walker HANDLE_RETURN_MOCK(spdk_memzone_reserve_aligned); 150f56b2300SBen Walker 1518681eecdSDariusz Stojaczyk return malloc(len); 1528681eecdSDariusz Stojaczyk } 1538681eecdSDariusz Stojaczyk 154eb6a2cb8Szkhatami88 DEFINE_RETURN_MOCK(spdk_malloc, void *); 155c9fb57a2SSeth Howell void * 15638b1eaa4SJim Harris spdk_malloc(size_t size, size_t align, uint64_t *phys_addr, int numa_id, uint32_t flags) 157c9fb57a2SSeth Howell { 158eb6a2cb8Szkhatami88 HANDLE_RETURN_MOCK(spdk_malloc); 159f56b2300SBen Walker 160c9fb57a2SSeth Howell void *buf = NULL; 1618c50e8c1SJim Harris 162c66b68e9SAleksey Marchuk if (size == 0) { 163c66b68e9SAleksey Marchuk /* Align how mock handles 0 size with rte functions - return NULL. 164c66b68e9SAleksey Marchuk * According to posix_memalig docs, if size is 0, then the 165c66b68e9SAleksey Marchuk * value placed in *memptr is either NULL or a unique pointer value. */ 166c66b68e9SAleksey Marchuk return NULL; 167c66b68e9SAleksey Marchuk } 168c66b68e9SAleksey Marchuk 1698c50e8c1SJim Harris if (align == 0) { 1708c50e8c1SJim Harris align = 8; 1718c50e8c1SJim Harris } 1728c50e8c1SJim Harris 173c9fb57a2SSeth Howell if (posix_memalign(&buf, align, size)) { 174c9fb57a2SSeth Howell return NULL; 175c9fb57a2SSeth Howell } 176c9fb57a2SSeth Howell if (phys_addr) { 177c9fb57a2SSeth Howell *phys_addr = (uint64_t)buf; 178c9fb57a2SSeth Howell } 179f56b2300SBen Walker 180c9fb57a2SSeth Howell return buf; 181c9fb57a2SSeth Howell } 182c9fb57a2SSeth Howell 183eb6a2cb8Szkhatami88 DEFINE_RETURN_MOCK(spdk_zmalloc, void *); 184eb6a2cb8Szkhatami88 void * 18538b1eaa4SJim Harris spdk_zmalloc(size_t size, size_t align, uint64_t *phys_addr, int numa_id, uint32_t flags) 186eb6a2cb8Szkhatami88 { 187eb6a2cb8Szkhatami88 HANDLE_RETURN_MOCK(spdk_zmalloc); 188eb6a2cb8Szkhatami88 189eb6a2cb8Szkhatami88 void *buf = spdk_malloc(size, align, phys_addr, -1, 1); 190eb6a2cb8Szkhatami88 191eb6a2cb8Szkhatami88 if (buf != NULL) { 192eb6a2cb8Szkhatami88 memset(buf, 0, size); 193eb6a2cb8Szkhatami88 } 194eb6a2cb8Szkhatami88 return buf; 195eb6a2cb8Szkhatami88 } 196eb6a2cb8Szkhatami88 197eb6a2cb8Szkhatami88 DEFINE_RETURN_MOCK(spdk_dma_malloc, void *); 198eb6a2cb8Szkhatami88 void * 199eb6a2cb8Szkhatami88 spdk_dma_malloc(size_t size, size_t align, uint64_t *phys_addr) 200eb6a2cb8Szkhatami88 { 201eb6a2cb8Szkhatami88 HANDLE_RETURN_MOCK(spdk_dma_malloc); 202eb6a2cb8Szkhatami88 203eb6a2cb8Szkhatami88 return spdk_malloc(size, align, phys_addr, -1, 1); 204eb6a2cb8Szkhatami88 } 205eb6a2cb8Szkhatami88 20640678c15SDarek Stojaczyk DEFINE_RETURN_MOCK(spdk_realloc, void *); 20740678c15SDarek Stojaczyk void * 20840678c15SDarek Stojaczyk spdk_realloc(void *buf, size_t size, size_t align) 20940678c15SDarek Stojaczyk { 21040678c15SDarek Stojaczyk HANDLE_RETURN_MOCK(spdk_realloc); 21140678c15SDarek Stojaczyk 21240678c15SDarek Stojaczyk return realloc(buf, size); 21340678c15SDarek Stojaczyk } 21440678c15SDarek Stojaczyk 215f56b2300SBen Walker DEFINE_RETURN_MOCK(spdk_dma_zmalloc, void *); 216c9fb57a2SSeth Howell void * 217c9fb57a2SSeth Howell spdk_dma_zmalloc(size_t size, size_t align, uint64_t *phys_addr) 218c9fb57a2SSeth Howell { 219f56b2300SBen Walker HANDLE_RETURN_MOCK(spdk_dma_zmalloc); 220f56b2300SBen Walker 221eb6a2cb8Szkhatami88 return spdk_zmalloc(size, align, phys_addr, -1, 1); 222c9fb57a2SSeth Howell } 223c9fb57a2SSeth Howell 224f56b2300SBen Walker DEFINE_RETURN_MOCK(spdk_dma_malloc_socket, void *); 225c9fb57a2SSeth Howell void * 22638b1eaa4SJim Harris spdk_dma_malloc_socket(size_t size, size_t align, uint64_t *phys_addr, int numa_id) 227c9fb57a2SSeth Howell { 228f56b2300SBen Walker HANDLE_RETURN_MOCK(spdk_dma_malloc_socket); 229f56b2300SBen Walker 230c9fb57a2SSeth Howell return spdk_dma_malloc(size, align, phys_addr); 231c9fb57a2SSeth Howell } 232c9fb57a2SSeth Howell 233f56b2300SBen Walker DEFINE_RETURN_MOCK(spdk_dma_zmalloc_socket, void *); 234c9fb57a2SSeth Howell void * 23538b1eaa4SJim Harris spdk_dma_zmalloc_socket(size_t size, size_t align, uint64_t *phys_addr, int numa_id) 236c9fb57a2SSeth Howell { 237f56b2300SBen Walker HANDLE_RETURN_MOCK(spdk_dma_zmalloc_socket); 238f56b2300SBen Walker 239c9fb57a2SSeth Howell return spdk_dma_zmalloc(size, align, phys_addr); 240c9fb57a2SSeth Howell } 241c9fb57a2SSeth Howell 242f56b2300SBen Walker DEFINE_RETURN_MOCK(spdk_dma_realloc, void *); 243c9fb57a2SSeth Howell void * 244c9fb57a2SSeth Howell spdk_dma_realloc(void *buf, size_t size, size_t align, uint64_t *phys_addr) 245c9fb57a2SSeth Howell { 246f56b2300SBen Walker HANDLE_RETURN_MOCK(spdk_dma_realloc); 247f56b2300SBen Walker 248c9fb57a2SSeth Howell return realloc(buf, size); 249c9fb57a2SSeth Howell } 250c9fb57a2SSeth Howell 251f56b2300SBen Walker void 252eb6a2cb8Szkhatami88 spdk_free(void *buf) 253c9fb57a2SSeth Howell { 25427c42e31SDarek Stojaczyk /* fix for false-positives in *certain* static analysis tools. */ 25527c42e31SDarek Stojaczyk assert((uintptr_t)buf != UINTPTR_MAX); 256c9fb57a2SSeth Howell free(buf); 257c9fb57a2SSeth Howell } 258c9fb57a2SSeth Howell 259eb6a2cb8Szkhatami88 void 260eb6a2cb8Szkhatami88 spdk_dma_free(void *buf) 261eb6a2cb8Szkhatami88 { 262eb6a2cb8Szkhatami88 return spdk_free(buf); 263eb6a2cb8Szkhatami88 } 264eb6a2cb8Szkhatami88 265f74d069eSJim Harris #ifndef UNIT_TEST_NO_VTOPHYS 266f56b2300SBen Walker DEFINE_RETURN_MOCK(spdk_vtophys, uint64_t); 267f56b2300SBen Walker uint64_t 268d48a7b26SBen Walker spdk_vtophys(const void *buf, uint64_t *size) 269c9fb57a2SSeth Howell { 270f56b2300SBen Walker HANDLE_RETURN_MOCK(spdk_vtophys); 271f56b2300SBen Walker 272c9fb57a2SSeth Howell return (uintptr_t)buf; 273c9fb57a2SSeth Howell } 274f74d069eSJim Harris #endif 275c9fb57a2SSeth Howell 276*cab1deccSJim Harris #ifndef UNIT_TEST_NO_ENV_MEMORY 277*cab1deccSJim Harris DEFINE_STUB(spdk_mem_get_numa_id, int32_t, (const void *buf, uint64_t *size), 0); 278*cab1deccSJim Harris #endif 279*cab1deccSJim Harris 280c9fb57a2SSeth Howell void 281c9fb57a2SSeth Howell spdk_memzone_dump(FILE *f) 282c9fb57a2SSeth Howell { 283c9fb57a2SSeth Howell return; 284c9fb57a2SSeth Howell } 285c9fb57a2SSeth Howell 286f56b2300SBen Walker DEFINE_RETURN_MOCK(spdk_memzone_free, int); 287c9fb57a2SSeth Howell int 288c9fb57a2SSeth Howell spdk_memzone_free(const char *name) 289c9fb57a2SSeth Howell { 290f56b2300SBen Walker HANDLE_RETURN_MOCK(spdk_memzone_free); 291f56b2300SBen Walker 292c9fb57a2SSeth Howell return 0; 293c9fb57a2SSeth Howell } 294c9fb57a2SSeth Howell 295c9fb57a2SSeth Howell struct test_mempool { 296c9fb57a2SSeth Howell size_t count; 297a4968634SWojciech Malikowski size_t ele_size; 298c9fb57a2SSeth Howell }; 299c9fb57a2SSeth Howell 300f56b2300SBen Walker DEFINE_RETURN_MOCK(spdk_mempool_create, struct spdk_mempool *); 301c9fb57a2SSeth Howell struct spdk_mempool * 302c9fb57a2SSeth Howell spdk_mempool_create(const char *name, size_t count, 30338b1eaa4SJim Harris size_t ele_size, size_t cache_size, int numa_id) 304c9fb57a2SSeth Howell { 305c9fb57a2SSeth Howell struct test_mempool *mp; 306c9fb57a2SSeth Howell 307f56b2300SBen Walker HANDLE_RETURN_MOCK(spdk_mempool_create); 308f56b2300SBen Walker 309c9fb57a2SSeth Howell mp = calloc(1, sizeof(*mp)); 310c9fb57a2SSeth Howell if (mp == NULL) { 311c9fb57a2SSeth Howell return NULL; 312c9fb57a2SSeth Howell } 313c9fb57a2SSeth Howell 314c9fb57a2SSeth Howell mp->count = count; 315a4968634SWojciech Malikowski mp->ele_size = ele_size; 316c9fb57a2SSeth Howell 317c9fb57a2SSeth Howell return (struct spdk_mempool *)mp; 318c9fb57a2SSeth Howell } 319c9fb57a2SSeth Howell 320c9fb57a2SSeth Howell void 321c9fb57a2SSeth Howell spdk_mempool_free(struct spdk_mempool *_mp) 322c9fb57a2SSeth Howell { 323c9fb57a2SSeth Howell struct test_mempool *mp = (struct test_mempool *)_mp; 324c9fb57a2SSeth Howell 325c9fb57a2SSeth Howell free(mp); 326c9fb57a2SSeth Howell } 327c9fb57a2SSeth Howell 328f56b2300SBen Walker DEFINE_RETURN_MOCK(spdk_mempool_get, void *); 329c9fb57a2SSeth Howell void * 330c9fb57a2SSeth Howell spdk_mempool_get(struct spdk_mempool *_mp) 331c9fb57a2SSeth Howell { 332c9fb57a2SSeth Howell struct test_mempool *mp = (struct test_mempool *)_mp; 333a4968634SWojciech Malikowski size_t ele_size = 0x10000; 334c9fb57a2SSeth Howell void *buf; 335c9fb57a2SSeth Howell 336f56b2300SBen Walker HANDLE_RETURN_MOCK(spdk_mempool_get); 337911c042dSPaul Luse 338c9fb57a2SSeth Howell if (mp && mp->count == 0) { 339c9fb57a2SSeth Howell return NULL; 340c9fb57a2SSeth Howell } 341c9fb57a2SSeth Howell 342a4968634SWojciech Malikowski if (mp) { 343a4968634SWojciech Malikowski ele_size = mp->ele_size; 344a4968634SWojciech Malikowski } 345a4968634SWojciech Malikowski 346a4968634SWojciech Malikowski if (posix_memalign(&buf, 64, spdk_align32pow2(ele_size))) { 347c9fb57a2SSeth Howell return NULL; 348c9fb57a2SSeth Howell } else { 349c9fb57a2SSeth Howell if (mp) { 350c9fb57a2SSeth Howell mp->count--; 351c9fb57a2SSeth Howell } 352c9fb57a2SSeth Howell return buf; 353c9fb57a2SSeth Howell } 354c9fb57a2SSeth Howell } 355c9fb57a2SSeth Howell 356911c042dSPaul Luse int 357911c042dSPaul Luse spdk_mempool_get_bulk(struct spdk_mempool *mp, void **ele_arr, size_t count) 358911c042dSPaul Luse { 359c17c7b95SMao Jiang struct test_mempool *test_mp = (struct test_mempool *)mp; 360c17c7b95SMao Jiang 361c17c7b95SMao Jiang if (test_mp && test_mp->count < count) { 362c17c7b95SMao Jiang return -1; 363c17c7b95SMao Jiang } 364c17c7b95SMao Jiang 365911c042dSPaul Luse for (size_t i = 0; i < count; i++) { 366911c042dSPaul Luse ele_arr[i] = spdk_mempool_get(mp); 367911c042dSPaul Luse if (ele_arr[i] == NULL) { 368911c042dSPaul Luse return -1; 369911c042dSPaul Luse } 370911c042dSPaul Luse } 371911c042dSPaul Luse return 0; 372911c042dSPaul Luse } 373911c042dSPaul Luse 374c9fb57a2SSeth Howell void 375c9fb57a2SSeth Howell spdk_mempool_put(struct spdk_mempool *_mp, void *ele) 376c9fb57a2SSeth Howell { 377c9fb57a2SSeth Howell struct test_mempool *mp = (struct test_mempool *)_mp; 378c9fb57a2SSeth Howell 379c9fb57a2SSeth Howell if (mp) { 380c9fb57a2SSeth Howell mp->count++; 381c9fb57a2SSeth Howell } 382c9fb57a2SSeth Howell free(ele); 383c9fb57a2SSeth Howell } 384c9fb57a2SSeth Howell 385f443bd40SBen Walker void 386f443bd40SBen Walker spdk_mempool_put_bulk(struct spdk_mempool *mp, void **ele_arr, size_t count) 387f443bd40SBen Walker { 388f443bd40SBen Walker for (size_t i = 0; i < count; i++) { 389f443bd40SBen Walker spdk_mempool_put(mp, ele_arr[i]); 390f443bd40SBen Walker } 391f443bd40SBen Walker } 392f443bd40SBen Walker 393f56b2300SBen Walker DEFINE_RETURN_MOCK(spdk_mempool_count, size_t); 394c9fb57a2SSeth Howell size_t 395c9fb57a2SSeth Howell spdk_mempool_count(const struct spdk_mempool *_mp) 396c9fb57a2SSeth Howell { 397c9fb57a2SSeth Howell struct test_mempool *mp = (struct test_mempool *)_mp; 398c9fb57a2SSeth Howell 399f56b2300SBen Walker HANDLE_RETURN_MOCK(spdk_mempool_count); 400f56b2300SBen Walker 401c9fb57a2SSeth Howell if (mp) { 402c9fb57a2SSeth Howell return mp->count; 403c9fb57a2SSeth Howell } else { 404c9fb57a2SSeth Howell return 1024; 405c9fb57a2SSeth Howell } 406c9fb57a2SSeth Howell } 407c9fb57a2SSeth Howell 408ef8dfe11SBen Walker struct spdk_ring_ele { 409ef8dfe11SBen Walker void *ele; 410ef8dfe11SBen Walker TAILQ_ENTRY(spdk_ring_ele) link; 411ef8dfe11SBen Walker }; 412ef8dfe11SBen Walker 413ef8dfe11SBen Walker struct spdk_ring { 414ef8dfe11SBen Walker TAILQ_HEAD(, spdk_ring_ele) elements; 4154a4e9285SWojciech Malikowski pthread_mutex_t lock; 416eccf5491SWojciech Malikowski size_t count; 417ef8dfe11SBen Walker }; 418ef8dfe11SBen Walker 419f56b2300SBen Walker DEFINE_RETURN_MOCK(spdk_ring_create, struct spdk_ring *); 420ef8dfe11SBen Walker struct spdk_ring * 42138b1eaa4SJim Harris spdk_ring_create(enum spdk_ring_type type, size_t count, int numa_id) 422ef8dfe11SBen Walker { 423ef8dfe11SBen Walker struct spdk_ring *ring; 424ef8dfe11SBen Walker 425f56b2300SBen Walker HANDLE_RETURN_MOCK(spdk_ring_create); 426f56b2300SBen Walker 427ef8dfe11SBen Walker ring = calloc(1, sizeof(*ring)); 4284a4e9285SWojciech Malikowski if (!ring) { 4294a4e9285SWojciech Malikowski return NULL; 430ef8dfe11SBen Walker } 431ef8dfe11SBen Walker 4324a4e9285SWojciech Malikowski if (pthread_mutex_init(&ring->lock, NULL)) { 4334a4e9285SWojciech Malikowski free(ring); 4344a4e9285SWojciech Malikowski return NULL; 4354a4e9285SWojciech Malikowski } 4364a4e9285SWojciech Malikowski 4374a4e9285SWojciech Malikowski TAILQ_INIT(&ring->elements); 438ef8dfe11SBen Walker return ring; 439ef8dfe11SBen Walker } 440ef8dfe11SBen Walker 441ef8dfe11SBen Walker void 442ef8dfe11SBen Walker spdk_ring_free(struct spdk_ring *ring) 443ef8dfe11SBen Walker { 4444a4e9285SWojciech Malikowski struct spdk_ring_ele *ele, *tmp; 4454a4e9285SWojciech Malikowski 4464a4e9285SWojciech Malikowski if (!ring) { 4474a4e9285SWojciech Malikowski return; 4484a4e9285SWojciech Malikowski } 4494a4e9285SWojciech Malikowski 4504a4e9285SWojciech Malikowski TAILQ_FOREACH_SAFE(ele, &ring->elements, link, tmp) { 4514a4e9285SWojciech Malikowski free(ele); 4524a4e9285SWojciech Malikowski } 4534a4e9285SWojciech Malikowski 4544a4e9285SWojciech Malikowski pthread_mutex_destroy(&ring->lock); 455ef8dfe11SBen Walker free(ring); 456ef8dfe11SBen Walker } 457ef8dfe11SBen Walker 458f56b2300SBen Walker DEFINE_RETURN_MOCK(spdk_ring_enqueue, size_t); 459ef8dfe11SBen Walker size_t 4601554a344SShuhei Matsumoto spdk_ring_enqueue(struct spdk_ring *ring, void **objs, size_t count, 4611554a344SShuhei Matsumoto size_t *free_space) 462ef8dfe11SBen Walker { 463ef8dfe11SBen Walker struct spdk_ring_ele *ele; 464ef8dfe11SBen Walker size_t i; 465ef8dfe11SBen Walker 466f56b2300SBen Walker HANDLE_RETURN_MOCK(spdk_ring_enqueue); 467f56b2300SBen Walker 4684a4e9285SWojciech Malikowski pthread_mutex_lock(&ring->lock); 4694a4e9285SWojciech Malikowski 470ef8dfe11SBen Walker for (i = 0; i < count; i++) { 471ef8dfe11SBen Walker ele = calloc(1, sizeof(*ele)); 472ef8dfe11SBen Walker if (!ele) { 473ef8dfe11SBen Walker break; 474ef8dfe11SBen Walker } 475ef8dfe11SBen Walker 476ef8dfe11SBen Walker ele->ele = objs[i]; 477ef8dfe11SBen Walker TAILQ_INSERT_TAIL(&ring->elements, ele, link); 478eccf5491SWojciech Malikowski ring->count++; 479ef8dfe11SBen Walker } 480ef8dfe11SBen Walker 4814a4e9285SWojciech Malikowski pthread_mutex_unlock(&ring->lock); 482ef8dfe11SBen Walker return i; 483ef8dfe11SBen Walker } 484ef8dfe11SBen Walker 485f56b2300SBen Walker DEFINE_RETURN_MOCK(spdk_ring_dequeue, size_t); 486ef8dfe11SBen Walker size_t 487ef8dfe11SBen Walker spdk_ring_dequeue(struct spdk_ring *ring, void **objs, size_t count) 488ef8dfe11SBen Walker { 489ef8dfe11SBen Walker struct spdk_ring_ele *ele, *tmp; 490ef8dfe11SBen Walker size_t i = 0; 491ef8dfe11SBen Walker 492f56b2300SBen Walker HANDLE_RETURN_MOCK(spdk_ring_dequeue); 493f56b2300SBen Walker 494ef8dfe11SBen Walker if (count == 0) { 495ef8dfe11SBen Walker return 0; 496ef8dfe11SBen Walker } 497ef8dfe11SBen Walker 4984a4e9285SWojciech Malikowski pthread_mutex_lock(&ring->lock); 4994a4e9285SWojciech Malikowski 500ef8dfe11SBen Walker TAILQ_FOREACH_SAFE(ele, &ring->elements, link, tmp) { 501ef8dfe11SBen Walker TAILQ_REMOVE(&ring->elements, ele, link); 502eccf5491SWojciech Malikowski ring->count--; 503ef8dfe11SBen Walker objs[i] = ele->ele; 504ef8dfe11SBen Walker free(ele); 505ef8dfe11SBen Walker i++; 506ef8dfe11SBen Walker if (i >= count) { 507ef8dfe11SBen Walker break; 508ef8dfe11SBen Walker } 509ef8dfe11SBen Walker } 510ef8dfe11SBen Walker 5114a4e9285SWojciech Malikowski pthread_mutex_unlock(&ring->lock); 512ef8dfe11SBen Walker return i; 513ef8dfe11SBen Walker 514ef8dfe11SBen Walker } 515ef8dfe11SBen Walker 516eccf5491SWojciech Malikowski 517eccf5491SWojciech Malikowski DEFINE_RETURN_MOCK(spdk_ring_count, size_t); 518eccf5491SWojciech Malikowski size_t 519eccf5491SWojciech Malikowski spdk_ring_count(struct spdk_ring *ring) 520eccf5491SWojciech Malikowski { 521eccf5491SWojciech Malikowski HANDLE_RETURN_MOCK(spdk_ring_count); 522eccf5491SWojciech Malikowski return ring->count; 523eccf5491SWojciech Malikowski } 524eccf5491SWojciech Malikowski 525f56b2300SBen Walker DEFINE_RETURN_MOCK(spdk_get_ticks, uint64_t); 526f56b2300SBen Walker uint64_t 527f56b2300SBen Walker spdk_get_ticks(void) 528c9fb57a2SSeth Howell { 529f56b2300SBen Walker HANDLE_RETURN_MOCK(spdk_get_ticks); 530f56b2300SBen Walker 531f56b2300SBen Walker return ut_spdk_get_ticks; 532c9fb57a2SSeth Howell } 533c9fb57a2SSeth Howell 534f56b2300SBen Walker DEFINE_RETURN_MOCK(spdk_get_ticks_hz, uint64_t); 535f56b2300SBen Walker uint64_t 536f56b2300SBen Walker spdk_get_ticks_hz(void) 537c9fb57a2SSeth Howell { 538f56b2300SBen Walker HANDLE_RETURN_MOCK(spdk_get_ticks_hz); 539f56b2300SBen Walker 540c9fb57a2SSeth Howell return 1000000; 541c9fb57a2SSeth Howell } 542c9fb57a2SSeth Howell 543f56b2300SBen Walker void 544f56b2300SBen Walker spdk_delay_us(unsigned int us) 545c9fb57a2SSeth Howell { 54686d77e2eSJim Harris /* spdk_get_ticks_hz is 1000000, meaning 1 tick per us. */ 547f56b2300SBen Walker ut_spdk_get_ticks += us; 548c9fb57a2SSeth Howell } 549c9fb57a2SSeth Howell 550f56b2300SBen Walker DEFINE_RETURN_MOCK(spdk_pci_addr_parse, int); 551c9fb57a2SSeth Howell int 552c9fb57a2SSeth Howell spdk_pci_addr_parse(struct spdk_pci_addr *addr, const char *bdf) 553c9fb57a2SSeth Howell { 554c9fb57a2SSeth Howell unsigned domain, bus, dev, func; 555c9fb57a2SSeth Howell 556f56b2300SBen Walker HANDLE_RETURN_MOCK(spdk_pci_addr_parse); 557f56b2300SBen Walker 558c9fb57a2SSeth Howell if (addr == NULL || bdf == NULL) { 559c9fb57a2SSeth Howell return -EINVAL; 560c9fb57a2SSeth Howell } 561c9fb57a2SSeth Howell 562c9fb57a2SSeth Howell if ((sscanf(bdf, "%x:%x:%x.%x", &domain, &bus, &dev, &func) == 4) || 563c9fb57a2SSeth Howell (sscanf(bdf, "%x.%x.%x.%x", &domain, &bus, &dev, &func) == 4)) { 564c9fb57a2SSeth Howell /* Matched a full address - all variables are initialized */ 565c9fb57a2SSeth Howell } else if (sscanf(bdf, "%x:%x:%x", &domain, &bus, &dev) == 3) { 566c9fb57a2SSeth Howell func = 0; 567c9fb57a2SSeth Howell } else if ((sscanf(bdf, "%x:%x.%x", &bus, &dev, &func) == 3) || 568c9fb57a2SSeth Howell (sscanf(bdf, "%x.%x.%x", &bus, &dev, &func) == 3)) { 569c9fb57a2SSeth Howell domain = 0; 570c9fb57a2SSeth Howell } else if ((sscanf(bdf, "%x:%x", &bus, &dev) == 2) || 571c9fb57a2SSeth Howell (sscanf(bdf, "%x.%x", &bus, &dev) == 2)) { 572c9fb57a2SSeth Howell domain = 0; 573c9fb57a2SSeth Howell func = 0; 574c9fb57a2SSeth Howell } else { 575c9fb57a2SSeth Howell return -EINVAL; 576c9fb57a2SSeth Howell } 577c9fb57a2SSeth Howell 578c9fb57a2SSeth Howell if (bus > 0xFF || dev > 0x1F || func > 7) { 579c9fb57a2SSeth Howell return -EINVAL; 580c9fb57a2SSeth Howell } 581c9fb57a2SSeth Howell 582c9fb57a2SSeth Howell addr->domain = domain; 583c9fb57a2SSeth Howell addr->bus = bus; 584c9fb57a2SSeth Howell addr->dev = dev; 585c9fb57a2SSeth Howell addr->func = func; 586c9fb57a2SSeth Howell 587c9fb57a2SSeth Howell return 0; 588c9fb57a2SSeth Howell } 589c9fb57a2SSeth Howell 590f56b2300SBen Walker DEFINE_RETURN_MOCK(spdk_pci_addr_fmt, int); 591c9fb57a2SSeth Howell int 592c9fb57a2SSeth Howell spdk_pci_addr_fmt(char *bdf, size_t sz, const struct spdk_pci_addr *addr) 593c9fb57a2SSeth Howell { 594c9fb57a2SSeth Howell int rc; 595c9fb57a2SSeth Howell 596f56b2300SBen Walker HANDLE_RETURN_MOCK(spdk_pci_addr_fmt); 597f56b2300SBen Walker 598c9fb57a2SSeth Howell rc = snprintf(bdf, sz, "%04x:%02x:%02x.%x", 599c9fb57a2SSeth Howell addr->domain, addr->bus, 600c9fb57a2SSeth Howell addr->dev, addr->func); 601c9fb57a2SSeth Howell 602c9fb57a2SSeth Howell if (rc > 0 && (size_t)rc < sz) { 603c9fb57a2SSeth Howell return 0; 604c9fb57a2SSeth Howell } 605c9fb57a2SSeth Howell 606c9fb57a2SSeth Howell return -1; 607c9fb57a2SSeth Howell } 608c9fb57a2SSeth Howell 609f56b2300SBen Walker DEFINE_RETURN_MOCK(spdk_pci_addr_compare, int); 610c9fb57a2SSeth Howell int 611c9fb57a2SSeth Howell spdk_pci_addr_compare(const struct spdk_pci_addr *a1, const struct spdk_pci_addr *a2) 612c9fb57a2SSeth Howell { 613f56b2300SBen Walker HANDLE_RETURN_MOCK(spdk_pci_addr_compare); 614f56b2300SBen Walker 615c9fb57a2SSeth Howell if (a1->domain > a2->domain) { 616c9fb57a2SSeth Howell return 1; 617c9fb57a2SSeth Howell } else if (a1->domain < a2->domain) { 618c9fb57a2SSeth Howell return -1; 619c9fb57a2SSeth Howell } else if (a1->bus > a2->bus) { 620c9fb57a2SSeth Howell return 1; 621c9fb57a2SSeth Howell } else if (a1->bus < a2->bus) { 622c9fb57a2SSeth Howell return -1; 623c9fb57a2SSeth Howell } else if (a1->dev > a2->dev) { 624c9fb57a2SSeth Howell return 1; 625c9fb57a2SSeth Howell } else if (a1->dev < a2->dev) { 626c9fb57a2SSeth Howell return -1; 627c9fb57a2SSeth Howell } else if (a1->func > a2->func) { 628c9fb57a2SSeth Howell return 1; 629c9fb57a2SSeth Howell } else if (a1->func < a2->func) { 630c9fb57a2SSeth Howell return -1; 631c9fb57a2SSeth Howell } 632c9fb57a2SSeth Howell 633c9fb57a2SSeth Howell return 0; 634c9fb57a2SSeth Howell } 635