diff options
| author | Qiuwen Lu <[email protected]> | 2017-06-10 20:34:35 +0800 |
|---|---|---|
| committer | Qiuwen Lu <[email protected]> | 2017-06-10 20:34:35 +0800 |
| commit | 0331de962d2513e8778c2723f07fd4583215265c (patch) | |
| tree | df6a92deb60c26a1e80ad9b1af005abb8bfee151 | |
| parent | 9a496b105eba1d25b41d9a12a21412d09fd7818e (diff) | |
实现用户自定义内存池分配方式。
| -rw-r--r-- | service/include/sc_phydev.h | 4 | ||||
| -rw-r--r-- | service/src/core.c | 4 | ||||
| -rw-r--r-- | service/src/mrb.c | 88 | ||||
| -rw-r--r-- | service/src/phydev.c | 15 | ||||
| -rw-r--r-- | service/src/vdev.c | 18 |
5 files changed, 112 insertions, 17 deletions
diff --git a/service/include/sc_phydev.h b/service/include/sc_phydev.h index fc97c41..7ab671b 100644 --- a/service/include/sc_phydev.h +++ b/service/include/sc_phydev.h @@ -162,6 +162,10 @@ struct phydev /* 物理队列数 */ unsigned int nr_txq; + /* 报文缓冲区符号 */ + char str_direct_pool[MR_SYMBOL_MAX]; + char str_indirect_pool[MR_SYMBOL_MAX]; + /* 报文缓冲区 */ struct rte_mempool * direct_pool; struct rte_mempool * indirect_pool; diff --git a/service/src/core.c b/service/src/core.c index 361dc00..0aeb5f2 100644 --- a/service/src/core.c +++ b/service/src/core.c @@ -482,6 +482,8 @@ int main(int argc, char * argv[]) } } + unsigned int pdump_inited = 0; + if(g_logger_to_stdout) fprintf(stdout, "%s\n", mr_logo); MR_INFO("MARSIO ZeroCopy Packet I/O Driver, Version: %s, Using %s", service_git_version, rte_version()); @@ -567,8 +569,6 @@ int main(int argc, char * argv[]) vdev_dump(sc); sw_fwd_dump(sc); - unsigned int pdump_inited = 0; - if (rte_pdump_init(NULL) != 0) { MR_WARNING("Packet dump library initialization failed."); diff --git a/service/src/mrb.c b/service/src/mrb.c index c964db6..c46f25b 100644 --- a/service/src/mrb.c +++ b/service/src/mrb.c @@ -54,6 +54,10 @@ enum mrb_create_mode #define MRB_POOL_DEFAULT_SZ_CACHE 256 #endif +#ifndef MRB_POOL_COUNT_MAX +#define MRB_POOL_COUNT_MAX 16 +#endif + struct mrb_pool { TAILQ_ENTRY(mrb_pool) next; @@ -162,6 +166,33 @@ static int __rte_unused ctrlzone_lookup(struct mrb_main * ctx, const char* cz_sy return -1; } +/* 虚设备用户配置查询 */ +static int __query_mempool_list(struct sc_main * sc, + char vdevsyms[MR_SYMBOL_MAX][MRB_POOL_COUNT_MAX], unsigned int * nr_pools) +{ + char str_pool[MR_STRING_MAX] = { 0 }; + int ret = MESA_load_profile_string_nodef(sc->local_cfgfile, "pool", "pool", + str_pool, sizeof(str_pool)); + + if (ret < 0) + { + *nr_pools = 0; + return RT_SUCCESS; + } + + char * str_pool_symbol[MR_TOKENS_MAX]; + int nr_str_tokens = rte_strsplit(str_pool, sizeof(str_pool), str_pool_symbol, MR_TOKENS_MAX, ','); + + for (int i = 0; i < nr_str_tokens; i++) + { + MR_VERIFY(i < MR_VDEV_MAX); + snprintf(vdevsyms[i], sizeof(vdevsyms[i]), "%s", str_pool_symbol[i]); + } + + *nr_pools = nr_str_tokens; + return RT_SUCCESS; +} + static struct rte_mempool * __create_pktmbuf_pool(struct mrb_main * ctx, const char * symbol, unsigned int socket_id, unsigned int sz_pool, unsigned int sz_data, unsigned int sz_cache) { @@ -188,6 +219,11 @@ do { \ MESA_load_profile_uint_def(cfgfile, section, _key, _value, _d_value); \ } while(0) \ +#define _load_int(_key, _value, _d_value) \ +do { \ + MESA_load_profile_int_def(cfgfile, section, _key, _value, _d_value); \ +} while(0) + #define __LOCATE_TYPE_DIRECT_POOL 0 #define __LOCATE_TYPE_INDIRECT_POOL 1 @@ -310,8 +346,54 @@ int mrb_pool_adapter_config_by_lcore(struct mrb_pool_adapter * adapter, struct m int mrb_pool_adapter_config_by_user(struct mrb_pool_adapter * adapter, struct mrb_main * ctx) { - assert(0); - return 0; + struct sc_main * sc = sc_main_get(); + const char * cfgfile = sc->local_cfgfile; + + char str_pool_symbols[MR_SYMBOL_MAX][MRB_POOL_COUNT_MAX]; + unsigned int nr_pool_symbols = 0; + + int ret = __query_mempool_list(sc, str_pool_symbols, &nr_pool_symbols); + if (ret < 0 || nr_pool_symbols == 0) return RT_ERR; + + for (int i = 0; i < nr_pool_symbols; i++) + { + struct mrb_pool * m_pool = ZMALLOC(sizeof(struct mrb_pool)); + MR_VERIFY_MALLOC(m_pool); + + char section[MR_SYMBOL_MAX]; + snprintf(section, sizeof(section), "pool:%s", str_pool_symbols[i]); + + _load_uint("sz_direct_pktmbuf", &m_pool->sz_direct_pktmbuf, ctx->sz_direct_pktmbuf); + _load_uint("sz_indirect_pktmbuf", &m_pool->sz_indirect_pktmbuf, ctx->sz_indirect_pktmbuf); + _load_uint("sz_data", &m_pool->sz_data, ctx->sz_data); + _load_uint("sz_cache", &m_pool->sz_cache, ctx->sz_cache); + _load_int("socket_id", &m_pool->socket_id, SOCKET_ID_ANY); + + snprintf(m_pool->symbol, sizeof(m_pool->symbol), "%s", str_pool_symbols[i]); + TAILQ_INSERT_TAIL(&ctx->pool_list, m_pool, next); + } + + return RT_SUCCESS; +} + +struct rte_mempool * mrb_pool_adapter_locate_user(struct mrb_pool_adapter * adapter, + struct mrb_main * ctx, const char * symbol, unsigned int type, socket_id_t socket_id, cpu_id_t cpu_id) +{ + RTE_SET_USED(socket_id); + RTE_SET_USED(cpu_id); + RTE_SET_USED(adapter); + + struct mrb_pool * mrb_pool_iter = NULL; + TAILQ_FOREACH(mrb_pool_iter, &ctx->pool_list, next) + { + if (strncmp(symbol, mrb_pool_iter->symbol, sizeof(mrb_pool_iter->symbol)) == 0 && + __LOCATE_TYPE_DIRECT_POOL == type) return mrb_pool_iter->direct; + + if (strncmp(symbol, mrb_pool_iter->symbol, sizeof(mrb_pool_iter->symbol)) == 0 && + __LOCATE_TYPE_INDIRECT_POOL == type) return mrb_pool_iter->indirect; + } + + return NULL; } static struct mrb_pool_adapter adapter_create_by_single = @@ -351,7 +433,7 @@ static struct mrb_pool_adapter adapter_create_by_user = .create_mode = MRB_POOL_CREATE_MODE_USER, .fn_config = mrb_pool_adapter_config_by_user, .fn_create_pool = mrb_pool_adapter_create_pool_common, - .fn_locate_pool = NULL + .fn_locate_pool = mrb_pool_adapter_locate_user }; int mrb_ctrlzone_config(struct sc_main * sc) diff --git a/service/src/phydev.c b/service/src/phydev.c index 83f3591..88818ab 100644 --- a/service/src/phydev.c +++ b/service/src/phydev.c @@ -225,9 +225,9 @@ static int phydev_setup(struct sc_main * sc, socket_id_t socket_id = rte_eth_dev_socket_id(dev->port_id); struct rte_mempool * direct_pool = mrb_direct_mempool_locate( - sc->mrb_pool_main, dev->symbol, socket_id, 0); + sc->mrb_pool_main, dev->str_direct_pool, socket_id, 0); struct rte_mempool * indirect_pool = mrb_indirect_mempool_locate( - sc->mrb_pool_main, dev->symbol, socket_id, 0); + sc->mrb_pool_main, dev->str_indirect_pool, socket_id, 0); if(direct_pool == NULL || indirect_pool == NULL) { @@ -494,7 +494,16 @@ void phydev_config_by_g_cfg(struct phydev * phydev, const char * cfg) // 读混杂模式 MESA_load_profile_uint_def(cfg, str_section, "promisc", &phydev->promisc, phydev->promisc); - return; + // 读报文缓冲区名称 + memset(phydev->str_direct_pool, 0, sizeof(phydev->str_direct_pool)); + memset(phydev->str_indirect_pool, 0, sizeof(phydev->str_indirect_pool)); + + MESA_load_profile_string_def(cfg, str_section, "direct-pool", phydev->str_direct_pool, + sizeof(phydev->str_direct_pool), phydev->symbol); + MESA_load_profile_string_def(cfg, str_section, "indirect-pool", phydev->str_indirect_pool, + sizeof(phydev->str_indirect_pool), phydev->str_direct_pool); + + return; } /* 早期设备扫描,从HWFILE中获取设备定义的信息 */ diff --git a/service/src/vdev.c b/service/src/vdev.c index d0c2600..6ff0813 100644 --- a/service/src/vdev.c +++ b/service/src/vdev.c @@ -251,16 +251,16 @@ int vdev_usercfg_query_vdev_setup(struct sc_main * sc, const char * devsym, int vdev_usercfg_query_mempool(struct sc_main * sc, const char * devsym, char mempool_direct_pool[MR_SYMBOL_MAX], char mempool_indirect_pool[MR_SYMBOL_MAX]) { - char str_dev_section[MR_SYMBOL_MAX]; + char str_dev_section[MR_SYMBOL_MAX] = { 0 }; snprintf(str_dev_section, sizeof(str_dev_section), "device:%s", devsym); /* 没有定义直接内存池名称,使用设备名 */ - MESA_load_profile_string_def(sc->local_cfgfile, str_dev_section, "direct_mempool", - mempool_direct_pool, sizeof(mempool_direct_pool), devsym); + MESA_load_profile_string_def(sc->local_cfgfile, str_dev_section, "direct-pool", + mempool_direct_pool, MR_SYMBOL_MAX, devsym); /* 没有定义间接内存池名称,使用直接内存池名称 */ - MESA_load_profile_string_def(sc->local_cfgfile, str_dev_section, "indirect_mempool", - mempool_indirect_pool, sizeof(mempool_direct_pool), mempool_direct_pool); + MESA_load_profile_string_def(sc->local_cfgfile, str_dev_section, "indirect-pool", + mempool_indirect_pool, MR_SYMBOL_MAX, mempool_direct_pool); return RT_SUCCESS; } @@ -361,8 +361,8 @@ static int vdev_loop_usercfg_setup(struct sc_main * sc) struct rte_mempool * direct_pool = NULL; struct rte_mempool * indirect_pool = NULL; - char sym_direct_mempool[MR_SYMBOL_MAX]; - char sym_indirect_mempool[MR_SYMBOL_MAX]; + char sym_direct_mempool[MR_SYMBOL_MAX] = { 0 }; + char sym_indirect_mempool[MR_SYMBOL_MAX] = { 0 }; vdev_usercfg_query_mempool(sc, vdevsym, sym_direct_mempool, sym_indirect_mempool); /* 查询Indirect Pool,使用与物理设备对应的Indirect Pool */ @@ -407,8 +407,8 @@ static int __vdev_data_setup_one_device(struct sc_main * sc, const char * vdevsy struct rte_mempool * direct_pool = NULL; struct rte_mempool * indirect_pool = NULL; - char sym_direct_mempool[MR_SYMBOL_MAX]; - char sym_indirect_mempool[MR_SYMBOL_MAX]; + char sym_direct_mempool[MR_SYMBOL_MAX] = { 0 }; + char sym_indirect_mempool[MR_SYMBOL_MAX] = { 0 }; vdev_usercfg_query_mempool(sc, vdevsym, sym_direct_mempool, sym_indirect_mempool); /* 查询Indirect Pool,使用与物理设备对应的Indirect Pool */ |
