summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQiuwen Lu <[email protected]>2017-06-10 20:34:35 +0800
committerQiuwen Lu <[email protected]>2017-06-10 20:34:35 +0800
commit0331de962d2513e8778c2723f07fd4583215265c (patch)
treedf6a92deb60c26a1e80ad9b1af005abb8bfee151
parent9a496b105eba1d25b41d9a12a21412d09fd7818e (diff)
实现用户自定义内存池分配方式。
-rw-r--r--service/include/sc_phydev.h4
-rw-r--r--service/src/core.c4
-rw-r--r--service/src/mrb.c88
-rw-r--r--service/src/phydev.c15
-rw-r--r--service/src/vdev.c18
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 */