diff options
| author | Qiuwen Lu <[email protected]> | 2019-08-15 13:46:25 +0800 |
|---|---|---|
| committer | Qiuwen Lu <[email protected]> | 2019-08-15 13:46:25 +0800 |
| commit | 01211d071a1a25044f932423e00374950dc5d193 (patch) | |
| tree | df4b6728df202b84ebb7886ae05c28df1f10b6b8 | |
| parent | 33302342ef6426826c27995ab5812adbf8f05301 (diff) | |
#19 增加对64核以上处理器的适配,改用CPU_SET_T表示线程亲和性。
| -rw-r--r-- | app/include/mrapp.h | 4 | ||||
| -rw-r--r-- | app/src/marsio.c | 28 | ||||
| -rw-r--r-- | include/external/marsio.h | 7 | ||||
| -rw-r--r-- | infra/include/common.h | 24 | ||||
| -rw-r--r-- | service/include/sc_common.h | 4 | ||||
| -rw-r--r-- | service/src/core.c | 10 | ||||
| -rw-r--r-- | service/src/fwd.c | 2 | ||||
| -rw-r--r-- | service/src/phydev.c | 8 | ||||
| -rw-r--r-- | tunnat/include/tunnat.h | 2 | ||||
| -rw-r--r-- | tunnat/src/core.cc | 7 |
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]; |
