summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQiuwen Lu <[email protected]>2019-08-15 13:46:25 +0800
committerQiuwen Lu <[email protected]>2019-08-15 13:46:25 +0800
commit01211d071a1a25044f932423e00374950dc5d193 (patch)
treedf4b6728df202b84ebb7886ae05c28df1f10b6b8
parent33302342ef6426826c27995ab5812adbf8f05301 (diff)
#19 增加对64核以上处理器的适配,改用CPU_SET_T表示线程亲和性。
-rw-r--r--app/include/mrapp.h4
-rw-r--r--app/src/marsio.c28
-rw-r--r--include/external/marsio.h7
-rw-r--r--infra/include/common.h24
-rw-r--r--service/include/sc_common.h4
-rw-r--r--service/src/core.c10
-rw-r--r--service/src/fwd.c2
-rw-r--r--service/src/phydev.c8
-rw-r--r--tunnat/include/tunnat.h2
-rw-r--r--tunnat/src/core.cc7
10 files changed, 58 insertions, 38 deletions
diff --git a/app/include/mrapp.h b/app/include/mrapp.h
index 55bb24f..dac3f0a 100644
--- a/app/include/mrapp.h
+++ b/app/include/mrapp.h
@@ -111,7 +111,7 @@ struct mr_instance
/* 是否发送免费ARP */
unsigned int nr_gratuitous_arp_send;
/* 核心掩码 */
- cpu_mask_t cpu_mask;
+ cpu_set_t cpu_set;
/* 线程初始化锁 */
pthread_mutex_t lock_thread_init;
/* 当前待分配的线程ID */
@@ -131,4 +131,4 @@ int mrapp_monit_loop(struct mr_instance * instance);
int mrapp_packet_send_burst(struct vdev_instance * vdi, queue_id_t qid, struct rte_mbuf * mbufs[], int nr_mbufs);
-int mrapp_packet_fast_send_burst(struct vdev_instance * vdi, queue_id_t qid, struct rte_mbuf * mbufs[], int nr_mbufs); \ No newline at end of file
+int mrapp_packet_fast_send_burst(struct vdev_instance * vdi, queue_id_t qid, struct rte_mbuf * mbufs[], int nr_mbufs);
diff --git a/app/src/marsio.c b/app/src/marsio.c
index fd3641e..48b506b 100644
--- a/app/src/marsio.c
+++ b/app/src/marsio.c
@@ -801,6 +801,14 @@ void marsio_close_device(struct mr_vdev * vdev)
return;
}
+static void mask_to_cpuset(uint64_t mask, cpu_set_t * cpusetp)
+{
+ for (unsigned long bit_iter = 0; bit_iter < sizeof(mask) * 8; bit_iter++)
+ {
+ if ((mask & (1ULL << bit_iter))) CPU_SET(bit_iter, cpusetp);
+ }
+}
+
int marsio_option_set(struct mr_instance * instance, marsio_opt_type_t opt_type, void * opt, size_t sz_opt)
{
@@ -819,7 +827,13 @@ int marsio_option_set(struct mr_instance * instance, marsio_opt_type_t opt_type,
case MARSIO_OPT_THREAD_MASK:
__CHECK_USER_PARAM(uint64_t);
- instance->cpu_mask = *(uint64_t *)opt;
+ uint64_t mask = *(uint64_t *)opt;
+ mask_to_cpuset(mask, &instance->cpu_set);
+ ret = 0; break;
+
+ case MARSIO_OPT_THREAD_MASK_IN_CPUSET:
+ __CHECK_USER_PARAM(cpu_set_t);
+ instance->cpu_set = *(cpu_set_t *)opt;
ret = 0; break;
case MARSIO_OPT_EXIT_WHEN_ERR:
@@ -870,8 +884,10 @@ int marsio_init(struct mr_instance * instance, const char * appsym)
pthread_mutex_init(&instance->lock_thread_init, NULL);
/* 根据CPU_MASK计算线程数 */
- if (instance->nr_dataplane_thread == 0 && instance->cpu_mask != 0)
- instance->nr_dataplane_thread = mask_popcnt(instance->cpu_mask);
+ if (instance->nr_dataplane_thread == 0 && CPU_COUNT(&instance->cpu_set) != 0)
+ {
+ instance->nr_dataplane_thread = CPU_COUNT(&instance->cpu_set);
+ }
if (mrapp_gconf_init(instance) != RT_SUCCESS)
{
@@ -957,7 +973,7 @@ int marsio_thread_init(struct mr_instance * instance)
return RT_ERR;
}
- if (instance->cpu_mask == 0)
+ if (CPU_COUNT(&instance->cpu_set) == 0)
{
MR_DEBUG("CPU mask is zero, thread affinity is not allowed.");
return RT_SUCCESS;
@@ -967,7 +983,7 @@ int marsio_thread_init(struct mr_instance * instance)
pthread_mutex_lock(&instance->lock_thread_init);
/* 线程绑定 */
- cpu_id_t cpu_id = mask_location(instance->cpu_mask, instance->to_suppose_tid);
+ cpu_id_t cpu_id = cpu_set_location(&instance->cpu_set, instance->to_suppose_tid);
if (cpu_id < 0)
{
MR_ERROR("Too many threads call thread init, supposed tid is %d", instance->to_suppose_tid);
@@ -1006,4 +1022,4 @@ out:
int marsio_destory(struct mr_instance * instance)
{
return 0;
-} \ No newline at end of file
+}
diff --git a/include/external/marsio.h b/include/external/marsio.h
index fc971c8..6a08331 100644
--- a/include/external/marsio.h
+++ b/include/external/marsio.h
@@ -28,6 +28,11 @@ typedef enum
*/
MARSIO_OPT_EXIT_WHEN_ERR,
+ /* 拓展数据面线程绑定掩码,适应大于64个核处理器的硬件平台
+ * 设置该掩码后,数据面线程数选项将被忽略
+ */
+ MARSIO_OPT_THREAD_MASK_IN_CPUSET,
+
} marsio_opt_type_t;
typedef enum
@@ -254,4 +259,4 @@ void marsio_shared_mem_free(struct mr_instance * instance, void * mem);
#ifdef __cplusplus
}
-#endif \ No newline at end of file
+#endif
diff --git a/infra/include/common.h b/infra/include/common.h
index c22ed5a..b0434ee 100644
--- a/infra/include/common.h
+++ b/infra/include/common.h
@@ -242,19 +242,19 @@ static unsigned int inline mask_is_set(mask_t mask, unsigned int id)
return !!(mask & (1ULL << id));
}
-static int inline mask_location(mask_t mask, unsigned int id)
+static int inline cpu_set_location(cpu_set_t * cpu_set_p, unsigned int id)
{
- unsigned int bit_count = 0;
- for (unsigned bit_iter = 0; bit_iter < sizeof(mask) * 8; bit_iter++)
- {
- if ((mask & (1ULL << bit_iter)))
- {
- if (bit_count == id) return bit_iter;
- else bit_count++;
- }
- }
+ unsigned int bit_count = 0;
+ for (unsigned bit_iter = 0; bit_iter < CPU_COUNT(cpu_set_p); bit_iter++)
+ {
+ if (CPU_ISSET(bit_iter, cpu_set_p))
+ {
+ if (bit_count == id) return bit_iter;
+ else bit_count++;
+ }
+ }
- return -1;
+ return -1;
}
static int inline str_to_mask(const char * str, mask_t * out_mask)
@@ -344,4 +344,4 @@ static inline int mr_thread_setname(pthread_t id, const char *name)
#ifdef __cplusplus
}
-#endif \ No newline at end of file
+#endif
diff --git a/service/include/sc_common.h b/service/include/sc_common.h
index 5f7b3b7..f956451 100644
--- a/service/include/sc_common.h
+++ b/service/include/sc_common.h
@@ -50,7 +50,7 @@ struct sc_main
/* 状态监测文件 */
char local_monitfile[MR_STRING_MAX];
/* CPU掩码,本进程在这个CPU上运行 */
- cpu_mask_t cpu_mask;
+ cpu_set_t cpu_set;
/* Master线程的CPU亲和性设置(EAL之前) */
cpu_set_t cpu_set_before_eal;
/* Master线程的CPU亲和性设置(EAL之后) */
@@ -105,4 +105,4 @@ struct sc_main
};
struct sc_main * sc_main_get();
-extern unsigned int g_keep_running; \ No newline at end of file
+extern unsigned int g_keep_running;
diff --git a/service/src/core.c b/service/src/core.c
index e1dda1e..76225a3 100644
--- a/service/src/core.c
+++ b/service/src/core.c
@@ -270,7 +270,7 @@ void sc_config_dump(struct sc_main * sc)
{
MR_INFO(" ");
MR_INFO("Runtime Information");
- MR_INFO(" Dataplane thread count : %d", mask_popcnt(sc->cpu_mask));
+ MR_INFO(" Dataplane thread count : %d", CPU_COUNT(&sc->cpu_set));
MR_INFO(" Packet burst on RX direction : %d", sc->nr_rx_burst);
MR_INFO(" Packet burst on TX direction : %d", sc->nr_tx_burst);
MR_INFO(" Packet distribute mode : %s", ldbc_str_dist_mode(sc->dist_object));
@@ -369,12 +369,14 @@ static void sc_eal_init(struct sc_main * sc, const char * cmd)
/* After EAL, copy some parameters to sc_main */
unsigned int lcore_id = 0;
+ CPU_ZERO(&sc->cpu_set);
+
RTE_LCORE_FOREACH(lcore_id)
{
- sc->cpu_mask |= 1ULL << lcore_id;
+ CPU_SET(lcore_id, &sc->cpu_set);
}
- sc->nr_serv_thread = mask_popcnt(sc->cpu_mask);
+ sc->nr_serv_thread = CPU_COUNT(&sc->cpu_set);
/* EAL初始化后的线程亲和性 */
ret = pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), &sc->cpu_set_after_eal);
@@ -864,4 +866,4 @@ quit:
phydev_deinit(sc);
if(pdump_inited) rte_pdump_uninit();
return 0;
-} \ No newline at end of file
+}
diff --git a/service/src/fwd.c b/service/src/fwd.c
index 2f7d639..3f0ecd7 100644
--- a/service/src/fwd.c
+++ b/service/src/fwd.c
@@ -299,7 +299,7 @@ static int forward_rule_setup(struct sc_main * sc, struct sw_forward_main * fwd_
//TODO: 队列映射
for (int i = 0; i < sc->nr_serv_thread; i++)
{
- int ret = mask_location(sc->cpu_mask, i);
+ int ret = cpu_set_location(&sc->cpu_set, i);
fwd_rule->map_rx_queue[ret] = i;
fwd_rule->map_tx_queue[ret] = i;
MR_VERIFY(ret >= 0);
diff --git a/service/src/phydev.c b/service/src/phydev.c
index e082dbf..1303868 100644
--- a/service/src/phydev.c
+++ b/service/src/phydev.c
@@ -255,13 +255,11 @@ static int phydev_setup(struct sc_main * sc,
unsigned nr_txq_use = 0;
// TODO: 目前实现按每个服务线程处理一个队列考虑
- dev->nr_rxq = mask_popcnt(sc->cpu_mask);
- dev->nr_txq = mask_popcnt(sc->cpu_mask);
+ dev->nr_rxq = CPU_COUNT(&sc->cpu_set);
+ dev->nr_txq = CPU_COUNT(&sc->cpu_set);
calc_phydev_queue(dev, &nr_rxq_use, &nr_txq_use);
- retval = rte_eth_dev_configure(dev->port_id, nr_rxq_use,
- nr_txq_use, &local_eth_conf);
-
+ retval = rte_eth_dev_configure(dev->port_id, nr_rxq_use, nr_txq_use, &local_eth_conf);
if (retval != 0)
{
MR_ERROR("Physical device %s configure error: %s, errno = %d", dev->symbol,
diff --git a/tunnat/include/tunnat.h b/tunnat/include/tunnat.h
index 7749dc5..7e31a45 100644
--- a/tunnat/include/tunnat.h
+++ b/tunnat/include/tunnat.h
@@ -90,7 +90,7 @@ struct TunnatInstance
/* Burst数量 */
unsigned int nr_burst{MR_TUNNAT_DEFAULT_NR_BURST};
/* 运行数据面线程核心掩码 */
- cpu_mask_t coremask{0};
+ cpu_set_t coremask{};
/* 会话表使用四元组还是二元组 */
unsigned int sess_tb_order_by_tuple4{MR_TUNNAT_DEFAULT_SESSION_TUPLE4};
diff --git a/tunnat/src/core.cc b/tunnat/src/core.cc
index a70b31b..23d7223 100644
--- a/tunnat/src/core.cc
+++ b/tunnat/src/core.cc
@@ -279,14 +279,13 @@ int tunnat_mrinstance_setup(TunnatInstance * instance)
return RT_ERR;
}
- uint64_t coremask = 0;
+ CPU_ZERO(&instance->coremask);
for (int i = 0; i < lcore_id_count; i++)
{
- coremask |= 1ULL << lcore_id_range[i];
+ CPU_SET(lcore_id_range[i], &instance->coremask);
}
- instance->coremask = coremask;
- instance->nr_thread = mask_popcnt(instance->coremask);
+ instance->nr_thread = CPU_COUNT(&instance->coremask);
// 读应用名称
char cstr_appsym[MR_STRING_MAX];