[dpdk-dev] [PATCH v3 02/10] eal: add thread attributes
Narcisa Ana Maria Vasile
navasile at linux.microsoft.com
Thu Mar 25 04:46:58 CET 2021
From: Narcisa Vasile <navasile at microsoft.com>
Implement thread attributes for:
* thread affinity
* thread priority
Implement functions for managing thread attributes.
Signed-off-by: Narcisa Vasile <navasile at microsoft.com>
---
lib/librte_eal/common/rte_thread.c | 53 ++++++++++++
lib/librte_eal/include/rte_thread.h | 82 +++++++++++++++++++
lib/librte_eal/include/rte_thread_types.h | 3 +
.../include/rte_windows_thread_types.h | 3 +
lib/librte_eal/windows/rte_thread.c | 56 +++++++++++++
5 files changed, 197 insertions(+)
diff --git a/lib/librte_eal/common/rte_thread.c b/lib/librte_eal/common/rte_thread.c
index 9b5cee890..b21eac0e2 100644
--- a/lib/librte_eal/common/rte_thread.c
+++ b/lib/librte_eal/common/rte_thread.c
@@ -29,6 +29,59 @@ rte_thread_equal(rte_thread_t t1, rte_thread_t t2)
return pthread_equal(t1, t2);
}
+int
+rte_thread_attr_init(rte_thread_attr_t *attr)
+{
+ if (attr == NULL) {
+ RTE_LOG(DEBUG, EAL, "Invalid thread attributes parameter\n");
+ 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 || cpuset == NULL) {
+ RTE_LOG(DEBUG, EAL, "Invalid thread attributes parameter\n");
+ 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) || (cpuset == NULL)) {
+ RTE_LOG(DEBUG, EAL, "Invalid thread attributes parameter\n");
+ 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) {
+ RTE_LOG(DEBUG, EAL,
+ "Unable to set priority attribute, invalid parameter\n");
+ return EINVAL;
+ }
+
+ thread_attr->priority = priority;
+ return 0;
+}
+
int
rte_thread_tls_key_create(rte_tls_key *key, void (*destructor)(void *))
{
diff --git a/lib/librte_eal/include/rte_thread.h b/lib/librte_eal/include/rte_thread.h
index f7d398a22..463357a1d 100644
--- a/lib/librte_eal/include/rte_thread.h
+++ b/lib/librte_eal/include/rte_thread.h
@@ -28,6 +28,19 @@ extern "C" {
#include <rte_thread_types.h>
#endif
+enum rte_thread_priority {
+ RTE_THREAD_PRIORITY_NORMAL = EAL_THREAD_PRIORITY_NORMAL,
+ RTE_THREAD_PRIORITY_REALTIME_CRITICAL = EAL_THREAD_PRIORITY_REALTIME_CIRTICAL,
+ /*
+ * This enum can be extended to allow more priority levels.
+ */
+};
+
+typedef struct {
+ enum rte_thread_priority priority;
+ rte_cpuset_t cpuset;
+} rte_thread_attr_t;
+
/**
* TLS key type, an opaque pointer.
*/
@@ -60,6 +73,75 @@ rte_thread_t rte_thread_self(void);
__rte_experimental
int rte_thread_equal(rte_thread_t t1, rte_thread_t t2);
+/**
+ * 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);
+
+/**
+ * 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);
+
+/**
+ * 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);
+
+/**
+ * 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);
+
/**
* Set core affinity of the current thread.
* Support both EAL and non-EAL thread and update TLS.
diff --git a/lib/librte_eal/include/rte_thread_types.h b/lib/librte_eal/include/rte_thread_types.h
index 19fb85e38..a884daf17 100644
--- a/lib/librte_eal/include/rte_thread_types.h
+++ b/lib/librte_eal/include/rte_thread_types.h
@@ -7,6 +7,9 @@
#include <pthread.h>
+#define EAL_THREAD_PRIORITY_NORMAL 0
+#define EAL_THREAD_PRIORITY_REALTIME_CIRTICAL 99
+
typedef pthread_t rte_thread_t;
#endif /* _RTE_THREAD_TYPES_H_ */
diff --git a/lib/librte_eal/windows/include/rte_windows_thread_types.h b/lib/librte_eal/windows/include/rte_windows_thread_types.h
index ebd3d9e8f..8cb4b3856 100644
--- a/lib/librte_eal/windows/include/rte_windows_thread_types.h
+++ b/lib/librte_eal/windows/include/rte_windows_thread_types.h
@@ -7,6 +7,9 @@
#include <rte_windows.h>
+#define EAL_THREAD_PRIORITY_NORMAL THREAD_PRIORITY_NORMAL
+#define EAL_THREAD_PRIORITY_REALTIME_CIRTICAL THREAD_PRIORITY_TIME_CRITICAL
+
typedef DWORD rte_thread_t;
#endif /* _RTE_THREAD_TYPES_H_ */
diff --git a/lib/librte_eal/windows/rte_thread.c b/lib/librte_eal/windows/rte_thread.c
index 43c09b2f3..d0294d179 100644
--- a/lib/librte_eal/windows/rte_thread.c
+++ b/lib/librte_eal/windows/rte_thread.c
@@ -24,6 +24,62 @@ rte_thread_equal(rte_thread_t t1, rte_thread_t t2)
return t1 == t2 ? 1 : 0;
}
+int
+rte_thread_attr_init(rte_thread_attr_t *attr)
+{
+ if (attr == NULL) {
+ RTE_LOG(DEBUG, EAL,
+ "Unable to init thread attributes, invalid parameter\n");
+ return EINVAL;
+ }
+
+ attr->priority = RTE_THREAD_PRIORITY_NORMAL;
+ CPU_ZERO(&attr->cpuset);
+ return 0;
+}
+
+int
+rte_thread_attr_set_affinity(rte_thread_attr_t *thread_attr,
+ rte_cpuset_t *cpuset)
+{
+ if (thread_attr == NULL) {
+ RTE_LOG(DEBUG, EAL,
+ "Unable to set affinity attribute, invalid parameter\n");
+ 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) {
+ RTE_LOG(DEBUG, EAL,
+ "Unable to set affinity attribute, invalid parameter\n");
+ 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) {
+ RTE_LOG(DEBUG, EAL,
+ "Unable to set priority attribute, invalid parameter\n");
+ return EINVAL;
+ }
+
+ thread_attr->priority = priority;
+ return 0;
+}
+
int
rte_thread_tls_key_create(rte_tls_key *key,
__rte_unused void (*destructor)(void *))
--
2.30.0.vfs.0.2
More information about the dev
mailing list