blob: f08446f7d0b0bd75135da79fc6ae05dffad00bf9 [file] [log] [blame]
# hotplug.fns - Collection of functions for hotplugging
# operations.
# Routines in this library are set up to allow timing to be done
# by defining $TIME to a timing command.
TIME=${TIME:-""}
# get_all_irqs()
#
# Gets list of all available IRQs in the system
#
get_all_irqs()
{
echo `egrep [0-9]+: /proc/interrupts | cut -d ':' -f 1`
return
}
# migrate_irq(CPU, IRQS)
#
# Sets the smp_affinity for the list of $IRQS to the given
# CPU number
#
migrate_irq()
{
CPU=${1#cpu}
MASK=$((1<<${CPU}))
IRQS=$2
for irq in ${IRQS}
do
echo $MASK > /proc/irq/${irq}/smp_affinity
done
}
# get_affinity(PID)
#
# Echos the CPU affinity for the given process ID to stdout
#
get_affinity_mask()
{
AFFINITY=`taskset -p ${1}`
echo ${AFFINITY}
return
}
# set_affinity(PID, CPU)
#
# Sets the affinity for the given PID to the specified CPU.
#
set_affinity()
{
PID="$1"
CPU="$2"
MASK=$((1<<${CPU_TO_TEST}))
`taskset -p ${MASK} ${PID} > /dev/null 2>&1`
return $?
}
# online_cpu(CPU)
#
# Onlines the given CPU. Returns a true value if it was able
# to perform the online operation successfully, false otherwise.
#
# $CPU should either be a specific number like 4, or the cpu name,
# as in 'cpu4'.
#
online_cpu()
{
CPU=${1#cpu}
if [ ! -w /sys/devices/system/cpu/cpu${CPU}/online ]; then
return 1
fi
$TIME echo 1 > /sys/devices/system/cpu/cpu${CPU}/online
RC=$?
report_timing "Online cpu ${CPU}"
return $RC
}
# offline_cpu(CPU)
#
# Offlines the given CPU. Returns a true value if it was able
# to perform the offline operation successfully, false otherwise.
#
offline_cpu()
{
CPU=${1#cpu}
if [ ! -w /sys/devices/system/cpu/cpu${CPU}/online ]; then
return 1
fi
$TIME echo 0 > /sys/devices/system/cpu/cpu${CPU}/online
RC=$?
report_timing "Offline cpu ${CPU}"
return $RC
}
# get_all_cpus()
#
# Prints a list of all available CPUs, regardless of whether they're
# currently online or offline.
#
# This routine will work even if the CPUs are not hotpluggable, however
# it requires you have sysfs enabled in the kernel.
#
get_all_cpus()
{
[ -d /sys/devices/system/cpu/cpu0 ] || return 1
ls -dr /sys/devices/system/cpu/cpu[0-9]* || return 2
}
# get_all_cpu_states()
#
# Collects the current online/offline state of CPUs in the
# system, printing it in a format that can be passed to
# set_all_cpu_states() later.
#
get_all_cpu_states()
{
echo `cd /sys/devices/system/cpu/ && grep '' */online | sed -e 's/\/online//'`
return
}
# set_all_cpu_states(STATES)
#
# Sets all of the CPU states according to $STATE, which must be
# of the form "cpuX:Y", where X is the CPU number and Y its state.
# Each must be on a separate line.
#
set_all_cpu_states()
{
for cpu_state in $STATE; do
cpu=`echo $c | cut -d: -f 1`
state=`echo $c | cut -d: -f 1`
if [ $state = 1 ]; then
echo "# Re-onlining $cpu"
online_cpu $cpu
else
echo "# Re-offlining $cpu"
offline_cpu $cpu
fi
done
}
# get_online_cpus()
#
# Prints a list of all CPUs currently online. This function only
# works if the system's CPUs have hotplug capabilities
#
get_online_cpus()
{
echo `cd /sys/devices/system/cpu/ && grep 1 */online | cut -d '/' -f 1`
return
}
# get_offline_cpus()
#
# Prints a list of all CPUs currently offline. This function only
# works if the system's CPUs have hotplug capabilities
#
get_offline_cpus()
{
echo `cd /sys/devices/system/cpu/ && grep 0 */online | cut -d '/' -f 1`
return
}
# cpu_is_valid(CPU)
#
# Checks to see if the given CPU number is available for hotplugging
# in the system. Returns 0 if the CPU is available, 1 otherwise.
#
cpu_is_valid()
{
CPU=${1#cpu}
echo "CPU is $CPU"
cat /sys/devices/system/cpu/cpu${CPU}/online > /dev/null 2>&1
return $?
}
# cpu_is_online(CPU)
#
# Returns a true value if the given CPU number is currently online,
# false otherwise. This function requires the system's CPUs have
# hotplug capabilities.
#
cpu_is_online()
{
CPU=${1#cpu}
if [ `cat /sys/devices/system/cpu/cpu${CPU}/online` = "1" ]; then
return 0
else
return 1
fi
}