#!/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 }