[dpdk-dev] [PATCH v6 06/19] eal: new TLS definition and API declaration
Hi, > -Original Message- > From: Neil Horman [mailto:nhorman at tuxdriver.com] > Sent: Friday, February 13, 2015 9:58 PM > To: Liang, Cunming > Cc: dev at dpdk.org > Subject: Re: [dpdk-dev] [PATCH v6 06/19] eal: new TLS definition and API > declaration > > On Fri, Feb 13, 2015 at 09:38:08AM +0800, Cunming Liang wrote: > > 1. add two TLS *_socket_id* and *_cpuset* > > 2. add two external API rte_thread_set/get_affinity > > 3. add one internal API eal_thread_dump_affinity > > > > Signed-off-by: Cunming Liang > > --- > > 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/common/eal_thread.h| 36 > +++ > > lib/librte_eal/common/include/rte_lcore.h | 26 +- > > lib/librte_eal/linuxapp/eal/eal_thread.c | 2 ++ > > 4 files changed, 65 insertions(+), 1 deletion(-) > > > > diff --git a/lib/librte_eal/bsdapp/eal/eal_thread.c > b/lib/librte_eal/bsdapp/eal/eal_thread.c > > index ab05368..10220c7 100644 > > --- a/lib/librte_eal/bsdapp/eal/eal_thread.c > > +++ b/lib/librte_eal/bsdapp/eal/eal_thread.c > > @@ -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 > > diff --git a/lib/librte_eal/common/eal_thread.h > b/lib/librte_eal/common/eal_thread.h > > index f1ce0bd..e4e76b9 100644 > > --- a/lib/librte_eal/common/eal_thread.h > > +++ b/lib/librte_eal/common/eal_thread.h > > @@ -34,6 +34,8 @@ > > #ifndef EAL_THREAD_H > > #define EAL_THREAD_H > > > > +#include > > + > > /** > > * 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_LEN256 > > + > > +/** > > + * 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 */ > > diff --git a/lib/librte_eal/common/include/rte_lcore.h > b/lib/librte_eal/common/include/rte_lcore.h > > index 4c7d6bb..33f558e 100644 > > --- a/lib/librte_eal/common/include/rte_lcore.h > > +++ b/lib/librte_eal/common/include/rte_lcore.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. > > + * > >
[dpdk-dev] [PATCH v6 06/19] eal: new TLS definition and API declaration
On Sun, Feb 15, 2015 at 01:13:07AM +, Liang, Cunming wrote: > Hi, > > > -Original Message- > > From: Neil Horman [mailto:nhorman at tuxdriver.com] > > Sent: Friday, February 13, 2015 9:58 PM > > To: Liang, Cunming > > Cc: dev at dpdk.org > > Subject: Re: [dpdk-dev] [PATCH v6 06/19] eal: new TLS definition and API > > declaration > > > > On Fri, Feb 13, 2015 at 09:38:08AM +0800, Cunming Liang wrote: > > > 1. add two TLS *_socket_id* and *_cpuset* > > > 2. add two external API rte_thread_set/get_affinity > > > 3. add one internal API eal_thread_dump_affinity > > > > > > Signed-off-by: Cunming Liang > > > --- > > > 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/common/eal_thread.h| 36 > > +++ > > > lib/librte_eal/common/include/rte_lcore.h | 26 +- > > > lib/librte_eal/linuxapp/eal/eal_thread.c | 2 ++ > > > 4 files changed, 65 insertions(+), 1 deletion(-) > > > > > > diff --git a/lib/librte_eal/bsdapp/eal/eal_thread.c > > b/lib/librte_eal/bsdapp/eal/eal_thread.c > > > index ab05368..10220c7 100644 > > > --- a/lib/librte_eal/bsdapp/eal/eal_thread.c > > > +++ b/lib/librte_eal/bsdapp/eal/eal_thread.c > > > @@ -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 > > > diff --git a/lib/librte_eal/common/eal_thread.h > > b/lib/librte_eal/common/eal_thread.h > > > index f1ce0bd..e4e76b9 100644 > > > --- a/lib/librte_eal/common/eal_thread.h > > > +++ b/lib/librte_eal/common/eal_thread.h > > > @@ -34,6 +34,8 @@ > > > #ifndef EAL_THREAD_H > > > #define EAL_THREAD_H > > > > > > +#include > > > + > > > /** > > > * 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_LEN256 > > > + > > > +/** > > > + * 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 */ > > > diff --git a/lib/librte_eal/common/include/rte_lcore.h > > b/lib/librte_eal/common/include/rte_lcore.h > > > index 4c7d6bb..33f558e 100644 > > > --- a/lib/librte_eal/common/include/rte_lcore.h > > > +++ b/lib/librte_eal/common/include/rte_lcore.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&q
[dpdk-dev] [PATCH v6 06/19] eal: new TLS definition and API declaration
1. add two TLS *_socket_id* and *_cpuset* 2. add two external API rte_thread_set/get_affinity 3. add one internal API eal_thread_dump_affinity Signed-off-by: Cunming Liang --- 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/common/eal_thread.h| 36 +++ lib/librte_eal/common/include/rte_lcore.h | 26 +- lib/librte_eal/linuxapp/eal/eal_thread.c | 2 ++ 4 files changed, 65 insertions(+), 1 deletion(-) diff --git a/lib/librte_eal/bsdapp/eal/eal_thread.c b/lib/librte_eal/bsdapp/eal/eal_thread.c index ab05368..10220c7 100644 --- a/lib/librte_eal/bsdapp/eal/eal_thread.c +++ b/lib/librte_eal/bsdapp/eal/eal_thread.c @@ -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 diff --git a/lib/librte_eal/common/eal_thread.h b/lib/librte_eal/common/eal_thread.h index f1ce0bd..e4e76b9 100644 --- a/lib/librte_eal/common/eal_thread.h +++ b/lib/librte_eal/common/eal_thread.h @@ -34,6 +34,8 @@ #ifndef EAL_THREAD_H #define EAL_THREAD_H +#include + /** * 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_LEN256 + +/** + * 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 */ diff --git a/lib/librte_eal/common/include/rte_lcore.h b/lib/librte_eal/common/include/rte_lcore.h index 4c7d6bb..33f558e 100644 --- a/lib/librte_eal/common/include/rte_lcore.h +++ b/lib/librte_eal/common/include/rte_lcore.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
[dpdk-dev] [PATCH v6 06/19] eal: new TLS definition and API declaration
On Fri, Feb 13, 2015 at 09:38:08AM +0800, Cunming Liang wrote: > 1. add two TLS *_socket_id* and *_cpuset* > 2. add two external API rte_thread_set/get_affinity > 3. add one internal API eal_thread_dump_affinity > > Signed-off-by: Cunming Liang > --- > 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/common/eal_thread.h| 36 > +++ > lib/librte_eal/common/include/rte_lcore.h | 26 +- > lib/librte_eal/linuxapp/eal/eal_thread.c | 2 ++ > 4 files changed, 65 insertions(+), 1 deletion(-) > > diff --git a/lib/librte_eal/bsdapp/eal/eal_thread.c > b/lib/librte_eal/bsdapp/eal/eal_thread.c > index ab05368..10220c7 100644 > --- a/lib/librte_eal/bsdapp/eal/eal_thread.c > +++ b/lib/librte_eal/bsdapp/eal/eal_thread.c > @@ -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 > diff --git a/lib/librte_eal/common/eal_thread.h > b/lib/librte_eal/common/eal_thread.h > index f1ce0bd..e4e76b9 100644 > --- a/lib/librte_eal/common/eal_thread.h > +++ b/lib/librte_eal/common/eal_thread.h > @@ -34,6 +34,8 @@ > #ifndef EAL_THREAD_H > #define EAL_THREAD_H > > +#include > + > /** > * 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_LEN256 > + > +/** > + * 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 */ > diff --git a/lib/librte_eal/common/include/rte_lcore.h > b/lib/librte_eal/common/include/rte_lcore.h > index 4c7d6bb..33f558e 100644 > --- a/lib/librte_eal/common/include/rte_lcore.h > +++ b/lib/librte_eal/common/include/rte_lcore.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) >ii = 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 > diff --git a/lib/librte_eal/linuxapp/eal/eal_thread.c > b/lib/librte_eal/linuxapp/eal/eal_thread.c > index 80a985f..748a83a 100644 > --- a/lib/librte_eal/linuxapp/eal/eal_thread.c > +++ b/lib/librte_eal/linuxapp/eal/eal_thread.c > @@ -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 > -- > 1.8.1.4 > > All of these exported functions need to be exported in the version map. Also, I don't think its a good idea to simply expose the per lcore cpuset variables. It