#! /bin/bash
#
# KBDPDK library boot script
# This script is used to configure the NIC drivers
# and huge pages in the system for usage of the kbdpdk library
#
### BEGIN INIT INFO
# Provides:             kbdpdk
# Required-Start:
# Required-Stop:
# Default-Start:        2 3 4 5
# Default-Stop:         
# Short-Description:    kbdpdk system configuration
### END INIT INFO


test -f /etc/kbdpdk/kbconfig.conf && . /etc/kbdpdk/kbconfig.conf || exit 0

KBDPDK_PATH=/usr/share/deltacast/kbdpdk
DPDK_TOOLS_PATH=/usr/local/share/dpdk/usertools

case "$1" in
  start)
    numa_count=`cat /proc/cpuinfo |grep "physical id" | sort -n | uniq | wc -l`
    for (( i=0; i<$numa_count; i++ ))
    do
      hp1g=huge_page_1G_numa$i
      hp2m=huge_page_2M_numa$i
   
      [ -f "/sys/devices/system/node/node$i/hugepages/hugepages-2048kB/nr_hugepages" ] && echo ${!hp2m} > /sys/devices/system/node/node$i/hugepages/hugepages-2048kB/nr_hugepages
      [ -f "/sys/devices/system/node/node$i/hugepages/hugepages-1048576kB/nr_hugepages" ] && echo ${!hp1g} > /sys/devices/system/node/node$i/hugepages/hugepages-1048576kB/nr_hugepages
    done

    # Mount huge pages
    mkdir -p /dev/hugepages/huge_2MB
    mkdir -p /dev/hugepages/huge_1GB
    mount -t hugetlbfs none /dev/hugepages/huge_2MB
    mount -t hugetlbfs -o pagesize=1g none /dev/hugepages/huge_1GB

    # Bind NICs with UIO
    if [ ! -z "$reserved_nics" ]
    then
      modprobe vfio-pci
      if [ $(ls -A /sys/class/iommu) ];
      then
        echo 0 > /sys/module/vfio/parameters/enable_unsafe_noiommu_mode
      else
        echo 1 > /sys/module/vfio/parameters/enable_unsafe_noiommu_mode
      fi

      for nic in $(echo $reserved_nics | sed "s/,/ /g")
      do
        $KBDPDK_PATH/tools/dpdk-devbind.py --force --bind=vfio-pci $nic
      done
    fi

    ;;
  restart|force-reload|reload)
    # do nothing
    ;;
  stop)
    umount /dev/hugepages/huge_2MB
    umount /dev/hugepages/huge_1GB
    ;;
  *)
    echo "Usage: /etc/init.d/kbdpdk {start|stop|restart}"
    exit 2
    ;;
esac

exit 0

