xref: /dpdk/app/test/test_threads.c (revision 04e53de9)
1*04e53de9STyler Retzlaff /* SPDX-License-Identifier: BSD-3-Clause
2*04e53de9STyler Retzlaff  * Copyright (C) 2022 Microsoft Corporation
3*04e53de9STyler Retzlaff  */
4*04e53de9STyler Retzlaff 
5*04e53de9STyler Retzlaff #include <string.h>
6*04e53de9STyler Retzlaff #include <pthread.h>
7*04e53de9STyler Retzlaff 
8*04e53de9STyler Retzlaff #include <rte_thread.h>
9*04e53de9STyler Retzlaff #include <rte_debug.h>
10*04e53de9STyler Retzlaff 
11*04e53de9STyler Retzlaff #include "test.h"
12*04e53de9STyler Retzlaff 
13*04e53de9STyler Retzlaff RTE_LOG_REGISTER(threads_logtype_test, test.threads, INFO);
14*04e53de9STyler Retzlaff 
15*04e53de9STyler Retzlaff static uint32_t thread_id_ready;
16*04e53de9STyler Retzlaff 
17*04e53de9STyler Retzlaff static void *
thread_main(void * arg)18*04e53de9STyler Retzlaff thread_main(void *arg)
19*04e53de9STyler Retzlaff {
20*04e53de9STyler Retzlaff 	*(rte_thread_t *)arg = rte_thread_self();
21*04e53de9STyler Retzlaff 	__atomic_store_n(&thread_id_ready, 1, __ATOMIC_RELEASE);
22*04e53de9STyler Retzlaff 
23*04e53de9STyler Retzlaff 	return NULL;
24*04e53de9STyler Retzlaff }
25*04e53de9STyler Retzlaff 
26*04e53de9STyler Retzlaff static int
test_thread_affinity(void)27*04e53de9STyler Retzlaff test_thread_affinity(void)
28*04e53de9STyler Retzlaff {
29*04e53de9STyler Retzlaff 	pthread_t id;
30*04e53de9STyler Retzlaff 	rte_thread_t thread_id;
31*04e53de9STyler Retzlaff 	rte_cpuset_t cpuset0;
32*04e53de9STyler Retzlaff 	rte_cpuset_t cpuset1;
33*04e53de9STyler Retzlaff 
34*04e53de9STyler Retzlaff 	RTE_TEST_ASSERT(pthread_create(&id, NULL, thread_main, &thread_id) == 0,
35*04e53de9STyler Retzlaff 		"Failed to create thread");
36*04e53de9STyler Retzlaff 
37*04e53de9STyler Retzlaff 	while (__atomic_load_n(&thread_id_ready, __ATOMIC_ACQUIRE) == 0)
38*04e53de9STyler Retzlaff 		;
39*04e53de9STyler Retzlaff 
40*04e53de9STyler Retzlaff 	RTE_TEST_ASSERT(rte_thread_get_affinity_by_id(thread_id, &cpuset0) == 0,
41*04e53de9STyler Retzlaff 		"Failed to get thread affinity");
42*04e53de9STyler Retzlaff 	RTE_TEST_ASSERT(rte_thread_get_affinity_by_id(thread_id, &cpuset1) == 0,
43*04e53de9STyler Retzlaff 		"Failed to get thread affinity");
44*04e53de9STyler Retzlaff 	RTE_TEST_ASSERT(memcmp(&cpuset0, &cpuset1, sizeof(rte_cpuset_t)) == 0,
45*04e53de9STyler Retzlaff 		"Affinity should be stable");
46*04e53de9STyler Retzlaff 
47*04e53de9STyler Retzlaff 	size_t i;
48*04e53de9STyler Retzlaff 	for (i = 1; i < CPU_SETSIZE; i++)
49*04e53de9STyler Retzlaff 		if (CPU_ISSET(i, &cpuset0)) {
50*04e53de9STyler Retzlaff 			CPU_ZERO(&cpuset0);
51*04e53de9STyler Retzlaff 			CPU_SET(i, &cpuset0);
52*04e53de9STyler Retzlaff 
53*04e53de9STyler Retzlaff 			break;
54*04e53de9STyler Retzlaff 		}
55*04e53de9STyler Retzlaff 	RTE_TEST_ASSERT(rte_thread_set_affinity_by_id(thread_id, &cpuset0) == 0,
56*04e53de9STyler Retzlaff 		"Failed to set thread affinity");
57*04e53de9STyler Retzlaff 	RTE_TEST_ASSERT(rte_thread_get_affinity_by_id(thread_id, &cpuset1) == 0,
58*04e53de9STyler Retzlaff 		"Failed to get thread affinity");
59*04e53de9STyler Retzlaff 	RTE_TEST_ASSERT(memcmp(&cpuset0, &cpuset1, sizeof(rte_cpuset_t)) == 0,
60*04e53de9STyler Retzlaff 		"Affinity should be stable");
61*04e53de9STyler Retzlaff 
62*04e53de9STyler Retzlaff 	return 0;
63*04e53de9STyler Retzlaff }
64*04e53de9STyler Retzlaff 
65*04e53de9STyler Retzlaff static struct unit_test_suite threads_test_suite = {
66*04e53de9STyler Retzlaff 	.suite_name = "threads autotest",
67*04e53de9STyler Retzlaff 	.setup = NULL,
68*04e53de9STyler Retzlaff 	.teardown = NULL,
69*04e53de9STyler Retzlaff 	.unit_test_cases = {
70*04e53de9STyler Retzlaff 		TEST_CASE(test_thread_affinity),
71*04e53de9STyler Retzlaff 		TEST_CASES_END()
72*04e53de9STyler Retzlaff 	}
73*04e53de9STyler Retzlaff };
74*04e53de9STyler Retzlaff 
75*04e53de9STyler Retzlaff static int
test_threads(void)76*04e53de9STyler Retzlaff test_threads(void)
77*04e53de9STyler Retzlaff {
78*04e53de9STyler Retzlaff 	return unit_test_suite_runner(&threads_test_suite);
79*04e53de9STyler Retzlaff }
80*04e53de9STyler Retzlaff 
81*04e53de9STyler Retzlaff REGISTER_TEST_COMMAND(threads_autotest, test_threads);
82