diff options
| author | Qiuwen Lu <[email protected]> | 2016-11-02 21:04:35 +0800 |
|---|---|---|
| committer | Qiuwen Lu <[email protected]> | 2016-11-02 21:04:35 +0800 |
| commit | e8e0c94bc5e52eefb5f71775986e89e4d775faf7 (patch) | |
| tree | b76ae799297aebd399d0d2e342ef914a9b64b7a0 | |
| parent | b88cf32a2d358882b9734fece1067ecaca3533d6 (diff) | |
| parent | 0fb7afbdbf28c256ccbf27e37b499722763357d2 (diff) | |
Merge branch 'dev-4.X.X' into rel-4.X.Xv4.0.4-20161102
| -rw-r--r-- | CMakeLists.txt | 16 | ||||
| -rw-r--r-- | cmake/InstallDPDK.cmake | 34 | ||||
| -rw-r--r-- | cmake/Version.cmake | 12 | ||||
| -rw-r--r-- | conf/CMakeLists.txt | 12 | ||||
| -rw-r--r-- | conf/dpdk-x86_64.conf.in | 3 | ||||
| -rw-r--r-- | conf/mrglobal.conf | 13 | ||||
| -rw-r--r-- | conf/mrzcpd.ld.conf.in | 2 | ||||
| -rw-r--r-- | conf/mrzcpd.pc.in | 11 | ||||
| -rw-r--r-- | conf/mrzcpd.sysconfig.in (renamed from conf/mrenv.conf.in) | 9 | ||||
| -rw-r--r-- | core/src/device.c | 2 | ||||
| -rw-r--r-- | runtime/src/runtime.c | 7 | ||||
| -rw-r--r-- | service/src/config.c | 5 | ||||
| -rw-r--r-- | stack/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | test/CMakeLists.txt | 4 | ||||
| -rw-r--r-- | tools/CMakeLists.txt | 14 | ||||
| -rw-r--r-- | tools/systemd/mrenv-script | 308 | ||||
| -rw-r--r-- | tools/systemd/mrenv.service.in | 13 | ||||
| -rw-r--r-- | tools/systemd/mrzcpd.service.in | 12 |
18 files changed, 442 insertions, 37 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 918735d..b6117f2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -34,6 +34,19 @@ add_definitions(-fPIC -Wall) add_definitions(-D_GNU_SOURCE -D__STDC_LIMIT_MACROS) include_directories(include) + +# Install Dirs +set(MR_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX}) +set(MR_INSTALL_LIBDIR ${CMAKE_INSTALL_PREFIX}/lib) +set(MR_INSTALL_SYSCONFDIR ${CMAKE_INSTALL_PREFIX}/etc) +set(MR_INSTALL_INCLUDEDIR ${CMAKE_INSTALL_PREFIX}/include) +set(MR_INSTALL_BINDIR ${CMAKE_INSTALL_PREFIX}/bin) +set(MR_INSTALL_LDCONFDIR /etc/ld.conf.d/) +set(MR_INSTALL_SYSUNITCONFDIR /etc/sysconfig/) + +exec_program(pkg-config ARGS systemd --variable=systemdsystemconfdir + OUTPUT_VARIABLE MR_INSTALL_SYSUNITDIR) + add_subdirectory(${CMAKE_SOURCE_DIR}/support ${CMAKE_BINARY_DIR}/support) add_subdirectory(${CMAKE_SOURCE_DIR}/include) add_subdirectory(${CMAKE_SOURCE_DIR}/runtime) @@ -58,4 +71,5 @@ add_custom_target("install-profile" COMMAND ${CMAKE_COMMAND} ARGS -DCOMPONENT=Pr message(STATUS "Packet I/O Middleware based on DPDK(Marsio), Version: ${MARSIO_VERSION}") # packed -include(Package)
\ No newline at end of file +include(Package) +include(InstallDPDK)
\ No newline at end of file diff --git a/cmake/InstallDPDK.cmake b/cmake/InstallDPDK.cmake new file mode 100644 index 0000000..1f40d7c --- /dev/null +++ b/cmake/InstallDPDK.cmake @@ -0,0 +1,34 @@ +
+# Install DPDK Library, Modules, Scripts etc.
+# to MR_INSTALL
+
+# find dpdk location
+find_package(DPDK REQUIRED)
+
+# locate and install kernel module
+exec_program(uname ARGS -r OUTPUT_VARIABLE KERNEL_VERSION)
+set(KMOD_FROM_PATH ${DPDK_LIBRARY_DIR}/modules/${KERNEL_VERSION}/extra/dpdk)
+set(KMOD_INSTALL_PATH ${MR_INSTALL_LIBDIR}/modules/${KERNEL_VERSION}/extra/mrzcpd)
+
+install(FILES ${KMOD_FROM_PATH}/rte_kni.ko
+ DESTINATION ${KMOD_INSTALL_PATH} COMPONENT Program)
+
+install(FILES ${KMOD_FROM_PATH}/igb_uio.ko
+ DESTINATION ${KMOD_INSTALL_PATH} COMPONENT Program)
+
+# install tools
+set(TOOLS_FROM_PATH ${DPDK_ROOT_DIR}/share/dpdk/tools/)
+set(TOOLS_INSTALL_PATH ${MR_INSTALL_BINDIR})
+set(TOOLS_NAME dpdk-devbind.py)
+
+if(EXISTS ${TOOLS_FROM_PATH}/dpdk_nic_bind.py)
+ set(TOOLS_NAME dpdk_nic_bind.py)
+endif()
+
+if(EXISTS ${TOOLS_FROM_PATH}/dpdk-devbind.py)
+ set(TOOLS_NAME dpdk-devbind.py)
+endif()
+
+install(FILES ${TOOLS_FROM_PATH}/${TOOLS_NAME}
+ DESTINATION ${TOOLS_INSTALL_PATH}
+ RENAME mr_nic_bind PERMISSIONS WORLD_EXECUTE COMPONENT Program)
\ No newline at end of file diff --git a/cmake/Version.cmake b/cmake/Version.cmake new file mode 100644 index 0000000..45dd488 --- /dev/null +++ b/cmake/Version.cmake @@ -0,0 +1,12 @@ + +include(GetGitRevisionDescription) +# Project Version +set(MARSIO_MAJOR_VERSION 4) +set(MARSIO_MINOR_VERSION 0) +set(MARSIO_PATCH_VERSION 0) +set(MARSIO_VERSION ${MARSIO_MAJOR_VERSION}.${MARSIO_MINOR_VERSION}.${MARSIO_PATCH_VERSION}) + +git_describe(MARSIO_GIT_VERSION) +set(MARSIO_VERSION "${MARSIO_VERSION},${MARSIO_GIT_VERSION}") +set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -DGITVER=\\\"${MARSIO_VERSION}\\\"") +set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -DGITVER=\\\"${MARSIO_VERSION}\\\"")
\ No newline at end of file diff --git a/conf/CMakeLists.txt b/conf/CMakeLists.txt index 63936fb..af173e8 100644 --- a/conf/CMakeLists.txt +++ b/conf/CMakeLists.txt @@ -1,7 +1,9 @@ -configure_file(dpdk-x86_64.conf.in ${CMAKE_SOURCE_DIR}/conf/dpdk-x86_64.conf)
-configure_file(mrenv.conf.in ${CMAKE_SOURCE_DIR}/conf/mrenv.conf)
+configure_file(mrzcpd.ld.conf.in mrzcpd.conf)
+configure_file(mrzcpd.pc.in mrzcpd.pc)
+configure_file(mrzcpd.sysconfig.in mrzcpd)
-install(FILES mrenv.conf DESTINATION /etc/ COMPONENT Profile)
-install(FILES mrglobal.conf DESTINATION /etc/ COMPONENT Profile)
-install(FILES dpdk-x86_64.conf DESTINATION /etc/ld.so.conf.d/ COMPONENT Profile)
\ No newline at end of file +install(FILES mrglobal.conf DESTINATION ${MR_INSTALL_SYSCONFDIR} COMPONENT Profile)
+install(FILES ${CMAKE_BINARY_DIR}/conf/mrzcpd.conf DESTINATION ${MR_INSTALL_LDCONFDIR} COMPONENT Profile)
+install(FILES ${CMAKE_BINARY_DIR}/conf/mrzcpd.pc DESTINATION ${MR_INSTALL_LIBDIR}/pkgconfig COMPONENT Profile)
+install(FILES ${CMAKE_BINARY_DIR}/conf/mrzcpd DESTINATION ${MR_INSTALL_SYSUNITCONFDIR} COMPONENT Profile)
\ No newline at end of file diff --git a/conf/dpdk-x86_64.conf.in b/conf/dpdk-x86_64.conf.in deleted file mode 100644 index 668e228..0000000 --- a/conf/dpdk-x86_64.conf.in +++ /dev/null @@ -1,3 +0,0 @@ -@DPDK_ROOT_DIR@/lib
-@CMAKE_INSTALL_PREFIX@/lib
-@CMAKE_INSTALL_PREFIX@/lib64
\ No newline at end of file diff --git a/conf/mrglobal.conf b/conf/mrglobal.conf index ab9b8c9..849926c 100644 --- a/conf/mrglobal.conf +++ b/conf/mrglobal.conf @@ -34,18 +34,7 @@ sz_txvnode_buffer=128 [burst] sz_rx_burst=32 sz_tx_burst=32 -[app] -# application symbols, use comma to split -symbols=sapp,sapp2 -[app:sapp] -core=5,6,7,8,9,10,11,12 -rxstream=8 -txstream=8 -[app:sapp2] -core=13,14,15,16 -rxstream=4 -txstream=4 [stat] enable=1 [eal] -virtaddr=0x7f40c4a00000 +virtaddr=0x7f40c4a00000
\ No newline at end of file diff --git a/conf/mrzcpd.ld.conf.in b/conf/mrzcpd.ld.conf.in new file mode 100644 index 0000000..d5d8e56 --- /dev/null +++ b/conf/mrzcpd.ld.conf.in @@ -0,0 +1,2 @@ +# Marsio ZeroCopy Driver Library Path
+@MR_INSTALL_LIBDIR@
\ No newline at end of file diff --git a/conf/mrzcpd.pc.in b/conf/mrzcpd.pc.in new file mode 100644 index 0000000..2e7ae4a --- /dev/null +++ b/conf/mrzcpd.pc.in @@ -0,0 +1,11 @@ +prefix=@MR_INSTALL_PREFIX@
+exec_prefix=@MR_INSTALL_PREFIX@
+libdir=@MR_INSTALL_LIBDIR@
+includedir=@MR_INSTALL_INCLUDEDIR@
+bindir=@MR_INSTALL_BINDIR@
+
+Name: mrzcpd
+Description: IIE-MESA Marsio ZeroCopy Driver
+Version: @MARSIO_VERSION@
+Libs: -L@MR_INSTALL_LIBDIR@ -lmarsio
+Cflags: -I@MR_INSTALL_INCLUDEDIR@
\ No newline at end of file diff --git a/conf/mrenv.conf.in b/conf/mrzcpd.sysconfig.in index 5755a15..206cd2b 100644 --- a/conf/mrenv.conf.in +++ b/conf/mrzcpd.sysconfig.in @@ -1,10 +1,5 @@ -# Configure File in Shell Format -# -# DPDK Envourment PATH - -DPDK_ROOT=@DPDK_ROOT_DIR@ -MARSIO_ROOT=@CMAKE_INSTALL_PREFIX@ - +# Marsio ZeroCopy Install Path +MRZCPD_ROOT=@CMAKE_INSTALL_PREFIX@ # HUGEPAGES Count HUGEPAGE_NUM_2M=20000 # PCI Resource Address using IXGBE_UIO drivers diff --git a/core/src/device.c b/core/src/device.c index 31c7f0a..2bf25e5 100644 --- a/core/src/device.c +++ b/core/src/device.c @@ -323,8 +323,8 @@ static int device_info_dump(struct mr_dev * dev) str_usr_addr, dev->mtu, __str_enable_or_disable(dev->param.promisc), - __str_enable_or_disable(dev->param.en_vlan_strip), __str_enable_or_disable(dev->param.en_vlan_filter), + __str_enable_or_disable(dev->param.en_vlan_strip), __str_enable_or_disable(dev->param.en_drop), __str_rssmode(dev->param.rssmode)); diff --git a/runtime/src/runtime.c b/runtime/src/runtime.c index 6707416..37bec21 100644 --- a/runtime/src/runtime.c +++ b/runtime/src/runtime.c @@ -81,6 +81,7 @@ struct exit_handler exit_handlers[MR_RUNTIME_MAX_NR_EXIT_HANDLER]; unsigned int nr_exit_handlers; // 当前运行线程信息 +pthread_mutex_t thread_ids_lock = PTHREAD_MUTEX_INITIALIZER; pthread_t thread_ids[MR_SID_MAX]; unsigned int nr_thread_ids; @@ -94,6 +95,8 @@ static void __autoexit_raise(int status __rte_unused, void * arg __rte_unused) { void * rtvalue; + pthread_mutex_lock(&thread_ids_lock); + // 通知其他线程退出 for (int i = 0; i < nr_thread_ids; i++) { @@ -108,6 +111,8 @@ static void __autoexit_raise(int status __rte_unused, void * arg __rte_unused) if (pthread_kill(thread_ids[i], 0) < 0) continue; pthread_join(thread_ids[i], &rtvalue); } + + pthread_mutex_unlock(&thread_ids_lock); // 运行注册的退出处理函数 for (int i = 0; i < nr_exit_handlers; i++) @@ -121,8 +126,10 @@ static void __autoexit_raise(int status __rte_unused, void * arg __rte_unused) static void __autoexit_thread_setup() { // 记录线程ID + pthread_mutex_lock(&thread_ids_lock); pthread_t pid = pthread_self(); thread_ids[nr_thread_ids++] = pid; + pthread_mutex_unlock(&thread_ids_lock); // 设置线程信号屏蔽,不处理SIGINT、SIGSEGV等信号 sigset_t oldset; diff --git a/service/src/config.c b/service/src/config.c index e04f35f..f3ce748 100644 --- a/service/src/config.c +++ b/service/src/config.c @@ -125,6 +125,7 @@ int sc_config_thread_info(const char * cfg, struct sc_instance * instance) return 0; } +#if 0 static int __parse_app_info(const char * cfg, const char * appsym, struct sc_instance * instance) { @@ -199,6 +200,8 @@ int sc_config_app_info(const char * cfg, struct sc_instance * instance) return 0; } +#endif + // 读协议栈运行参数 static int sc_config_stack_info(const char * cfg, struct sc_instance * instance) { @@ -429,8 +432,6 @@ void sc_stage_config(struct sc_instance * instance) "Please check configure file %s, Failed. ", cfgfile); MR_CHECK(sc_config_device_info(cfgfile, instance) >= 0, "Please check configure file %s, Failed. ", cfgfile); - MR_CHECK(sc_config_app_info(cfgfile, instance) >= 0, - "Please check configure file %s, Failed. ", cfgfile); MR_CHECK(sc_config_vnode_info(cfgfile, instance) >= 0, "Please check configure file %s, Failed. ", cfgfile); MR_CHECK(sc_config_burst_info(cfgfile, instance) >= 0, diff --git a/stack/CMakeLists.txt b/stack/CMakeLists.txt index fb4feb1..575ab3a 100644 --- a/stack/CMakeLists.txt +++ b/stack/CMakeLists.txt @@ -6,7 +6,7 @@ include_directories(${DPDK_INCLUDE_DIR}) add_definitions(${DPDK_C_PREDEFINED})
include_directories(include)
-add_library(stack src/stack.c src/device.c src/neigh.c src/arp.c)
+add_library(stack src/stack.c src/device.c src/neigh.c)
target_link_libraries(stack MESA_prof_load_static mruntime core)
target_link_libraries(stack rt pthread dl)
target_include_directories(stack INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/include/")
\ No newline at end of file diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 8cf7596..03898c5 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -30,5 +30,5 @@ set(TEST_LINK_LIBRARIES ${DPDK_LIBRARY} gtest) # add_executable(TestVMan TestVMan.cc Unittest.cc)
# target_link_libraries(TestVMan ${TEST_LINK_LIBRARIES} core)
-add_executable(TestNeigh TestStackNeigh.cc Unittest.cc)
-target_link_libraries(TestNeigh ${TEST_LINK_LIBRARIES} stack)
\ No newline at end of file +# add_executable(TestNeigh TestStackNeigh.cc Unittest.cc)
+# target_link_libraries(TestNeigh ${TEST_LINK_LIBRARIES} stack)
\ No newline at end of file diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt index 40382d5..3afd427 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -28,6 +28,14 @@ install(TARGETS zcp_app_stat RUNTIME DESTINATION bin COMPONENT Program) install(TARGETS zcp_event_stat RUNTIME DESTINATION bin COMPONENT Program)
install(TARGETS zcp_rx_tcpdump RUNTIME DESTINATION bin COMPONENT Program)
-install(FILES script/mrstart DESTINATION bin PERMISSIONS WORLD_EXECUTE COMPONENT Program)
-install(FILES script/mrstop DESTINATION bin PERMISSIONS WORLD_EXECUTE COMPONENT Program)
-install(FILES script/mrzcpd DESTINATION /etc/init.d/ PERMISSIONS WORLD_EXECUTE COMPONENT Program)
\ No newline at end of file +#install(FILES script/mrstart DESTINATION bin PERMISSIONS WORLD_EXECUTE COMPONENT Program)
+#install(FILES script/mrstop DESTINATION bin PERMISSIONS WORLD_EXECUTE COMPONENT Program)
+#install(FILES script/mrzcpd DESTINATION /etc/init.d/ PERMISSIONS WORLD_EXECUTE COMPONENT Program)
+
+configure_file(systemd/mrenv.service.in systemd/mrenv.service)
+install(FILES ${CMAKE_BINARY_DIR}/tools/systemd/mrenv.service DESTINATION ${MR_INSTALL_SYSUNITDIR} COMPONENT Program)
+
+configure_file(systemd/mrzcpd.service.in systemd/mrzcpd.service)
+install(FILES ${CMAKE_BINARY_DIR}/tools/systemd/mrzcpd.service DESTINATION ${MR_INSTALL_SYSUNITDIR} COMPONENT Program)
+
+install(FILES systemd/mrenv-script DESTINATION ${MR_INSTALL_BINDIR} PERMISSIONS WORLD_EXECUTE COMPONENT Program)
diff --git a/tools/systemd/mrenv-script b/tools/systemd/mrenv-script new file mode 100644 index 0000000..9b047af --- /dev/null +++ b/tools/systemd/mrenv-script @@ -0,0 +1,308 @@ +#!/bin/bash +# + +if [ -z "$MRZCPD_ROOT" ]; then + MRZCPD_ROOT=$(pkg-config mrzcpd --variable=prefix) +fi + +if [ -z "$HUGEPAGE_NUM_2M" ]; then + HUGEPAGE_NUM_2M=0 +fi + +if [ -z "$HUGEPAGE_NUM_1G" ]; then + HUGEPAGE_NUM_1G=0 +fi + +if [ -z "$PCI_ADDR_IXGBE" ]; then + PCI_ADDR_IXGBE="" +fi + +if [ -z "$PCI_ADDR_IGB" ]; then + PCI_ADDR_IGB="" +fi + +MODULE_PATH=$MRZCPD_ROOT/lib/modules/$(uname -r)/extra/mrzcpd +BIN_PATH=$MRZCPD_ROOT/bin/ +KNI_MODULE=rte_kni +UIO_MODULE=igb_uio + +NR_HUGEPAGE_FILE_2M=/sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages +NR_HUGEPAGE_FILE_1G=/sys/kernel/mm/hugepages/hugepages-1048576kB/nr_hugepages +HUGEPAGE_PATH_2M=/mnt/.huge_2M +HUGEPAGE_PATH_1G=/mnt/.huge_1G + +DAEMON=$BIN_PATH/zcpd +NICTOOL=$BIN_PATH/mr_nic_bind +KNI_MODULE_FILENAME=$KNI_MODULE.ko +UIO_MODULE_FILENAME=$UIO_MODULE.ko + +function module_unload_uio() +{ + lsmod | grep -s $UIO_MODULE > /dev/null 2>&1 + [ $? -eq 0 ] && rmmod $UIO_MODULE 2>&1 + [ ! $? -eq 0 ] && return 1 + return 0 +} + +function module_unload_kni() +{ + lsmod | grep -s $KNI_MODULE > /dev/null 2>&1 + [ $? -eq 0 ] && rmmod $KNI_MODULE 2>&1 + [ ! $? -eq 0 ] && return 1 + return 0 +} + +function module_load_kni() +{ + if [ ! -e $MODULE_PATH/$KNI_MODULE_FILENAME ]; then + echo -n "$KNI_MODULE_FILENAME does not existed. " + return 1 + fi + + module_unload_kni + insmod $MODULE_PATH/$KNI_MODULE_FILENAME > /dev/null 2>&1 + [ ! $? -eq 0 ] && echo -n " $MODULE_PATH/$KNI_MODULE_FILENAME load failure." && return 1 + return 0 +} + +function module_load_uio() +{ + if [ ! -e $MODULE_PATH/$UIO_MODULE_FILENAME ]; then + echo -n "$MODULE_PATH/$UIO_MODULE_FILENAME does not existed. Check DPDK is installed or not. " + return 1 + fi + + module_unload_uio + modprobe uio &> /dev/null + insmod $MODULE_PATH/$UIO_MODULE_FILENAME + [ ! $? -eq 0 ] && echo -n "$MODULE_PATH/$UIO_MODULE_FILENAME load failure." && return 1 + return 0 +} + +function huge_release_1G() +{ + cat /proc/mounts | grep "$HUGEPAGE_PATH_1G" > /dev/null + grep -s "$HUGEPAGE_PATH_1G" /proc/mounts > /dev/null + if [ $? -eq 0 ]; then + umount $HUGEPAGE_PATH_1G > /dev/null + [ ! $? -eq 0 ] && echo "umount 1G hugepage failure, maybe in use" && return 1 + fi + + if [ -d $HUGEPAGE_PATH_1G ] ; then + rm -R $HUGEPAGE_PATH_1G + [ ! $? -eq 0 ] && echo "Cannot delete 2M hugepage" && return 1 + fi + return 0 +} + +function huge_release_2M() +{ + cat /proc/mounts | grep "$HUGEPAGE_PATH_2M" > /dev/null + grep -s "$HUGEPAGE_PATH_2M" /proc/mounts > /dev/null + if [ $? -eq 0 ]; then + umount $HUGEPAGE_PATH_2M > /dev/null + [ ! $? -eq 0 ] && echo "umount 2M hugepage failure, maybe in use" && return 1 + fi + + if [ -d $HUGEPAGE_PATH_2M ] ; then + rm -R $HUGEPAGE_PATH_2M + [ ! $? -eq 0 ] && echo "Cannot delete 2M hugepage" && return 1 + fi + + if [ -e $NR_HUGEPAGE_FILE_2M ]; then + echo -n 0 > $NR_HUGEPAGE_FILE_2M + fi + + return 0 +} + +function huge_alloc_1G() +{ + if [ ! -e $NR_HUGEPAGE_FILE_1G ]; then + return 1 + fi + + SIZE_1G=$(cat $NR_HUGEPAGE_FILE_1G) + [ $SIZE_1G -eq 0 ] && echo -n $HUGEPAGE_NUM_1G > $NR_HUGEPAGE_FILE_1G + + mkdir -p $HUGEPAGE_PATH_1G + mount -t hugetlbfs nodev -o pagesize=1G $HUGEPAGE_PATH_1G + [ $? -eq 0 ] && return 0 + + return 1 +} + +function huge_alloc_2M() +{ + if [ ! -e $NR_HUGEPAGE_FILE_2M ]; then + return 1 + fi + + SIZE_2M=$(cat $NR_HUGEPAGE_FILE_2M) + [ $SIZE_2M -eq 0 ] && echo -n $HUGEPAGE_NUM_2M > $NR_HUGEPAGE_FILE_2M + mkdir -p $HUGEPAGE_PATH_2M + mount -t hugetlbfs nodev $HUGEPAGE_PATH_2M + [ $? -eq 0 ] && return 0 + return 1 +} + +function huge_alloc() +{ + if [ ! $HUGEPAGE_NUM_1G -eq 0 ]; then + huge_release_1G + huge_alloc_1G + fi + + if [ ! $HUGEPAGE_NUM_2M -eq 0 ]; then + huge_release_2M + huge_alloc_2M + fi + + return $? +} + +function huge_release() +{ + huge_release_1G && huge_release_2M + huge_release_2M + return $? +} + +function nic_unbind_ixgbe() +{ + OLDIFS=$IFS; IFS=, + for ITER_PCI_ADDR in $PCI_ADDR_IXGBE; do + $NICTOOL --force -b ixgbe $ITER_PCI_ADDR + [ ! $? -eq 0 ] && return 1 + done + IFS=$OLDIFS + return 0 +} + +function nic_unbind_igb() +{ + OLDIFS=$IFS; IFS=, + for ITER_PCI_ADDR in $PCI_ADDR_IGB; do + $NICTOOL --force -b igb $ITER_PCI_ADDR + [ ! $? -eq 0 ] && return 1 + done + IFS=$OLDIFS + return 0 +} + +function nic_bind_ixgbe() +{ + OLDIFS=$IFS; IFS=, + for ITER_PCI_ADDR in $PCI_ADDR_IXGBE; do + $NICTOOL --force -b igb_uio $ITER_PCI_ADDR + [ ! $? -eq 0 ] && return 1 + done + IFS=$OLDIFS + return 0 +} + +function nic_bind_igb() +{ + OLDIFS=$IFS; IFS=, + for ITER_PCI_ADDR in $PCI_ADDR_IGB; do + $NICTOOL --force -b igb_uio $ITER_PCI_ADDR + [ ! $? -eq 0 ] && return 1 + done + IFS=$OLDIFS + return 0 +} + +function check_app_exist() +{ + APP_USE_HUGE_2M=$(lsof -t $HUGEPAGE_PATH_2M 2>/dev/null) + RET1=$? + APP_USE_HUGE_1G=$(lsof -t $HUGEPAGE_PATH_1G 2>/dev/null) + RET2=$? + + return $RET1 || $RET2 +} + +function kill_app() +{ + APP_USE_HUGE_2M=$(lsof -t $HUGEPAGE_PATH_2M 2>/dev/null) + RET1=$? + APP_USE_HUGE_1G=$(lsof -t $HUGEPAGE_PATH_1G 2>/dev/null) + RET2=$? + + if [ $RET1 -eq 0 -a "$APP_USE_HUGE_2M" != "" ]; then + kill $APP_USE_HUGE_2M + fi + if [ $RET2 -eq 0 -a "$APP_USE_HUGE_1G" != "" ]; then + kill $APP_USE_HUGE_1G + fi + return 0 +} + +function marsiod_stop() +{ + kill_app + return 0 +} + +function marsiod_start() +{ + echo 0 > /proc/sys/kernel/randomize_va_space + return 0 +} + +function start() +{ + # Require Step, if failure, all step should be stop. + module_load_uio + [ ! $? -eq 0 ] && return 1 + huge_alloc + [ ! $? -eq 0 ] && return 1 + nic_bind_ixgbe + [ ! $? -eq 0 ] && return 1 + nic_bind_igb + [ ! $? -eq 0 ] && return 1 + marsiod_start + [ ! $? -eq 0 ] && return 1 + return 0 +} + +function stop() +{ + marsiod_stop + [ ! $? -eq 0 ] && return 1 + huge_release + [ ! $? -eq 0 ] && return 1 + nic_unbind_ixgbe + [ ! $? -eq 0 ] && return 1 + nic_unbind_igb + [ ! $? -eq 0 ] && return 1 + module_unload_uio + [ ! $? -eq 0 ] && return 1 + return 0 +} + +function restart() +{ + stop + start $* +} + +action=$1 +shift + +case $action in + start) + start $* + ;; + stop) + stop + ;; + restart) + restart $* + ;; + *) + echo "Usage: service $0 {start|stop|restart}" + exit 1 +esac + +exit $?
\ No newline at end of file diff --git a/tools/systemd/mrenv.service.in b/tools/systemd/mrenv.service.in new file mode 100644 index 0000000..533071b --- /dev/null +++ b/tools/systemd/mrenv.service.in @@ -0,0 +1,13 @@ +[Unit] +Description=Setup/Unsetup mrzcpd runtime environment +After=network.target + +[Service] +Type=oneshot +EnvironmentFile=/etc/sysconfig/mrzcpd +ExecStart=@MR_INSTALL_BINDIR@/mrenv-script start +ExecStop=@MR_INSTALL_BINDIR@/mrenv-script stop +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target
\ No newline at end of file diff --git a/tools/systemd/mrzcpd.service.in b/tools/systemd/mrzcpd.service.in new file mode 100644 index 0000000..9f8365c --- /dev/null +++ b/tools/systemd/mrzcpd.service.in @@ -0,0 +1,12 @@ +[Unit] +Description=Marsio ZeroCopy Driver Daemon +Requires=mrenv.service +After=mrenv.service + +[Service] +EnvironmentFile=/etc/sysconfig/mrzcpd +ExecStart=@MR_INSTALL_BINDIR@/zcpd -c @MR_INSTALL_SYSCONFDIR@/mrglobal.conf +Restart=on-failure + +[Install] +WantedBy=multi-user.target
\ No newline at end of file |
