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