#!/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 $?