#! /bin/sh
# Copyright (c)1995 SuSE GmbH Nuernberg, Germany.
# 
# Author: SuSE Oracle Team <feedback@suse.de>
# Homepage: http://www.suse.com/oracle/
# 

. /usr/lib/orarun/common.sh


ora_environment start

# Set kernel parameters for Oracle
if [ "${SET_ORACLE_KERNEL_PARAMETERS:-no}" == "yes" ]; then
  echo
  echo "Setting kernel parameters for Oracle, see file"
  if test -f /etc/sysconfig/oracle; then
    echo "/etc/sysconfig/oracle for explanations."
  else
    echo "/etc/rc.config.d/oracle.rc.config for explanations."
  fi
  echo

  if  [ ! -d /proc/sys/kernel ]; then
      echo; echo "No sysctl kernel interface - cannot set kernel parameters."; echo
      rc_failed
  else
    # Set shared memory parameters
    echo -n "${extd}Shared memory:$norm    "
    test -f /proc/sys/kernel/shmmax && echo -n "  SHMMAX=${SHMMAX:-3294967296}"
    test -f /proc/sys/kernel/shmmax && echo ${SHMMAX:-3294967296} > /proc/sys/kernel/shmmax
    test -f /proc/sys/kernel/shmmni && echo -n "  SHMMNI=${SHMMNI:-4096}"
    test -f /proc/sys/kernel/shmmni && echo ${SHMMNI:-4096}       > /proc/sys/kernel/shmmni
    test -f /proc/sys/kernel/shmall && echo    "  SHMALL=${SHMALL:-2097152}"
    test -f /proc/sys/kernel/shmall && echo ${SHMALL:-2097152}    > /proc/sys/kernel/shmall
    test -f /proc/sys/kernel/shmall || echo

    # Set the semaphore parameters:
    # see Oracle release notes for Linux for how to set these values
    # SEMMSL, SEMMNS, SEMOPM, SEMMNI
    echo -n "${extd}Semaphore values:$norm "
    test -f /proc/sys/kernel/sem && echo -n "  SEMMSL=${SEMMSL:-1250}"
    test -f /proc/sys/kernel/sem && echo -n "  SEMMNS=${SEMMNS:-32000}"
    test -f /proc/sys/kernel/sem && echo -n "  SEMOPM=${SEMOPM:-100}"
    test -f /proc/sys/kernel/sem && echo    "  SEMMNI=${SEMMNI:-256}"
    test -f /proc/sys/kernel/sem && echo ${SEMMSL:-1250} ${SEMMNS:-32000} ${SEMOPM:-100} ${SEMMNI:-128} > /proc/sys/kernel/sem
    test -f /proc/sys/kernel/sem || echo

    echo -n "${extd}Other values:$norm     "
    test -f /proc/sys/fs/file-max && echo -n "  FILE_MAX_KERNEL=${FILE_MAX_KERNEL:-6815744}"  
    test -f /proc/sys/fs/file-max && echo ${FILE_MAX_KERNEL:-6815744} > /proc/sys/fs/file-max  
    test -f /proc/sys/net/ipv4/ip_local_port_range && echo "  IP_LOCAL_PORT_RANGE=${IP_LOCAL_PORT_RANGE:-"9000 65500"}"  
    test -f /proc/sys/net/ipv4/ip_local_port_range && echo ${IP_LOCAL_PORT_RANGE:-"9000 65500"} > /proc/sys/net/ipv4/ip_local_port_range
    test -f /proc/sys/net/core/rmem_default && echo -n "  RMEM_DEFAULT=${RMEM_DEFAULT:-262144}"
    test -f /proc/sys/net/core/rmem_default && echo ${RMEM_DEFAULT:-262144} > /proc/sys/net/core/rmem_default
    test -f /proc/sys/net/core/wmem_default && echo -n "  WMEM_DEFAULT=${WMEM_DEFAULT:-262144}"
    test -f /proc/sys/net/core/wmem_default && echo ${WMEM_DEFAULT:-262144} > /proc/sys/net/core/wmem_default
    test -f /proc/sys/net/core/rmem_max && echo -n "  RMEM_MAX=${RMEM_MAX:-4194304}"
    test -f /proc/sys/net/core/rmem_max && echo ${RMEM_MAX:-4194304} > /proc/sys/net/core/rmem_max
    test -f /proc/sys/net/core/wmem_max && echo -n "  WMEM_MAX=${WMEM_MAX:-1048586}"
    test -f /proc/sys/net/core/wmem_max && echo ${WMEM_MAX:-1048586} > /proc/sys/net/core/wmem_max
    test -f /proc/sys/vm/vm_mapped_ratio && echo -n "  VM_MAPPED_RATIO=${VM_MAPPED_RATIO:-100}"
    test -f /proc/sys/vm/vm_mapped_ratio && echo ${VM_MAPPED_RATIO:-250} > /proc/sys/vm/vm_mapped_ratio
    # aio-max-size is obsolete in 2.6 & it's changed to aio-max-nr 
    test -f /proc/sys/fs/aio-max-nr && echo "  AIO_MAX_SIZE=${AIO_MAX_SIZE:-1048576}"
    test -f /proc/sys/fs/aio-max-nr && echo ${AIO_MAX_SIZE:-1048576} > /proc/sys/fs/aio-max-nr
    test -f /proc/sys/fs/aio-max-nr || echo

