xref: /spdk/test/common/lib/test_env.c (revision cab1decc11bddaf25f61d9576a7c6b326d8d69a1)
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