blob: 71d0647fc18f27008af91b45d56edf8be2fb967f [file] [log] [blame]
#!/sbin/runscript
# Copyright 1999-2012 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id$
# Based on openibd script from openfabrics.org,
# Copyright (c) 2006 Mellanox Technologies. All rights reserved.
# Distributed under the terms of the GNU General Public License v2
depend() {
after hotplug
before net # init openib before starting any ipoib interfaces
}
OPENIB_CONFDIR=${OPENIB_CONFDIR:-/etc/infiniband}
if [[ -r ${OPENIB_CONFDIR}/openib.conf ]] ; then
. ${OPENIB_CONFDIR}/openib.conf
fi
# Setting OpenIB start parameters
POST_LOAD_MODULES=""
if [ "X${SDP_LOAD}" == "Xyes" ]; then
POST_LOAD_MODULES="$POST_LOAD_MODULES ib_sdp"
IPOIB_LOAD="yes"
fi
IPOIB=0
if [ "X${IPOIB_LOAD}" == "Xyes" ]; then
IPOIB=1
fi
if [ "X${SRP_LOAD}" == "Xyes" ]; then
POST_LOAD_MODULES="$POST_LOAD_MODULES ib_srp"
fi
if [ "X${SRP_TARGET_LOAD}" == "Xyes" ]; then
POST_LOAD_MODULES="$POST_LOAD_MODULES ib_srp_target"
fi
if [ "X${RDMA_CM_LOAD}" == "Xyes" ]; then
POST_LOAD_MODULES="$POST_LOAD_MODULES rdma_cm"
fi
if [ "X${UCM_LOAD}" == "Xyes" ]; then
POST_LOAD_MODULES="$POST_LOAD_MODULES ib_ucm"
fi
if [ "X${RDS_LOAD}" == "Xyes" ]; then
POST_LOAD_MODULES="$POST_LOAD_MODULES ib_rds"
fi
if [ "X${ISER_LOAD}" == "Xyes" ]; then
POST_LOAD_MODULES="$POST_LOAD_MODULES ib_iser"
fi
if [ "X${RDMA_UCM_LOAD}" == "Xyes" ]; then
POST_LOAD_MODULES="$POST_LOAD_MODULES rdma_ucm"
fi
PRE_UNLOAD_MODULES="ib_rds ib_ucm kdapl ib_srp_target scsi_target ib_srp ib_iser ib_sdp rdma_ucm rdma_cm ib_addr ib_cm ib_local_sa findex"
# W/A for unloading modules
POST_UNLOAD_MODULES="$PRE_UNLOAD_MODULES ib_ipoib ib_sa ib_uverbs ib_umad"
# ib_mthca ib_ipath - don't unload unless they are in openib.conf
[[ "${MTHCA_LOAD}" == "yes" ]] && \
POST_UNLOAD_MODULES="$POST_UNLOAD_MODULES ib_mthca"
[[ "${IPATH_LOAD}" == "yes" ]] && \
POST_UNLOAD_MODULES="$POST_UNLOAD_MODULES ib_ipath ipath_core"
[[ "${MTHCA_LOAD}" == "yes" || "${IPATH_LOAD}" == "yes" ]] && \
POST_UNLOAD_MODULES="$POST_UNLOAD_MODULES ib_mad ib_core"
#STATUS_MODULES="rdma_ucm ib_rds ib_srp ib_sdp rdma_cm ib_addr ib_local_sa findex ib_ipoib ib_ipath ipath_core ib_mthca ib_uverbs ib_umad ib_ucm ib_sa ib_cm ib_mad ib_core"
# If module $1 is loaded return - 0 else - 1
is_module()
{
local RC
/bin/lsmod | grep -w "$1" > /dev/null 2>&1
RC=$?
return $RC
}
unload()
{
# Unload module $1
if is_module $mod; then
/sbin/modprobe -r $mod > /dev/null 2>&1
if [ $? -ne 0 ]; then
# Try rmmod if modprobe failed: case that previous installation included more IB modules.
/sbin/rmmod $mod > /dev/null 2>&1
if [ $? -ne 0 ]; then
ewarn "Failed to unload $mod"
return 1
fi
fi
fi
}
start() {
local RC=0
ebegin "Initializing Infiniband"
eindent
# Load Mellanox HCA driver if explicitly requested
# (however, it should be loaded automatically by udev)
einfo "Loading HCA and Access Layer drivers"
if [[ "${MTHCA_LOAD}" == "yes" ]]; then
/sbin/modprobe ib_mthca > /dev/null 2>&1
RC=$[ $RC + $? ]
fi
if [[ "${IPATH_LOAD}" == "yes" ]]; then
/sbin/modprobe ib_ipath > /dev/null 2>&1
RC=$[ $RC + $? ]
fi
# Add node description to sysfs
IBSYSDIR="/sys/class/infiniband"
if [ -d ${IBSYSDIR} ]; then
declare -i hca_id=1
for hca in ${IBSYSDIR}/*; do
if [ -e ${hca}/node_desc ]; then
echo -n "$(hostname -s) HCA-${hca_id}" >> ${hca}/node_desc
fi
let hca_id++
done
fi
/sbin/modprobe ib_umad > /dev/null 2>&1
RC=$[ $RC + $? ]
/sbin/modprobe ib_uverbs > /dev/null 2>&1
RC=$[ $RC + $? ]
if [ $IPOIB -eq 1 ]; then
# this section is not necessary if all ib-over-ib devices are
# aliased properly in /etc/modules.d/openib
einfo "loading ib_ipoib module"
/sbin/modprobe ib_ipoib > /dev/null 2>&1
RC=$[ $RC + $? ]
if (( ! RC )); then
# start the ipoib devices automatically...
# this is probably a bad idea (the concept is taken from the
# original SUSE/Redhat-based initscript), and should be removed.
# But it works, and is not enabled by default. So I leave it here
# for second opinions.
local ibdevs=`rc-status -u -nc |egrep 'net\.ib[0-9a-zA-Z]+.*stopped' | awk '{print $1}'`
if [ -n "$ibdevs" ] ; then
einfo "starting ipoib devices"
for ibdev in $ibdevs; do
/etc/init.d/$ibdev start
done
fi
fi
fi
# Devices for ib_umad and ib_uverbs should now have been created.
if [ ! -d /dev/infiniband/ ]; then
eerror "udev failed to create '/dev/infiniband/' devices"
RC=1
fi
# Load configured modules
if [ "$POST_LOAD_MODULES" != "" ]; then
for mod in $POST_LOAD_MODULES
do
case $mod in
ib_iser)
# Voltaire requirement
/sbin/modprobe --force-modversion $mod > /dev/null 2>&1
;;
*)
/sbin/modprobe $mod > /dev/null 2>&1
;;
esac
RC=$?
[ $RC -ne 0 ] && eerror "Failed to load $mod"
done
fi
eoutdent
eend $RC
}
stop() {
ebegin "Stopping Infiniband"
local RC=0
# Check if applications which use infiniband are running
local apps="opensm osmtest ibbs ibns"
local pid
for app in $apps
do
if ( ps -ef | grep $app | grep -v grep > /dev/null 2>&1 ); then
eerror "Please stop $app and all applications running over InfiniBand"
eend 1
return
fi
done
if ! is_module ib_core; then
einfo "HCA driver is not loaded"
eend 0
return
fi
# Unload ULPs modules
if [ "$PRE_UNLOAD_MODULES" != "" ]; then
for mod in $PRE_UNLOAD_MODULES
do
unload $mod || { eend 1; return; }
done
fi
# Remove srp_presistant_bind.sh before removing ib_srp module
PID_SCRPT_TO_KILL=`ps -efww | grep srp_persistent | grep -v grep | awk '{print $2}'`
if ! [ "$PID_SCRPT_TO_KILL" == "" ]; then
PID_SLEEP_TO_KILL=`ps -efww | grep $PID_SCRPT_TO_KILL | grep sleep | awk '{print $2}'`
kill -9 $PID_SCRPT_TO_KILL
fi
if ! [ "$PID_SLEEP_TO_KILL" == "" ]; then
kill -9 $PID_SLEEP_TO_KILL
fi
# Unload OpenIB modules
if [ "$POST_UNLOAD_MODULES" != "" ]; then
for mod in $POST_UNLOAD_MODULES
do
unload $mod || RC=1
done
fi
eend $RC
}