[dpdk-dev,v8,06/19] eal: new TLS definition and API declaration
Commit Message
1. add two TLS *_socket_id* and *_cpuset*
2. add one internal API, eal_cpu_socket_id/eal_thread_dump_affinity
3. add two public API, rte_thread_set/get_affinity
4. update EAL version map for EAL public API
Signed-off-by: Cunming Liang <cunming.liang@intel.com>
---
v7 changes:
update version map for EAL public API and reword comments
v5 changes:
add comments for RTE_CPU_AFFINITY_STR_LEN
update comments for eal_thread_dump_affinity()
return void for rte_thread_get_affinity()
move rte_socket_id() change to another patch
lib/librte_eal/bsdapp/eal/eal_thread.c | 2 ++
lib/librte_eal/bsdapp/eal/rte_eal_version.map | 2 ++
lib/librte_eal/common/eal_thread.h | 36 +++++++++++++++++++++++++
lib/librte_eal/common/include/rte_lcore.h | 26 +++++++++++++++++-
lib/librte_eal/linuxapp/eal/eal_thread.c | 2 ++
lib/librte_eal/linuxapp/eal/rte_eal_version.map | 2 ++
6 files changed, 69 insertions(+), 1 deletion(-)
@@ -56,6 +56,8 @@
#include "eal_thread.h"
RTE_DEFINE_PER_LCORE(unsigned, _lcore_id);
+RTE_DEFINE_PER_LCORE(unsigned, _socket_id);
+RTE_DEFINE_PER_LCORE(rte_cpuset_t, _cpuset);
/*
* Send a message to a slave lcore identified by slave_id to call a
@@ -82,6 +82,8 @@ DPDK_2.0 {
rte_snprintf;
rte_strerror;
rte_strsplit;
+ rte_thread_get_affinity;
+ rte_thread_set_affinity;
rte_vlog;
rte_xen_dom0_memory_attach;
rte_xen_dom0_memory_init;
@@ -34,6 +34,8 @@
#ifndef EAL_THREAD_H
#define EAL_THREAD_H
+#include <rte_lcore.h>
+
/**
* basic loop of thread, called for each thread by eal_init().
*
@@ -61,4 +63,38 @@ void eal_thread_init_master(unsigned lcore_id);
*/
unsigned eal_cpu_socket_id(unsigned cpu_id);
+/**
+ * Get the NUMA socket id from cpuset.
+ * This function is private to EAL.
+ *
+ * @param cpusetp
+ * The point to a valid cpu set.
+ * @return
+ * socket_id or SOCKET_ID_ANY
+ */
+int eal_cpuset_socket_id(rte_cpuset_t *cpusetp);
+
+/**
+ * Default buffer size to use with eal_thread_dump_affinity()
+ */
+#define RTE_CPU_AFFINITY_STR_LEN 256
+
+/**
+ * Dump the current pthread cpuset.
+ * This function is private to EAL.
+ *
+ * Note:
+ * If the dump size is greater than the size of given buffer,
+ * the string will be truncated and with '\0' at the end.
+ *
+ * @param str
+ * The string buffer the cpuset will dump to.
+ * @param size
+ * The string buffer size.
+ * @return
+ * 0 for success, -1 if truncation happens.
+ */
+int
+eal_thread_dump_affinity(char *str, unsigned size);
+
#endif /* EAL_THREAD_H */
@@ -80,7 +80,9 @@ struct lcore_config {
*/
extern struct lcore_config lcore_config[RTE_MAX_LCORE];
-RTE_DECLARE_PER_LCORE(unsigned, _lcore_id); /**< Per core "core id". */
+RTE_DECLARE_PER_LCORE(unsigned, _lcore_id); /**< Per thread "lcore id". */
+RTE_DECLARE_PER_LCORE(unsigned, _socket_id); /**< Per thread "socket id". */
+RTE_DECLARE_PER_LCORE(rte_cpuset_t, _cpuset); /**< Per thread "cpuset". */
/**
* Return the ID of the execution unit we are running on.
@@ -229,6 +231,28 @@ rte_get_next_lcore(unsigned i, int skip_master, int wrap)
i<RTE_MAX_LCORE; \
i = rte_get_next_lcore(i, 1, 0))
+/**
+ * Set core affinity of the current thread.
+ * Support both EAL and none-EAL thread and update TLS.
+ *
+ * @param cpusetp
+ * Point to cpu_set_t for setting current thread affinity.
+ * @return
+ * On success, return 0; otherwise return -1;
+ */
+int rte_thread_set_affinity(rte_cpuset_t *cpusetp);
+
+/**
+ * Get core affinity of the current thread.
+ *
+ * @param cpusetp
+ * Point to cpu_set_t for getting current thread cpu affinity.
+ * It presumes input is not NULL, otherwise it causes panic.
+ *
+ */
+void rte_thread_get_affinity(rte_cpuset_t *cpusetp);
+
+
#ifdef __cplusplus
}
#endif
@@ -56,6 +56,8 @@
#include "eal_thread.h"
RTE_DEFINE_PER_LCORE(unsigned, _lcore_id);
+RTE_DEFINE_PER_LCORE(unsigned, _socket_id);
+RTE_DEFINE_PER_LCORE(rte_cpuset_t, _cpuset);
/*
* Send a message to a slave lcore identified by slave_id to call a
@@ -82,6 +82,8 @@ DPDK_2.0 {
rte_snprintf;
rte_strerror;
rte_strsplit;
+ rte_thread_get_affinity;
+ rte_thread_set_affinity;
rte_vlog;
rte_xen_dom0_memory_attach;
rte_xen_dom0_memory_init;