1c1474e50551f1dabeeddbfd91f96e82d15bc5790Jin Li#!/bin/sh
2c1474e50551f1dabeeddbfd91f96e82d15bc5790Jin Li
3e469ab15b2332629432b9347d6ad71dfef885e95Xing Gu# cpuhotplug_hotplug.sh - Collection of functions for hotplugging
450512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak# operations.
550512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak
650512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak# Routines in this library are set up to allow timing to be done
737550cf5a86c7ca7424a2a318dd64e550f13f5dfChris Dearman# by defining $TIME to a timing command.
850512d9c147b0e8a05d4d814af3ba83852a79304subrata_modakTIME=${TIME:-""}
950512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak
1050512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak# get_all_irqs()
1150512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak#
1250512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak#  Gets list of all available IRQs in the system
1350512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak#
1450512d9c147b0e8a05d4d814af3ba83852a79304subrata_modakget_all_irqs()
1550512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak{
1650512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak    echo `egrep [0-9]+: /proc/interrupts | cut -d ':' -f 1`
1750512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak    return
1850512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak}
1950512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak
2050512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak# migrate_irq(CPU, IRQS)
2137550cf5a86c7ca7424a2a318dd64e550f13f5dfChris Dearman#
2250512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak#  Sets the smp_affinity for the list of $IRQS to the given
2350512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak#  CPU number
2450512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak#
2550512d9c147b0e8a05d4d814af3ba83852a79304subrata_modakmigrate_irq()
2650512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak{
2750512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak    CPU=${1#cpu}
2850512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak    MASK=$((1<<${CPU}))
2950512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak    IRQS=$2
30a60c6c8f08dcd7d9760ab0a164689d52f912c266Wei Jiangang    for irq in ${IRQS}; do
31c1474e50551f1dabeeddbfd91f96e82d15bc5790Jin Li      echo $MASK > /proc/irq/${irq}/smp_affinity || \
32c1474e50551f1dabeeddbfd91f96e82d15bc5790Jin Li        tst_resm TINFO "It is NOT permitted to change the IRQ $irq smp_affinity"
3350512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak    done
3450512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak}
3550512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak
3650512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak
3750512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak# get_affinity(PID)
3850512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak#
3950512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak#  Echos the CPU affinity for the given process ID to stdout
4050512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak#
4150512d9c147b0e8a05d4d814af3ba83852a79304subrata_modakget_affinity_mask()
4250512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak{
4350512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak    AFFINITY=`taskset -p ${1}`
4450512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak    echo ${AFFINITY}
4550512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak    return
4650512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak}
4750512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak
4850512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak# set_affinity(PID, CPU)
4950512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak#
5050512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak#  Sets the affinity for the given PID to the specified CPU.
5150512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak#
5250512d9c147b0e8a05d4d814af3ba83852a79304subrata_modakset_affinity()
5350512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak{
5450512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak    PID="$1"
5550512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak    CPU="$2"
5650512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak    MASK=$((1<<${CPU_TO_TEST}))
5750512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak    `taskset -p ${MASK} ${PID} > /dev/null 2>&1`
5850512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak    return $?
5950512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak}
6050512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak
6150512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak# online_cpu(CPU)
6250512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak#
6350512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak#  Onlines the given CPU.  Returns a true value if it was able
6450512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak#  to perform the online operation successfully, false otherwise.
6550512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak#
6650512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak#  $CPU should either be a specific number like 4, or the cpu name,
6737550cf5a86c7ca7424a2a318dd64e550f13f5dfChris Dearman#  as in 'cpu4'.
6850512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak#
6950512d9c147b0e8a05d4d814af3ba83852a79304subrata_modakonline_cpu()
7050512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak{
7150512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak    CPU=${1#cpu}
7250512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak    if [ ! -w /sys/devices/system/cpu/cpu${CPU}/online ]; then
7350512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak        return 1
7450512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak    fi
754cb969a72e34e61e2584c5282577aa5d95b112dfStanislav Kholmanskikh
764cb969a72e34e61e2584c5282577aa5d95b112dfStanislav Kholmanskikh    cpu_is_online ${CPU} && return 0
774cb969a72e34e61e2584c5282577aa5d95b112dfStanislav Kholmanskikh
7850512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak    $TIME echo 1 > /sys/devices/system/cpu/cpu${CPU}/online
7950512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak    RC=$?
8050512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak    report_timing "Online cpu ${CPU}"
8150512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak    return $RC
8250512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak}
8350512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak
8450512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak
8550512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak# offline_cpu(CPU)
8650512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak#
8750512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak#  Offlines the given CPU.  Returns a true value if it was able
8850512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak#  to perform the offline operation successfully, false otherwise.
8950512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak#
9050512d9c147b0e8a05d4d814af3ba83852a79304subrata_modakoffline_cpu()
9150512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak{
9250512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak    CPU=${1#cpu}
9350512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak    if [ ! -w /sys/devices/system/cpu/cpu${CPU}/online ]; then
9450512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak        return 1
9550512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak    fi
964cb969a72e34e61e2584c5282577aa5d95b112dfStanislav Kholmanskikh
974cb969a72e34e61e2584c5282577aa5d95b112dfStanislav Kholmanskikh    ! cpu_is_online ${CPU} && return 0
984cb969a72e34e61e2584c5282577aa5d95b112dfStanislav Kholmanskikh
9950512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak    $TIME echo 0 > /sys/devices/system/cpu/cpu${CPU}/online
10050512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak    RC=$?
10150512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak    report_timing "Offline cpu ${CPU}"
10250512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak    return $RC
10350512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak}
10450512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak
10522f3ba1ede4cacd5df765f3e4b86ca90dd7ff75cXing Gu# get_cpus_num()
10622f3ba1ede4cacd5df765f3e4b86ca90dd7ff75cXing Gu#
10722f3ba1ede4cacd5df765f3e4b86ca90dd7ff75cXing Gu#  Prints the number of all available CPUs, regardless of whether they're
10822f3ba1ede4cacd5df765f3e4b86ca90dd7ff75cXing Gu#  currently online or offline.
10922f3ba1ede4cacd5df765f3e4b86ca90dd7ff75cXing Gu#
11022f3ba1ede4cacd5df765f3e4b86ca90dd7ff75cXing Guget_cpus_num()
11122f3ba1ede4cacd5df765f3e4b86ca90dd7ff75cXing Gu{
11222f3ba1ede4cacd5df765f3e4b86ca90dd7ff75cXing Gu	[ -d /sys/devices/system/cpu/cpu0 ] || return -1
11322f3ba1ede4cacd5df765f3e4b86ca90dd7ff75cXing Gu	NUM=`ls /sys/devices/system/cpu/ \
11422f3ba1ede4cacd5df765f3e4b86ca90dd7ff75cXing Gu			| grep -c "cpu[0-9][0-9]*"`
11522f3ba1ede4cacd5df765f3e4b86ca90dd7ff75cXing Gu	return $NUM
11622f3ba1ede4cacd5df765f3e4b86ca90dd7ff75cXing Gu}
11750512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak
11850512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak# get_all_cpus()
11950512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak#
12050512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak#  Prints a list of all available CPUs, regardless of whether they're
12150512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak#  currently online or offline.
12250512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak#
12350512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak#  This routine will work even if the CPUs are not hotpluggable, however
12450512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak#  it requires you have sysfs enabled in the kernel.
12550512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak#
12650512d9c147b0e8a05d4d814af3ba83852a79304subrata_modakget_all_cpus()
12750512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak{
1289d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh    [ -d /sys/devices/system/cpu ] || return 1
1299d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh    (cd /sys/devices/system/cpu; ls -d cpu[0-9]*)
13050512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak}
13150512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak
1329d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh# get_present_cpus()
1339d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh#
1349d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh#  Prints a list of present CPUs, regardless of whether they're
1359d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh#  currently online or offline.
1369d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh#
1379d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikhget_present_cpus()
1389d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh{
1399d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh    local present_mask="/sys/devices/system/cpu/present"
1409d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh    local present_cpus=""
1419d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh
1429d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh    # if sysfs present mask is missing, assume all cpu are present
1439d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh    if [ ! -e "$present_mask" ]; then
1449d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh        get_all_cpus
1459d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh        return
1469d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh    fi
1479d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh
1489d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh    for part in $(cat $present_mask | tr "," " "); do
1499d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh        if echo $part | grep -q "-"; then
1509d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh            range_low=$(echo $part | cut -d - -f 1)
1519d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh            range_high=$(echo $part | cut -d - -f 2)
1529d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh        else
153df19c394e2631f2f9179d3519a5af8aa05318419Han, NingX            range_low=$part
154df19c394e2631f2f9179d3519a5af8aa05318419Han, NingX            range_high=$part
1559d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh        fi
1569d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh        for cpu in $(seq $range_low $range_high); do
1579d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh            if [ -e /sys/devices/system/cpu/cpu$cpu ]; then
1589d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh                present_cpus="$present_cpus cpu$cpu"
1599d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh            fi
1609d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh        done
1619d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh    done
1629d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh    echo $present_cpus
1639d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh}
1649d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh
1659d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh# get_present_cpus_num()
1669d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh#
1679d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh#  Prints the number of present CPUs
1689d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh#
1699d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikhget_present_cpus_num()
1709d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh{
17126777407207f2a43d88c13437737d2ca3737650cGuangwen Feng    echo $(get_present_cpus | wc -w)
1729d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh}
1739d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh
1749d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh# get_hotplug_cpus()
1759d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh#
1769d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh#  Prints a list of present hotpluggable CPUs, regardless of whether they're
1779d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh#  currently online or offline.
1789d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh#
1799d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikhget_hotplug_cpus()
1809d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh{
1812f438250824cd0ae59185b5bda6d7bf15709dc7cJames Morse    local present_cpus="$(get_present_cpus)"
1829d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh    local hotplug_cpus=""
1839d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh
1849d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh    for cpu in $present_cpus; do
1859d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh        if [ -e /sys/devices/system/cpu/$cpu/online ]; then
1869d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh            hotplug_cpus="$hotplug_cpus $cpu"
1879d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh	fi
1889d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh    done
1899d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh    echo $hotplug_cpus
1909d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh}
1919d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh
1929d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh# get_hotplug_cpus_num()
1939d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh#
1949d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh#  Prints the number of hotpluggable CPUs
1959d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh#
1969d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikhget_hotplug_cpus_num()
1979d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh{
19826777407207f2a43d88c13437737d2ca3737650cGuangwen Feng    echo $(get_hotplug_cpus | wc -w)
1999d6b355c2b3603be1c1dc60a1981424d3f266f7aStanislav Kholmanskikh}
20050512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak
20150512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak# get_all_cpu_states()
20250512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak#
20350512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak#  Collects the current online/offline state of CPUs in the
20450512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak#  system, printing it in a format that can be passed to
20550512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak#  set_all_cpu_states() later.
20650512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak#
20750512d9c147b0e8a05d4d814af3ba83852a79304subrata_modakget_all_cpu_states()
20850512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak{
209e469ab15b2332629432b9347d6ad71dfef885e95Xing Gu    echo `cd /sys/devices/system/cpu/ && grep '' */online | \
210e469ab15b2332629432b9347d6ad71dfef885e95Xing Gu		sed -e 's/\/online//'`
21150512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak    return
21250512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak}
21350512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak
21450512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak# set_all_cpu_states(STATES)
21550512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak#
2164cb969a72e34e61e2584c5282577aa5d95b112dfStanislav Kholmanskikh#  Sets all of the CPU states according to STATES, which must be
21750512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak#  of the form "cpuX:Y", where X is the CPU number and Y its state.
21850512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak#  Each must be on a separate line.
21950512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak#
22050512d9c147b0e8a05d4d814af3ba83852a79304subrata_modakset_all_cpu_states()
22150512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak{
2224cb969a72e34e61e2584c5282577aa5d95b112dfStanislav Kholmanskikh    for cpu_state in $1; do
2234cb969a72e34e61e2584c5282577aa5d95b112dfStanislav Kholmanskikh        cpu=`echo $cpu_state | cut -d: -f 1`
2244cb969a72e34e61e2584c5282577aa5d95b112dfStanislav Kholmanskikh        state=`echo $cpu_state | cut -d: -f 2`
22550512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak        if [ $state = 1 ]; then
22650512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak            online_cpu $cpu
22750512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak        else
22850512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak            offline_cpu $cpu
22950512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak        fi
23050512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak    done
23150512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak}
23250512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak
23350512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak
23450512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak# get_online_cpus()
23550512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak#
23650512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak#  Prints a list of all CPUs currently online.  This function only
23750512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak#  works if the system's CPUs have hotplug capabilities
23850512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak#
23950512d9c147b0e8a05d4d814af3ba83852a79304subrata_modakget_online_cpus()
24050512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak{
24150512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak    echo `cd /sys/devices/system/cpu/ && grep 1 */online | cut -d '/' -f 1`
24250512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak    return
24350512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak}
24450512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak
24550512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak
24650512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak# get_offline_cpus()
24750512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak#
24850512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak#  Prints a list of all CPUs currently offline.  This function only
24950512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak#  works if the system's CPUs have hotplug capabilities
25050512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak#
25150512d9c147b0e8a05d4d814af3ba83852a79304subrata_modakget_offline_cpus()
25250512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak{
25350512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak    echo `cd /sys/devices/system/cpu/ && grep 0 */online | cut -d '/' -f 1`
25450512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak    return
25550512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak}
25650512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak
25750512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak# cpu_is_valid(CPU)
25850512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak#
25950512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak#  Checks to see if the given CPU number is available for hotplugging
26050512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak#  in the system.  Returns 0 if the CPU is available, 1 otherwise.
26150512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak#
26250512d9c147b0e8a05d4d814af3ba83852a79304subrata_modakcpu_is_valid()
26350512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak{
26450512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak    CPU=${1#cpu}
26550512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak    echo "CPU is $CPU"
26650512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak    cat /sys/devices/system/cpu/cpu${CPU}/online > /dev/null 2>&1
26750512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak    return $?
26850512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak}
26950512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak
27050512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak
27150512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak# cpu_is_online(CPU)
27250512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak#
273c1474e50551f1dabeeddbfd91f96e82d15bc5790Jin Li#  Returns a 0 value if the given CPU number is currently online,
274c1474e50551f1dabeeddbfd91f96e82d15bc5790Jin Li#  1 otherwise.  This function requires the system's CPUs have
27550512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak#  hotplug capabilities.
27650512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak#
27750512d9c147b0e8a05d4d814af3ba83852a79304subrata_modakcpu_is_online()
27850512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak{
27950512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak    CPU=${1#cpu}
28050512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak    if [ `cat /sys/devices/system/cpu/cpu${CPU}/online` = "1" ]; then
28150512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak        return 0
28237550cf5a86c7ca7424a2a318dd64e550f13f5dfChris Dearman    else
28350512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak        return 1
28450512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak    fi
28550512d9c147b0e8a05d4d814af3ba83852a79304subrata_modak}
286