#HUGEPAGES
    echo -n "${extd}Huge Pages:$norm     "
    # on SLES9
    test -f /proc/sys/vm/disable_cap_mlock && echo 1 > /proc/sys/vm/disable_cap_mlock

    # on SLES10
    test -f /proc/sys/vm/hugetlb_shm_group && echo -n "    SHM_GROUP=${SHM_GROUP}"
    SHM_GROUP_GID=`cat /etc/group | grep -w ${SHM_GROUP} |awk -F: '{ print $3 }'`
    test -f /proc/sys/vm/hugetlb_shm_group && echo ${SHM_GROUP_GID} > /proc/sys/vm/hugetlb_shm_group

    test -f /proc/sys/vm/nr_hugepages && echo -n "    NR_HUGE_PAGES=${NR_HUGE_PAGES:-0}"
    test -f /proc/sys/vm/nr_hugepages && echo ${NR_HUGE_PAGES:-0} > /proc/sys/vm/nr_hugepages

    echo

    echo -n "${extd}ULIMIT values:$norm    "
    echo    "  MAX_CORE_FILE_SIZE_SHELL=${MAX_CORE_FILE_SIZE_SHELL:-0}"
    ulimit -c ${MAX_CORE_FILE_SIZE_SHELL:-0}
    echo -n "                    FILE_MAX_SHELL=${FILE_MAX_SHELL:-65536}"
    ulimit -n ${FILE_MAX_SHELL:-65536}
    echo    "  PROCESSES_MAX_SHELL=${PROCESSES_MAX_SHELL:-16384}"
    ulimit -u ${PROCESSES_MAX_SHELL:-16384}

    # Check if shmmax is really set to what we want - on some systems and
    # certain settings the result could be shmmax=0 if you set it to e.g. 4GB!
    if [ `cat /proc/sys/kernel/shmmax` != "${SHMMAX:-3294967296}" ]; then
      echo "${warn}---- WARNING - SHMMAX could not be set properly ----$norm"
      echo "   Tried to set it to: ${SHMMAX:-3294967296}"
      echo "   Value is now:       `cat /proc/sys/kernel/shmmax`"
      echo "   You might try again with a lower value."
    fi
  fi
  echo

    # Check for /etc/sysctl.conf settings (see 'man sysctl') for conflicting kernel settings
    test -s /etc/sysctl.conf &&   \
    {
      echo "Checking sysctl.conf to overwrite previous kernel settings..."
      for i in kernel.shmmax kernel.shmmni kernel.shmall kernel.sem vm.nr_hugepages vm.hugetlb_shm_group\
            net.core.rmem_default net.core.rmem_max net.core.wmem_default net.core.wmem_max \
            fs.file-max net.ipv4.ip_local_port_range vm.vm_mapped_ratio fs.aio-max-nr ; do
                line=`grep $i /etc/sysctl.conf | sed 's/\ //g'`
        name=`echo $line | cut -d'=' -f 1`
        value=`echo $line | cut -d'=' -f 2`
        if [ -n "$line" ]; then
          echo "   sysctl value $name=$value restored."
            USE_SYSCTL="yes"
        fi
      done
    }

    if [ "$USE_SYSCTL" = "yes" ]; then
          sysctl -q -p
    fi
  echo

  echo -n "Kernel parameters set for Oracle: "
  echo
fi


