eal: add cpuset into lcore config
authorCunming Liang <cunming.liang@intel.com>
Tue, 17 Feb 2015 02:07:58 +0000 (10:07 +0800)
committerThomas Monjalon <thomas.monjalon@6wind.com>
Tue, 24 Feb 2015 19:21:54 +0000 (20:21 +0100)
The patch adds 'cpuset' into per-lcore configure 'lcore_config[]',
as the lcore no longer always 1:1 pinning with physical cpu.
The lcore now stands for a EAL thread rather than a logical cpu.

It doesn't change the default behavior of 1:1 mapping, but allows to
affinity the EAL thread to multiple cpus.

Signed-off-by: Cunming Liang <cunming.liang@intel.com>
Acked-by: Olivier Matz <olivier.matz@6wind.com>
Acked-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
lib/librte_eal/bsdapp/eal/eal_lcore.c
lib/librte_eal/common/include/rte_lcore.h
lib/librte_eal/linuxapp/eal/Makefile
lib/librte_eal/linuxapp/eal/eal_lcore.c

index 662f024..72f8ac2 100644 (file)
@@ -76,11 +76,18 @@ rte_eal_cpu_init(void)
         * ones and enable them by default.
         */
        for (lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id++) {
+               /* init cpuset for per lcore config */
+               CPU_ZERO(&lcore_config[lcore_id].cpuset);
+
                lcore_config[lcore_id].detected = (lcore_id < ncpus);
                if (lcore_config[lcore_id].detected == 0) {
                        config->lcore_role[lcore_id] = ROLE_OFF;
                        continue;
                }
+
+               /* By default, lcore 1:1 map to cpu id */
+               CPU_SET(lcore_id, &lcore_config[lcore_id].cpuset);
+
                /* By default, each detected core is enabled */
                config->lcore_role[lcore_id] = ROLE_RTE;
                lcore_config[lcore_id].core_id = cpu_core_id(lcore_id);
index 49b2c03..4c7d6bb 100644 (file)
@@ -50,6 +50,13 @@ extern "C" {
 
 #define LCORE_ID_ANY -1    /**< Any lcore. */
 
+#if defined(__linux__)
+       typedef cpu_set_t rte_cpuset_t;
+#elif defined(__FreeBSD__)
+#include <pthread_np.h>
+       typedef cpuset_t rte_cpuset_t;
+#endif
+
 /**
  * Structure storing internal configuration (per-lcore)
  */
@@ -65,6 +72,7 @@ struct lcore_config {
        unsigned socket_id;        /**< physical socket id for this lcore */
        unsigned core_id;          /**< core number on socket for this lcore */
        int core_index;            /**< relative index, starting from 0 */
+       rte_cpuset_t cpuset;       /**< cpu set which the lcore affinity to */
 };
 
 /**
index e117cec..1b6c484 100644 (file)
@@ -91,6 +91,7 @@ SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) += eal_common_dev.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) += eal_common_options.c
 
 CFLAGS_eal.o := -D_GNU_SOURCE
+CFLAGS_eal_lcore.o := -D_GNU_SOURCE
 CFLAGS_eal_thread.o := -D_GNU_SOURCE
 CFLAGS_eal_log.o := -D_GNU_SOURCE
 CFLAGS_eal_common_log.o := -D_GNU_SOURCE
index c67e0e6..29615f8 100644 (file)
@@ -158,11 +158,19 @@ rte_eal_cpu_init(void)
         * ones and enable them by default.
         */
        for (lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id++) {
+               /* init cpuset for per lcore config */
+               CPU_ZERO(&lcore_config[lcore_id].cpuset);
+
+               /* in 1:1 mapping, record related cpu detected state */
                lcore_config[lcore_id].detected = cpu_detected(lcore_id);
                if (lcore_config[lcore_id].detected == 0) {
                        config->lcore_role[lcore_id] = ROLE_OFF;
                        continue;
                }
+
+               /* By default, lcore 1:1 map to cpu id */
+               CPU_SET(lcore_id, &lcore_config[lcore_id].cpuset);
+
                /* By default, each detected core is enabled */
                config->lcore_role[lcore_id] = ROLE_RTE;
                lcore_config[lcore_id].core_id = cpu_core_id(lcore_id);