1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright 2021 Mellanox Technologies, Ltd
3 * Copyright (C) 2022 Microsoft Corporation
11 #include <rte_errno.h>
13 #include <rte_thread.h>
16 pthread_key_t thread_index;
20 thread_map_priority_to_os_value(enum rte_thread_priority eal_pri, int *os_pri,
23 /* Clear the output parameters. */
24 *os_pri = sched_get_priority_min(SCHED_OTHER) - 1;
28 case RTE_THREAD_PRIORITY_NORMAL:
32 * Choose the middle of the range to represent the priority
34 * On Linux, this should be 0, since both
35 * sched_get_priority_min/_max return 0 for SCHED_OTHER.
37 *os_pri = (sched_get_priority_min(SCHED_OTHER) +
38 sched_get_priority_max(SCHED_OTHER)) / 2;
40 case RTE_THREAD_PRIORITY_REALTIME_CRITICAL:
42 *os_pri = sched_get_priority_max(SCHED_RR);
45 RTE_LOG(DEBUG, EAL, "The requested priority value is invalid.\n");
53 thread_map_os_priority_to_eal_priority(int policy, int os_pri,
54 enum rte_thread_priority *eal_pri)
58 if (os_pri == (sched_get_priority_min(SCHED_OTHER) +
59 sched_get_priority_max(SCHED_OTHER)) / 2) {
60 *eal_pri = RTE_THREAD_PRIORITY_NORMAL;
65 if (os_pri == sched_get_priority_max(SCHED_RR)) {
66 *eal_pri = RTE_THREAD_PRIORITY_REALTIME_CRITICAL;
71 RTE_LOG(DEBUG, EAL, "The OS priority value does not map to an EAL-defined priority.\n");
81 RTE_BUILD_BUG_ON(sizeof(pthread_t) > sizeof(uintptr_t));
83 rte_thread_t thread_id;
85 thread_id.opaque_id = (uintptr_t)pthread_self();
91 rte_thread_get_priority(rte_thread_t thread_id,
92 enum rte_thread_priority *priority)
94 struct sched_param param;
98 ret = pthread_getschedparam((pthread_t)thread_id.opaque_id, &policy,
101 RTE_LOG(DEBUG, EAL, "pthread_getschedparam failed\n");
105 return thread_map_os_priority_to_eal_priority(policy,
106 param.sched_priority, priority);
113 rte_thread_set_priority(rte_thread_t thread_id,
114 enum rte_thread_priority priority)
116 struct sched_param param;
120 /* Realtime priority can cause crashes on non-Windows platforms. */
121 if (priority == RTE_THREAD_PRIORITY_REALTIME_CRITICAL)
124 ret = thread_map_priority_to_os_value(priority, ¶m.sched_priority,
129 return pthread_setschedparam((pthread_t)thread_id.opaque_id, policy,
134 rte_thread_key_create(rte_thread_key *key, void (*destructor)(void *))
138 *key = malloc(sizeof(**key));
139 if ((*key) == NULL) {
140 RTE_LOG(DEBUG, EAL, "Cannot allocate TLS key.\n");
144 err = pthread_key_create(&((*key)->thread_index), destructor);
146 RTE_LOG(DEBUG, EAL, "pthread_key_create failed: %s\n",
156 rte_thread_key_delete(rte_thread_key key)
161 RTE_LOG(DEBUG, EAL, "Invalid TLS key.\n");
165 err = pthread_key_delete(key->thread_index);
167 RTE_LOG(DEBUG, EAL, "pthread_key_delete failed: %s\n",
178 rte_thread_value_set(rte_thread_key key, const void *value)
183 RTE_LOG(DEBUG, EAL, "Invalid TLS key.\n");
187 err = pthread_setspecific(key->thread_index, value);
189 RTE_LOG(DEBUG, EAL, "pthread_setspecific failed: %s\n",
198 rte_thread_value_get(rte_thread_key key)
201 RTE_LOG(DEBUG, EAL, "Invalid TLS key.\n");
205 return pthread_getspecific(key->thread_index);
209 rte_thread_set_affinity_by_id(rte_thread_t thread_id,
210 const rte_cpuset_t *cpuset)
212 return pthread_setaffinity_np((pthread_t)thread_id.opaque_id,
213 sizeof(*cpuset), cpuset);
217 rte_thread_get_affinity_by_id(rte_thread_t thread_id,
218 rte_cpuset_t *cpuset)
220 return pthread_getaffinity_np((pthread_t)thread_id.opaque_id,
221 sizeof(*cpuset), cpuset);