diff options
| author | Qiuwen Lu <[email protected]> | 2016-08-25 13:32:26 +0800 |
|---|---|---|
| committer | Qiuwen Lu <[email protected]> | 2016-08-25 13:32:26 +0800 |
| commit | af0460d2307c8325db5f5ef381f098a60899728d (patch) | |
| tree | 75a7d07bcbfc7845c0b254fa2277f3b6762d5183 | |
| parent | 52c59a2373b4eea518b659c76a8cb643123db726 (diff) | |
改名,libbase为libcore4.0.0
| -rw-r--r-- | .gitignore | 1 | ||||
| -rw-r--r-- | CMakeLists.txt | 3 | ||||
| -rw-r--r-- | base/src/thread.c | 0 | ||||
| -rw-r--r-- | core/CMakeLists.txt (renamed from base/CMakeLists.txt) | 8 | ||||
| -rw-r--r-- | core/include/mr_common.h (renamed from include/internal/mr_common.h) | 17 | ||||
| -rw-r--r-- | core/include/mr_ctx.h (renamed from include/internal/mr_ctx.h) | 9 | ||||
| -rw-r--r-- | core/include/mr_hwinfo.h (renamed from base/include/mr_hwinfo.h) | 12 | ||||
| -rw-r--r-- | core/include/mr_vnode.h (renamed from base/include/mr_vnode.h) | 0 | ||||
| -rw-r--r-- | core/src/ctx.c | 152 | ||||
| -rw-r--r-- | core/src/device.c (renamed from base/src/device.c) | 92 | ||||
| -rw-r--r-- | core/src/hwinfo.c (renamed from base/src/hwinfo.c) | 10 | ||||
| -rw-r--r-- | core/src/mempool.c (renamed from base/src/mempool.c) | 55 | ||||
| -rw-r--r-- | core/src/proc.c | 244 | ||||
| -rw-r--r-- | core/src/vnode.c (renamed from base/src/vnode.c) | 0 | ||||
| -rw-r--r-- | include/extern/mr_udp.h | 2 | ||||
| -rw-r--r-- | include/internal/common.h | 6 | ||||
| -rw-r--r-- | test/CMakeLists.txt | 10 |
17 files changed, 547 insertions, 74 deletions
@@ -20,3 +20,4 @@ test/test /.vs/marsio1/v14/.suo /x64/Debug/marsio1.tlog /x64 +/marsio1.VC.db diff --git a/CMakeLists.txt b/CMakeLists.txt index 28da525..3bd6a14 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -65,7 +65,8 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CXX_FLAGS}") #set(CMAKE_INSTALL_PREFIX /opt/iiesoft/marsio) add_subdirectory(${CMAKE_SOURCE_DIR}/support ${CMAKE_BINARY_DIR}/support) -add_subdirectory(${CMAKE_SOURCE_DIR}/base) +add_subdirectory(${CMAKE_SOURCE_DIR}/core) +add_subdirectory(${CMAKE_SOURCE_DIR}/service) #add_subdirectory(${CMAKE_SOURCE_DIR}/driver) #add_subdirectory(${CMAKE_SOURCE_DIR}/logreader) #add_subdirectory(${CMAKE_SOURCE_DIR}/conf) diff --git a/base/src/thread.c b/base/src/thread.c deleted file mode 100644 index e69de29..0000000 --- a/base/src/thread.c +++ /dev/null diff --git a/base/CMakeLists.txt b/core/CMakeLists.txt index ac9140e..65b4ae0 100644 --- a/base/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -6,7 +6,7 @@ include_directories(${DPDK_INCLUDE_DIR}) add_definitions(${DPDK_C_PREDEFINED})
include_directories(include)
-add_library(base src/device.c src/hwinfo.c src/mempool.c src/vnode.c)
-target_link_libraries(base ${DPDK_LIBRARY} MESA_prof_load_static)
-target_link_libraries(base rt pthread dl)
-target_include_directories(base INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/include/")
\ No newline at end of file +add_library(core src/device.c src/hwinfo.c src/mempool.c src/vnode.c)
+target_link_libraries(core ${DPDK_LIBRARY} MESA_prof_load_static)
+target_link_libraries(core rt pthread dl)
+target_include_directories(core INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/include/")
\ No newline at end of file diff --git a/include/internal/mr_common.h b/core/include/mr_common.h index 2bb504a..4989842 100644 --- a/include/internal/mr_common.h +++ b/core/include/mr_common.h @@ -4,6 +4,7 @@ extern "C" { #endif #include <stdint.h> +#include <rte_rwlock.h> #ifndef MR_STRING_MAX #define MR_STRING_MAX 2048 @@ -40,6 +41,22 @@ typedef uint32_t flags_t; #define MR_LOG(level, module, ...) \ RTE_LOG(level, module, ##__VA_ARGS__) +/* TODO: support pthread read/write lock */ +typedef rte_rwlock_t mr_spin_rwlock_t; +#define mr_spin_rwlock_read_lock(x) rte_rwlock_read_lock(x) +#define mr_spin_rwlock_read_unlock(x) rte_rwlock_read_unlock(x) +#define mr_spin_rwlock_write_lock(x) rte_rwlock_write_lock(x) +#define mr_spin_rwlock_write_unlock(x) rte_rwlock_write_unlock(x) + +/* Only use in Visual Studio, to avoid IDE errors */ +#ifdef _MSC_VER +#define rte_cpu_to_be_16(x) htons(x) +#define rte_be_to_cpu_32(x) ntohl(x) +#define likely(x) x +#define unlikely(x) x +#define __thread __declspec(thread) +#endif + #ifdef __cplusplus } #endif
\ No newline at end of file diff --git a/include/internal/mr_ctx.h b/core/include/mr_ctx.h index 5fac7ce..b000dde 100644 --- a/include/internal/mr_ctx.h +++ b/core/include/mr_ctx.h @@ -19,15 +19,16 @@ enum _mr_mid_enum MR_MID_DEVICE_MGR = 2,
MR_MID_FIB_MGR = 3,
MR_MID_HWINFO = 4,
+ MR_MID_PROCMAN = 5,
MR_MID_MAX
};
// Global MARSIO Runtime Context
struct mr_global_ctx
{
+ void * process_ctxs;
+ void * thread_ctxs;
void * module_ctxs[MR_MAX_MODULES_NR];
- struct rte_mempool * rx_mempool[RTE_MAX_NUMA_NODES];
- struct rte_mempool * tx_mempool[RTE_MAX_NUMA_NODES];
};
// Process MARSIO Runtime Context
@@ -35,6 +36,7 @@ struct mr_proc_ctx {
process_id_t process_id;
struct mr_global_ctx * global_ctx;
+ void * modules_ctxs[MR_MAX_MODULES_NR];
};
// Thread MARSIO Runtime Context
@@ -43,6 +45,7 @@ struct mr_thread_ctx thread_id_t thread_id;
struct mr_global_ctx * global_ctx;
struct mr_proc_ctx * proc_ctx;
+ void * modules_ctxs[MR_MAX_MODULES_NR];
};
// Gloabl Marsio Configure Information
@@ -65,6 +68,8 @@ struct mr_module mr_module_entry_t destory;
};
+typedef uint32_t mid_t;
+
#define MODULE_CTX(g_ctx, mid) (g_ctx->module_ctxs[mid])
#define MODULE_CFG(g_cfg, mid) (g_cfg->module_cfgs[mid])
diff --git a/base/include/mr_hwinfo.h b/core/include/mr_hwinfo.h index dab5fb1..fe816f6 100644 --- a/base/include/mr_hwinfo.h +++ b/core/include/mr_hwinfo.h @@ -1,9 +1,9 @@ -#pragma once
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
+#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + int mr_hwinfo_nr_sockets(); int mr_hwinfo_nr_cpus(); int mr_hwinfo_physical_cpu_id(int cpu_id); diff --git a/base/include/mr_vnode.h b/core/include/mr_vnode.h index a37d330..a37d330 100644 --- a/base/include/mr_vnode.h +++ b/core/include/mr_vnode.h diff --git a/core/src/ctx.c b/core/src/ctx.c new file mode 100644 index 0000000..00a799f --- /dev/null +++ b/core/src/ctx.c @@ -0,0 +1,152 @@ +/* Core Functions of framework + * Provides basic functions and envoirment. + * + * Author : Qiuwen Lu<[email protected]> + * Date : 2016-08-23 + */ + +#include <stdio.h> +#include <stdint.h> +#include <stdlib.h> +#include <assert.h> +#include <sys/mman.h> +#include <unistd.h> +#include <fcntl.h> + +#include <rte_ip_frag.h> +#include <rte_eal.h> +#include <rte_version.h> + +#include "mr_ctx.h" + +static struct mr_global_ctx * __global_ctx; +static struct mr_config * __global_cfg; +static struct mr_proc_ctx * __proc_ctx; +static __thread struct mr_thread_ctx * __thread_ctx; + +#define __SHM_FILEMODE 00777 +#define __SHM_SYM_GLOBAL_CTX "MR_CORE_GLOBAL_CTX_SHM" +#define __SHM_SYM_GLOBAL_CFG "MR_CORE_GLOBAL_CFG_SHM" + +static void * shared_memory_create(const char * sym, size_t size) +{ + int shm_fd = shm_open(sym, O_RDWR | O_CREAT, __SHM_FILEMODE); + if(shm_fd < 0) + { + MR_LOG(INFO, BASE, "CoreCtxMan, SharedMemoryCreate, " + "Call shm_open failed: %s\n", strerror(errno)); + return NULL; + } + + ftruncate(shm_fd, size); + + void * shm_ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, + MAP_SHARED, shm_fd, 0); + + if (shm_ptr == NULL) + { + MR_LOG(INFO, BASE, "CoreCtxMan, SharedMemoryCreate, " + "Call mmap failed: %s\n", strerror(errno)); + return NULL; + } + + memset(shm_ptr, 0, size); + return shm_ptr; +} + +static void * shared_memory_lookup(const char * sym, size_t size) +{ + int shm_fd = shm_open(sym, O_RDWR, __SHM_FILEMODE); + if (shm_fd < 0) + { + MR_LOG(INFO, BASE, "CoreCtxMan, SharedMemoryLookup, " + "Call shm_open failed: %s\n", strerror(errno)); + return NULL; + } + + ftruncate(shm_fd, size); + + void * shm_ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, + MAP_SHARED, shm_fd, 0); + + if (shm_ptr == NULL) + { + MR_LOG(INFO, BASE, "CoreCtxMan, SharedMemoryLookup, " + "Call mmap failed: %s\n", strerror(errno)); + return NULL; + } + + return shm_ptr; +} + +int mr_global_ctx_init() +{ + __global_ctx = (struct mr_global_ctx *)shared_memory_create( + __SHM_SYM_GLOBAL_CTX, sizeof(struct mr_global_ctx)); + + MR_CHECK(__global_ctx != NULL, "CoreCtxMan, GlobalCtxInit, " + "Cannot create shared memory for global ctx"); + return 0; +} + +int mr_global_ctx_lookup() +{ + __global_ctx = (struct mr_global_ctx *)shared_memory_lookup( + __SHM_SYM_GLOBAL_CTX, sizeof(struct mr_global_ctx)); + + MR_CHECK(__global_ctx != NULL, "CoreCtxMan, GlobalCtxLookup, " + "Cannot lookup shared memory for global ctx"); + return 0; +} + +int mr_global_cfg_init() +{ + __global_cfg = (struct mr_config *)shared_memory_create( + __SHM_SYM_GLOBAL_CFG, sizeof(struct mr_config)); + + MR_CHECK(__global_ctx != NULL, "CoreCtxMan, GlobalConfigInit, " + "Cannot create shared memory for global config"); + + return 0; +} + +int mr_global_cfg_lookup() +{ + __global_cfg = (struct mr_config *)shared_memory_lookup( + __SHM_SYM_GLOBAL_CFG, sizeof(struct mr_config)); + + MR_CHECK(__global_cfg != NULL, "CoreCtxMan, GlobalConfigLookup, " + "Cannot lookup shared memory for global config"); + return 0; +} + +int mr_proc_ctx_init() +{ + __proc_ctx = (struct mr_proc_ctx *)rte_zmalloc(NULL, sizeof(struct mr_proc_ctx), 0); + MR_CHECK(__proc_ctx != NULL, "CoreCtxMan, ProcessCtxInit, " + "Cannot alloc memory for proc ctx"); + + __proc_ctx->global_ctx = __global_ctx; + assert(__proc_ctx->global_ctx != NULL); + + //TODO: __proc_ctx->process_id is empty. + return 0; +} + +struct mr_global_ctx * mr_global_ctx_get() +{ + assert(__global_ctx != NULL); + return __global_ctx; +} + +struct mr_config * mr_global_config_get() +{ + assert(__global_cfg != NULL); + return __global_cfg; +} + +struct mr_proc_ctx * mr_proc_ctx_get() +{ + assert(__proc_ctx != NULL); + return __proc_ctx; +}
\ No newline at end of file diff --git a/base/src/device.c b/core/src/device.c index fe8d3e2..c5061be 100644 --- a/base/src/device.c +++ b/core/src/device.c @@ -69,22 +69,22 @@ typedef void * mr_devq_t; TAILQ_HEAD(mr_deivce_list, mr_dev); -struct device_manager_ctx +struct devman_ctx { struct mr_deivce_list device_list; struct mr_dev * rte_device[RTE_MAX_ETHPORTS]; }; -struct device_manager_config +struct devman_config { unsigned int nr_rx_desc; unsigned int nr_tx_desc; }; // Module Global Ctx -static struct device_manager_ctx * module_ctx; +static struct devman_ctx * module_ctx; // Module Global Config -static struct device_manager_config * module_config; +static struct devman_config * module_config; int mr_device_open(mr_devq_t * devq, flags_t flags) { @@ -107,21 +107,21 @@ struct mr_devq * __device_open_devq(struct mr_dev * dev, flags_t flags) // 检查队列数量,超过队列数申请即失败 if(dev->nr_devq >= RTE_DIM(dev->devq)) { - RTE_LOG(INFO, BASE, "DeviceManager, DeviceOpen, Device %s," + MR_LOG(INFO, BASE, "DeviceManager, DeviceOpen, Device %s, " "Too many open request\n", dev->symbol); return NULL; } if(dev->nr_rxq >= dev->nr_rxq_max) { - RTE_LOG(INFO, BASE, "DeviceManager, DeviceOpen, Device %s," + MR_LOG(INFO, BASE, "DeviceManager, DeviceOpen, Device %s, " "Too many recieve queues\n", dev->symbol); return NULL; } if(dev->nr_txq >= dev->nr_txq_max) { - RTE_LOG(INFO, BASE, "DeviceManager, DeviceOpen, Device %s", + MR_LOG(INFO, BASE, "DeviceManager, DeviceOpen, Device %s, " "Too many xmit queues\n", dev->symbol); return NULL; } @@ -147,7 +147,8 @@ struct mr_devq * __device_open_devq(struct mr_dev * dev, flags_t flags) return devq; } -static mr_devq_t * device_open(struct device_manager_ctx * ctx, const char * devsym, flags_t flags) +static mr_devq_t * device_open(struct devman_ctx * ctx, const char * devsym, + flags_t flags) { struct mr_dev * dev = NULL; struct mr_devq * retq = NULL; @@ -159,7 +160,7 @@ static mr_devq_t * device_open(struct device_manager_ctx * ctx, const char * dev if (strncmp(dev->symbol, devsym, sizeof(dev->symbol)) != 0) continue; - RTE_LOG(DEBUG, BASE, "DeviceManager, DeviceOpen," + MR_LOG(DEBUG, BASE, "DeviceManager, DeviceOpen, " "Found Device %s\n", devsym); retq = __device_open_devq(dev, flags); found = 1; @@ -168,7 +169,7 @@ static mr_devq_t * device_open(struct device_manager_ctx * ctx, const char * dev // 没找到 if(!found) { - RTE_LOG(INFO, BASE, "DeviceManager, DeviceOpen," + MR_LOG(INFO, BASE, "DeviceManager, DeviceOpen, " "Cannot found device %s\n", devsym); return NULL; } @@ -176,7 +177,7 @@ static mr_devq_t * device_open(struct device_manager_ctx * ctx, const char * dev // 找到了但是句柄是NULL,打开失败 if(retq == NULL) { - RTE_LOG(INFO, BASE, "DeviceManager, DeviceOpen," + MR_LOG(INFO, BASE, "DeviceManager, DeviceOpen, " "Cannot open device %s\n", devsym); return NULL; } @@ -184,13 +185,13 @@ static mr_devq_t * device_open(struct device_manager_ctx * ctx, const char * dev return (mr_devq_t *)retq; } -static int device_close(struct device_manager_ctx * ctx, mr_devq_t * devq) +static int device_close(struct devman_ctx * ctx, mr_devq_t * devq) { return 0; } // 扫描DPDK加载的网卡,初始化描述符空间,以便收集配置信息 -static int device_scan(struct device_manager_ctx * ctx) +static int device_scan(struct devman_ctx * ctx) { unsigned int eth_dev_counts = rte_eth_dev_count(); char devsym_buffer[MR_SYMBOL_MAX]; @@ -221,7 +222,7 @@ static int device_scan(struct device_manager_ctx * ctx) } static int device_init(struct mr_global_ctx * g_ctx, - struct device_manager_ctx * ctx, struct device_manager_config * cfg) + struct devman_ctx * ctx, struct devman_config * cfg) { // 对设备链上的所有设备初始化,计算队列数量。 @@ -230,7 +231,8 @@ static int device_init(struct mr_global_ctx * g_ctx, { if (dev->enable == 0) { - RTE_LOG(INFO, BASE, "DeviceManager, Device %s is disable, skip\n", dev->symbol); + MR_LOG(INFO, BASE, "DeviceManager, DeviceInit, " + "Device %s is disable, skip\n", dev->symbol); continue; } @@ -241,7 +243,9 @@ static int device_init(struct mr_global_ctx * g_ctx, retval = rte_eth_dev_configure(dev->port_id, nr_rxq_use, nr_txq_use, NULL); if (retval != 0) { - RTE_LOG(ERR, BASE, "DeviceManager, Device %s Configure Error, Errno = %d\n", dev->symbol, retval); + MR_LOG(ERR, BASE, "DeviceManager, DeviceInit, " + "Device %s Configure Error, Errno = %d\n", + dev->symbol, retval); return retval; } @@ -249,11 +253,12 @@ static int device_init(struct mr_global_ctx * g_ctx, { retval = rte_eth_rx_queue_setup(dev->port_id, rxq, cfg->nr_rx_desc, rte_eth_dev_socket_id(dev->port_id), NULL, - g_ctx->rx_mempool[rte_eth_dev_socket_id(dev->port_id)]); + NULL); if (retval < 0) { - RTE_LOG(ERR, BASE, "DeviceManager, Device %s RXQ %d Setup Error, Errno = %d\n", + MR_LOG(ERR, BASE, "DeviceManager, DeviceInit, " + "Device %s RXQ %d Setup Error, Errno = %d\n", dev->symbol, rxq, retval); return retval; } @@ -266,7 +271,8 @@ static int device_init(struct mr_global_ctx * g_ctx, if (retval < 0) { - RTE_LOG(ERR, BASE, "DeviceManager, Device %s TXQ %d Setup Error, Errno = %d\n", + MR_LOG(ERR, BASE, "DeviceManager, DeviceInit, " + "Device %s TXQ %d Setup Error, Errno = %d\n", dev->symbol, txq, retval); return retval; } @@ -275,7 +281,8 @@ static int device_init(struct mr_global_ctx * g_ctx, retval = rte_eth_dev_start(dev->port_id); if (retval < 0) { - RTE_LOG(ERR, BASE, "DeviceManager, Device %s Start Error, Errno = %d\n", + MR_LOG(ERR, BASE, "DeviceManager, DeviceInit, " + "Device %s Start Error, Errno = %d\n", dev->symbol, retval); return retval; } @@ -288,52 +295,59 @@ static int device_init(struct mr_global_ctx * g_ctx, char str_mac_addr[MR_SYMBOL_MAX]; ether_format_addr(str_mac_addr, sizeof(str_mac_addr), &dev->ether_addr); - RTE_LOG(INFO, BASE, "DeviceManager, Device %s Information: PortID=%d, NR RXQ=%d, NR TXQ=%d, MAC=%s", + MR_LOG(INFO, BASE, "DeviceManager, DeviceInit, " + "Device %s Information: PortID=%d, NR RXQ=%d, NR TXQ=%d, MAC=%s", dev->port_id, dev->nr_rxq, dev->nr_txq, str_mac_addr); } return 0; } -int device_manager_preconfig(struct mr_config * g_cfg, struct mr_global_ctx * g_ctx) +int devman_preinit(struct mr_module * m_desc, struct mr_config * g_cfg, struct mr_global_ctx * g_ctx) { /* 初始化设备管理各句柄 */ - MODULE_CTX(g_ctx, MR_MID_DEVICE_MGR) = rte_zmalloc("DEVICE_MANAGER_CTX", sizeof(struct device_manager_ctx), 0); - MR_CHECK(MODULE_CTX(g_ctx, MR_MID_DEVICE_MGR) != NULL, "Device Manager Preinit Error, cannot alloc memory for devmgr context"); + MODULE_CTX(g_ctx, m_desc->mid) = rte_zmalloc("DEVICE_MANAGER_CTX", + sizeof(struct devman_ctx), 0); + MR_CHECK(MODULE_CTX(g_ctx, m_desc->mid) != NULL, + "Device Manager Preinit Error, cannot alloc memory for devmgr context"); - MODULE_CFG(g_cfg, MR_MID_DEVICE_MGR) = rte_zmalloc("DEVICE_MANAGER_CONFIG", sizeof(struct device_manager_config), 0); - MR_CHECK(MODULE_CFG(g_cfg, MR_MID_DEVICE_MGR) != NULL, "Device Manager Preinit Error, cannot alloc memory for devmgr config"); + MODULE_CFG(g_cfg, m_desc->mid) = rte_zmalloc("DEVICE_MANAGER_CONFIG", + sizeof(struct devman_config), 0); + MR_CHECK(MODULE_CFG(g_cfg, m_desc->mid) != NULL, + "Device Manager Preinit Error, cannot alloc memory for devmgr config"); - module_ctx = (struct device_manager_ctx *)MODULE_CTX(g_ctx, MR_MID_DEVICE_MGR); - module_config = (struct device_manager_config *)MODULE_CFG(g_cfg, MR_MID_DEVICE_MGR); + module_ctx = (struct devman_ctx *)MODULE_CTX(g_ctx, m_desc->mid); + module_config = (struct devman_config *)MODULE_CFG(g_cfg, m_desc->mid); TAILQ_INIT(&module_ctx->device_list); return device_scan(module_ctx); } -int device_manager_config(struct mr_config * g_cfg, struct mr_global_ctx * g_ctx) +int devman_config(struct mr_module * m_desc, struct mr_config * g_cfg, struct mr_global_ctx * g_ctx) { - struct device_manager_config * cfg = module_config; - struct device_manager_ctx * ctx = module_ctx; + struct devman_config * cfg = module_config; + struct devman_ctx * ctx = module_ctx; /* 加载网卡描述符数量配置 */ - MESA_load_profile_uint_def(g_cfg->glob_cfg_file, "device", "nr_rx_desc", &cfg->nr_rx_desc, MR_DEVICE_DEFAULT_NR_RX_DESC); - MESA_load_profile_uint_def(g_cfg->glob_cfg_file, "device", "nr_tx_desc", &cfg->nr_tx_desc, MR_DEVICE_DEFAULT_NR_TX_DESC); + MESA_load_profile_uint_def(g_cfg->glob_cfg_file, "device", "nr_rx_desc", + &cfg->nr_rx_desc, MR_DEVICE_DEFAULT_NR_RX_DESC); + MESA_load_profile_uint_def(g_cfg->glob_cfg_file, "device", "nr_tx_desc", + &cfg->nr_tx_desc, MR_DEVICE_DEFAULT_NR_TX_DESC); /* 加载各网卡配置 */ return 0; } -int device_manager_init(struct mr_config * g_cfg, struct mr_global_ctx * g_ctx) +int devman_init(struct mr_module * m_desc, struct mr_config * g_cfg, struct mr_global_ctx * g_ctx) { - struct device_manager_config * cfg = module_config; - struct device_manager_ctx * ctx = module_ctx; + struct devman_config * cfg = module_config; + struct devman_ctx * ctx = module_ctx; return device_init(g_ctx, ctx, cfg); } -int device_manager_destory(struct mr_config * g_cfg, struct mr_global_ctx * g_ctx) +int devman_destory(struct mr_module * m_desc, struct mr_config * g_cfg, struct mr_global_ctx * g_ctx) { - struct device_manager_config * cfg = module_config; - struct device_manager_ctx * ctx = module_ctx; + struct devman_config * cfg = module_config; + struct devman_ctx * ctx = module_ctx; return 0; }
\ No newline at end of file diff --git a/base/src/hwinfo.c b/core/src/hwinfo.c index 1aeb765..c47a846 100644 --- a/base/src/hwinfo.c +++ b/core/src/hwinfo.c @@ -116,7 +116,7 @@ static int hwinfo_cpu_scan(struct hwinfo_ctx * ctx) int nr_cpus = linux_get_nr_total_cpus(); if (nr_cpus < 0) { - RTE_LOG(INFO, BASE, "HwCPUInfo, HwCPUInfoScan, cannot get count of total cpus"); + MR_LOG(INFO, BASE, "HwCPUInfo, HwCPUInfoScan, Cannot get count of total cpus\n"); return nr_cpus; } @@ -132,15 +132,15 @@ static int hwinfo_cpu_scan(struct hwinfo_ctx * ctx) if(pcpu_id < 0) { - RTE_LOG(INFO, BASE, "HwCPUInfo, HwCPUInfoScan" - "cannot get physical id of cpu %d", cpu_id); + MR_LOG(INFO, BASE, "HwCPUInfo, HwCPUInfoScan, " + "Cannot get physical id of cpu %d\n", cpu_id); continue; } if(socket_id < 0) { - RTE_LOG(INFO, BASE, "HwCPUInfo, HwCPUInfoScan", - "cannot get socket id for cpu %d", cpu_id); + MR_LOG(INFO, BASE, "HwCPUInfo, HwCPUInfoScan, " + "Cannot get socket id for cpu %d\n", cpu_id); continue; } diff --git a/base/src/mempool.c b/core/src/mempool.c index 15353fe..82e9532 100644 --- a/base/src/mempool.c +++ b/core/src/mempool.c @@ -1,17 +1,18 @@ -#include <mr_common.h> -#include <mr_ctx.h> -#include <mr_config.h> #include <MESA_prof_load.h> - #include <rte_mempool.h> #include <rte_config.h> #include <rte_malloc.h> #include <rte_mbuf.h> #include <assert.h> +#include <mr_common.h> +#include <mr_ctx.h> +#include <mr_hwinfo.h> +#include <mr_config.h> + #ifndef MR_MEMPOOL_DEFAULT_NR_MBUF -#define MR_MEMPOOL_DEFAULT_NR_MBUF (1024 * 1024) +#define MR_MEMPOOL_DEFAULT_NR_MBUF 8192 #endif #ifndef MR_MEMPOOL_DEFAULT_NR_MBUF_CACHE @@ -60,9 +61,45 @@ int mempool_config(struct mr_config * g_cfg, struct mr_global_ctx * g_ctx) int mempool_init(struct mr_config * g_cfg, struct mr_global_ctx * g_ctx) { - // Ŀǰ��ʵ�ְ�Socket����MEMPOOL������ÿ��Socket������һ��Mempool - // TODO: Ŀǰʵ�ֲ���DPDK�ṩ��Socket-ID�������ƣ���Ҫ�����Լ��ġ� + struct mempool_ctx * ctx = (struct mempool_ctx *)MODULE_CTX(g_ctx, MR_MID_MEMPOOL_MGR); + struct mempool_config * cfg = (struct mempool_config *)MODULE_CFG(g_cfg, MR_MID_MEMPOOL_MGR); + + assert(ctx != NULL); + + // Ϊÿ��Socket����mbufpool + for (int socket_id = 0; socket_id < mr_hwinfo_nr_sockets(); socket_id++) + { + char symbol[MR_SYMBOL_MAX]; + snprintf(symbol, sizeof(symbol), "mbuf_pool_socket_%d", socket_id); + + struct rte_mempool * mbufpool = rte_pktmbuf_pool_create(symbol, + cfg->nr_mbuf, cfg->nr_mbuf_cache, 0, cfg->sz_mbuf, socket_id); + + MR_CHECK(mbufpool != NULL, "Mempool, cannot create mempool for socket %d, " + "nr_mbuf=%d, nr_mbuf_cache=%d, sz_mbuf=%d", socket_id, + cfg->nr_mbuf, cfg->nr_mbuf_cache, cfg->sz_mbuf); + + MR_LOG(INFO, BASE, "Mempool, Create mbufs pool successfully, " + "socket_id=%d, nr_mbuf=%d, nr_mbuf_cache=%d, sz_mbuf=%d", + socket_id, cfg->nr_mbuf, cfg->nr_mbuf_cache, cfg->sz_mbuf); + + ctx->rx_mbufs[socket_id] = mbufpool; + ctx->tx_mbufs[socket_id] = mbufpool; + } + + return 0; +} + +int mempool_destory(struct mr_config * g_cfg, struct mr_global_ctx * g_ctx) +{ + return 0; } -int device_manager_destory(struct mr_config * g_cfg, struct mr_global_ctx * g_ctx) -{}
\ No newline at end of file +struct mr_module module_desc_mempool = +{ + .mid = MR_MID_MEMPOOL_MGR, + .preconfig = mempool_preconfig, + .config = mempool_config, + .init = mempool_init, + .destory = mempool_destory +};
\ No newline at end of file diff --git a/core/src/proc.c b/core/src/proc.c new file mode 100644 index 0000000..e08ea94 --- /dev/null +++ b/core/src/proc.c @@ -0,0 +1,244 @@ +/* Application, Process and Dataplane Manager
+ *
+ * This manager is used to manage application, process and thread.
+ * It gives one unique id for each application, process and dataplane thread.
+ *
+ * Author : Lu Qiuwen<[email protected]>
+ * Date : 2016-08-19
+ */
+
+#include <sys/queue.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <mr_common.h>
+#include <mr_ctx.h>
+
+#include <rte_ip_frag.h>
+#include <rte_rwlock.h>
+#include <mr_ctx.h>
+#include <assert.h>
+#include <string.h>
+
+enum proc_state
+{
+ MR_PROC_STATE_READY,
+ MR_PROC_STATE_RUN,
+ MR_PROC_STATE_SUSPEND
+};
+
+struct proc_info
+{
+ /* ��һ�� */
+ TAILQ_ENTRY(proc_info) next;
+ /* ���̱�ʶ�� */
+ char symbol[MR_SYMBOL_MAX];
+ /* ����߳��������������߳� */
+ process_id_t proc_id;
+ /* ȫ���߳���ţ���ʼ��ţ�����ҿ� */
+ thread_id_t gsid_start;
+ /* ȫ���߳���ţ���ֹ��ţ�����ҿ� */
+ thread_id_t gsid_end;
+ /* ����״̬ */
+ unsigned int state;
+ /* ����˽��Ctx */
+ void * proc_ctx;
+};
+
+TAILQ_HEAD(proc_info_list, proc_info);
+
+struct thread_info
+{
+ /* �߳������������ */
+ process_id_t prod_id;
+ /* �߳���� */
+ thread_id_t sid;
+ /* ȫ���߳���� */
+ thread_id_t gsid;
+};
+
+struct process_ctxs
+{
+ /* ��д�������Ʋ������� */
+ mr_spin_rwlock_t rwlock;
+ /* �����б� */
+ struct proc_info_list proc_info_list;
+ /* �ڲ�������� */
+ unsigned int nr_process;
+ /* ������ŷ��䣬��0��ʼ���� */
+ process_id_t pid_index;
+ /* ȫ���߳���ŷ��䣬��0��ʼ���� */
+ thread_id_t gsid_index;
+};
+
+static struct process_ctxs * __procman_module_ctx;
+
+int procman_init(struct mr_global_ctx * g_ctx, struct mr_config * g_cfg)
+{
+ g_ctx->process_ctxs = rte_zmalloc("PROCESS_CTXS",
+ sizeof(struct process_ctxs), 0);
+ MR_CHECK(g_ctx->process_ctxs != NULL, "Procman, PreConfig,"
+ "Cannot alloc memory for process ctxs in global ctx");
+
+ struct process_ctxs * pctxs = (struct process_ctxs *)g_ctx->process_ctxs;
+ assert(pctxs != NULL);
+
+ pctxs->pid_index = 0;
+ pctxs->nr_process = 0;
+ rte_rwlock_init(&pctxs->rwlock);
+
+ __procman_module_ctx = pctxs;
+ return 0;
+}
+
+int procman_attach(struct mr_global_ctx * g_ctx, struct mr_config * g_cfg)
+{
+ assert(g_ctx->process_ctxs != NULL);
+ __procman_module_ctx = g_ctx->process_ctxs;
+ return 0;
+}
+
+static int pinfo_list_insert(struct proc_info_list * plist,
+ struct proc_info * pinfo)
+{
+ TAILQ_INSERT_TAIL(plist, pinfo, next);
+ return 0;
+}
+
+static struct proc_info * pinfo_list_lookup(struct proc_info_list * plist,
+ const char * sym)
+{
+ struct proc_info * pinfo = NULL;
+ TAILQ_FOREACH(pinfo, plist, next)
+ {
+ if (strncmp(pinfo->symbol, sym, sizeof(pinfo->symbol)) == 0)
+ break;
+ }
+ return pinfo;
+}
+
+/* ����һ���µĽ��� */
+static int __process_new(struct process_ctxs * pctxs, const char * sym,
+ unsigned int nr_max_thread)
+{
+ struct proc_info * pinfo;
+ int ret = 0;
+ assert(__procman_module_ctx != NULL);
+
+ // ����
+ mr_spin_rwlock_write_lock(&__procman_module_ctx->rwlock);
+
+ // �������Ƿ��Ѿ�����
+ pinfo = pinfo_list_lookup(&pctxs->proc_info_list, sym);
+ if (pinfo != NULL)
+ {
+ MR_LOG(INFO, BASE, "Procman, ProcessNew, "
+ "Process %s is already exists, failed. \n", sym);
+ ret = -1; goto errout;
+ }
+
+ // ���̲����ڣ������µ�������
+ pinfo = (struct proc_info *)rte_zmalloc(NULL, sizeof(struct proc_info), 0);
+ if(unlikely(pinfo == NULL))
+ {
+ MR_LOG(INFO, BASE, "Procman, ProcessNew, "
+ "Cannot alloc memory for Process %s info.\n", sym);
+ ret = -2; goto errout;
+ }
+
+ // ������������Ŀռ�
+ struct mr_proc_ctx * proc_ctx;
+ proc_ctx = (struct mr_proc_ctx *)rte_zmalloc(NULL, sizeof(struct mr_proc_ctx), 0);
+ if(unlikely(proc_ctx == NULL))
+ {
+ MR_LOG(INFO, BASE, "Procman, ProcessNew, "
+ "Cannot alloc memory for Process %s Ctx Space.\n", sym);
+ ret = -3; goto errout;
+ }
+
+ // ��������Ϣ
+ snprintf(pinfo->symbol, sizeof(pinfo->symbol), "%s", sym);
+ pinfo->proc_id = pctxs->pid_index;
+ pinfo->gsid_start = pctxs->gsid_index;
+ pinfo->gsid_end = pctxs->gsid_index + nr_max_thread;
+ pinfo->proc_ctx = proc_ctx;
+ pinfo->state = MR_PROC_STATE_READY;
+
+ // �����������Ľṹ
+ proc_ctx->process_id = pinfo->proc_id;
+
+ // ���ӽ��̡��߳����
+ pctxs->pid_index++;
+ pctxs->gsid_index += nr_max_thread;
+
+ // �����������
+ TAILQ_INSERT_TAIL(&pctxs->proc_info_list, pinfo, next);
+ ret = 0; goto out;
+
+errout:
+ if (pinfo != NULL) rte_free(pinfo);
+ if (proc_ctx != NULL) rte_free(proc_ctx);
+ goto out;
+
+out:
+ mr_spin_rwlock_write_unlock(&__procman_module_ctx->rwlock);
+ return ret;
+}
+
+/* �������� */
+static int __process_run(struct process_ctxs * pctxs, struct proc_info * pinfo)
+{
+ return 0;
+}
+
+/* �����˳������������� */
+static int __process_suspend(struct process_ctxs * pctxs, struct proc_info * pinfo)
+{
+ return 0;
+}
+
+/* �����˳������������� */
+static int __process_exit(struct process_ctxs * pctxs)
+{
+ return 0;
+}
+
+static struct proc_info * __process_lookup_unsafe(struct process_ctxs * pctxs,
+ const char * sym)
+{
+ struct proc_info * pinfo_iter = NULL;
+ struct proc_info * pinfo_ret = NULL;
+ TAILQ_FOREACH(pinfo_iter, &pctxs->proc_info_list, next)
+ {
+ if(strncmp(pinfo_iter->symbol, sym, sizeof(pinfo_iter->symbol)) == 0)
+ {
+ pinfo_ret = pinfo_iter;
+ break;
+ }
+ }
+ return pinfo_ret;
+}
+
+
+/* �ڹ��������������� */
+int procman_process_create(const char * sym, unsigned int nr_wk_thread)
+{
+ struct process_ctxs * pctxs = __procman_module_ctx;
+ assert(pctxs != NULL);
+ return __process_new(pctxs, sym, nr_wk_thread);
+}
+
+int procman_process_lookup(const char * sym)
+{
+ return 0;
+}
+
+/* �ڽ��������������� */
+int procman_register_myself()
+{
+ return 0;
+}
+
+int procman_unregister_myself()
+{
+ return 0;
+}
\ No newline at end of file diff --git a/base/src/vnode.c b/core/src/vnode.c index fbc6527..fbc6527 100644 --- a/base/src/vnode.c +++ b/core/src/vnode.c diff --git a/include/extern/mr_udp.h b/include/extern/mr_udp.h index 057b510..c0bf858 100644 --- a/include/extern/mr_udp.h +++ b/include/extern/mr_udp.h @@ -1,4 +1,4 @@ -#pragma once
+#pragma once #ifdef __cplusplus extern "C" { diff --git a/include/internal/common.h b/include/internal/common.h index 03c427c..8419077 100644 --- a/include/internal/common.h +++ b/include/internal/common.h @@ -24,9 +24,3 @@ #define RTE_LOG_LEVEL RTE_LOG_INFO #endif -#ifdef _MSC_VER -#define rte_cpu_to_be_16(x) htons(x) -#define rte_be_to_cpu_32(x) ntohl(x) -#define likely(x) x -#define unlikely(x) x -#endif
\ No newline at end of file diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 96fd10b..9caa6dc 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -16,4 +16,12 @@ set(TEST_LINK_LIBRARIES ${DPDK_LIBRARY} gtest) # TestCase 2
add_executable(TestHwInfo TestHwInfo.cc Unittest.cc)
-target_link_libraries(TestHwInfo ${TEST_LINK_LIBRARIES} base)
\ No newline at end of file +target_link_libraries(TestHwInfo ${TEST_LINK_LIBRARIES} base)
+
+# TestCase 3
+add_executable(TestMempool TestMempool.cc Unittest.cc)
+target_link_libraries(TestMempool ${TEST_LINK_LIBRARIES} base)
+
+# TestCase 4
+add_executable(TestVNode TestVNode.cc Unittest.cc)
+target_link_libraries(TestVNode ${TEST_LINK_LIBRARIES} base)
\ No newline at end of file |
