Implement thread attributes for: * thread affinity * thread priority
Implement functions for managing thread attributes. Priority is represented through an enum that allows for two levels: * RTE_THREAD_PRIORITY_NORMAL * RTE_THREAD_PRIORITY_REALTIME_CRITICAL Affinity is described by the rte_cpuset_t type. An rte_thread_attr_t object can be set to the default values by calling rte_thread_attr_init(). Signed-off-by: Narcisa Vasile <navas...@microsoft.com> Signed-off-by: Tyler Retzlaff <roret...@linux.microsoft.com> --- lib/eal/common/meson.build | 1 + lib/eal/common/rte_thread.c | 62 ++++++++++++++++++++++++ lib/eal/include/rte_thread.h | 110 +++++++++++++++++++++++++++++++++++++++++-- lib/eal/version.map | 6 +++ 4 files changed, 176 insertions(+), 3 deletions(-) create mode 100644 lib/eal/common/rte_thread.c diff --git a/lib/eal/common/meson.build b/lib/eal/common/meson.build index 917758c..1e77dba 100644 --- a/lib/eal/common/meson.build +++ b/lib/eal/common/meson.build @@ -36,6 +36,7 @@ sources += files( 'rte_random.c', 'rte_reciprocal.c', 'rte_service.c', + 'rte_thread.c', 'rte_version.c', ) if is_linux or is_windows diff --git a/lib/eal/common/rte_thread.c b/lib/eal/common/rte_thread.c new file mode 100644 index 0000000..760ad62 --- /dev/null +++ b/lib/eal/common/rte_thread.c @@ -0,0 +1,62 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright (C) 2022 Microsoft Corporation + */ + +#include <errno.h> + +#include <rte_debug.h> +#include <rte_thread.h> + +int +rte_thread_attr_init(rte_thread_attr_t *attr) +{ + if (attr == NULL) + return EINVAL; + + CPU_ZERO(&attr->cpuset); + attr->priority = RTE_THREAD_PRIORITY_NORMAL; + + return 0; +} + +int +rte_thread_attr_set_affinity(rte_thread_attr_t *thread_attr, + rte_cpuset_t *cpuset) +{ + if (thread_attr == NULL) + return EINVAL; + + if (cpuset == NULL) + return EINVAL; + + thread_attr->cpuset = *cpuset; + + return 0; +} + +int +rte_thread_attr_get_affinity(rte_thread_attr_t *thread_attr, + rte_cpuset_t *cpuset) +{ + if (thread_attr == NULL) + return EINVAL; + + if (cpuset == NULL) + return EINVAL; + + *cpuset = thread_attr->cpuset; + + return 0; +} + +int +rte_thread_attr_set_priority(rte_thread_attr_t *thread_attr, + enum rte_thread_priority priority) +{ + if (thread_attr == NULL) + return EINVAL; + + thread_attr->priority = priority; + + return 0; +} diff --git a/lib/eal/include/rte_thread.h b/lib/eal/include/rte_thread.h index 9e261bf..a3802de 100644 --- a/lib/eal/include/rte_thread.h +++ b/lib/eal/include/rte_thread.h @@ -41,6 +41,14 @@ enum rte_thread_priority { }; /** + * Representation for thread attributes. + */ +typedef struct { + enum rte_thread_priority priority; /**< thread priority */ + rte_cpuset_t cpuset; /**< thread affinity */ +} rte_thread_attr_t; + +/** * TLS key type, an opaque pointer. */ typedef struct eal_tls_key *rte_thread_key; @@ -57,7 +65,105 @@ enum rte_thread_priority { __rte_experimental rte_thread_t rte_thread_self(void); -#ifdef RTE_HAS_CPUSET +/** + * @warning + * @b EXPERIMENTAL: this API may change without prior notice. + * + * Check if 2 thread ids are equal. + * + * @param t1 + * First thread id. + * + * @param t2 + * Second thread id. + * + * @return + * If the ids are equal, return nonzero. + * Otherwise, return 0. + */ +__rte_experimental +int rte_thread_equal(rte_thread_t t1, rte_thread_t t2); + +/** + * @warning + * @b EXPERIMENTAL: this API may change without prior notice. + * + * Initialize the attributes of a thread. + * These attributes can be passed to the rte_thread_create() function + * that will create a new thread and set its attributes according to attr. + * + * @param attr + * Thread attributes to initialize. + * + * @return + * On success, return 0. + * On failure, return a positive errno-style error number. + */ +__rte_experimental +int rte_thread_attr_init(rte_thread_attr_t *attr); + +/** + * @warning + * @b EXPERIMENTAL: this API may change without prior notice. + * + * Set the CPU affinity value in the thread attributes pointed to + * by 'thread_attr'. + * + * @param thread_attr + * Points to the thread attributes in which affinity will be updated. + * + * @param cpuset + * Points to the value of the affinity to be set. + * + * @return + * On success, return 0. + * On failure, return a positive errno-style error number. + */ +__rte_experimental +int rte_thread_attr_set_affinity(rte_thread_attr_t *thread_attr, + rte_cpuset_t *cpuset); + +/** + * @warning + * @b EXPERIMENTAL: this API may change without prior notice. + * + * Get the value of CPU affinity that is set in the thread attributes pointed + * to by 'thread_attr'. + * + * @param thread_attr + * Points to the thread attributes from which affinity will be retrieved. + * + * @param cpuset + * Pointer to the memory that will store the affinity. + * + * @return + * On success, return 0. + * On failure, return a positive errno-style error number. + */ +__rte_experimental +int rte_thread_attr_get_affinity(rte_thread_attr_t *thread_attr, + rte_cpuset_t *cpuset); + +/** + * @warning + * @b EXPERIMENTAL: this API may change without prior notice. + * + * Set the thread priority value in the thread attributes pointed to + * by 'thread_attr'. + * + * @param thread_attr + * Points to the thread attributes in which priority will be updated. + * + * @param priority + * Points to the value of the priority to be set. + * + * @return + * On success, return 0. + * On failure, return a positive errno-style error number. + */ +__rte_experimental +int rte_thread_attr_set_priority(rte_thread_attr_t *thread_attr, + enum rte_thread_priority priority); /** * @warning @@ -122,8 +228,6 @@ int rte_thread_get_affinity_by_id(rte_thread_t thread_id, */ void rte_thread_get_affinity(rte_cpuset_t *cpusetp); -#endif /* RTE_HAS_CPUSET */ - /** * @warning * @b EXPERIMENTAL: this API may change without prior notice. diff --git a/lib/eal/version.map b/lib/eal/version.map index e617ba7..e9df18d 100644 --- a/lib/eal/version.map +++ b/lib/eal/version.map @@ -430,6 +430,12 @@ EXPERIMENTAL { rte_thread_self; rte_thread_set_affinity_by_id; rte_thread_set_priority; + + # added in 22.11 + rte_thread_attr_get_affinity; + rte_thread_attr_init; + rte_thread_attr_set_affinity; + rte_thread_attr_set_priority; }; INTERNAL { -- 1.8.3.1