summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQiuwen Lu <[email protected]>2016-11-02 21:04:35 +0800
committerQiuwen Lu <[email protected]>2016-11-02 21:04:35 +0800
commite8e0c94bc5e52eefb5f71775986e89e4d775faf7 (patch)
treeb76ae799297aebd399d0d2e342ef914a9b64b7a0
parentb88cf32a2d358882b9734fece1067ecaca3533d6 (diff)
parent0fb7afbdbf28c256ccbf27e37b499722763357d2 (diff)
Merge branch 'dev-4.X.X' into rel-4.X.Xv4.0.4-20161102
-rw-r--r--CMakeLists.txt16
-rw-r--r--cmake/InstallDPDK.cmake34
-rw-r--r--cmake/Version.cmake12
-rw-r--r--conf/CMakeLists.txt12
-rw-r--r--conf/dpdk-x86_64.conf.in3
-rw-r--r--conf/mrglobal.conf13
-rw-r--r--conf/mrzcpd.ld.conf.in2
-rw-r--r--conf/mrzcpd.pc.in11
-rw-r--r--conf/mrzcpd.sysconfig.in (renamed from conf/mrenv.conf.in)9
-rw-r--r--core/src/device.c2
-rw-r--r--runtime/src/runtime.c7
-rw-r--r--service/src/config.c5
-rw-r--r--stack/CMakeLists.txt2
-rw-r--r--test/CMakeLists.txt4
-rw-r--r--tools/CMakeLists.txt14
-rw-r--r--tools/systemd/mrenv-script308
-rw-r--r--tools/systemd/mrenv.service.in13
-rw-r--r--tools/systemd/mrzcpd.service.in12
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