linux/tools/testing/selftests/memory-hotplug/on-off-test.sh
<<
>>
Prefs
   1#!/bin/bash
   2
   3SYSFS=
   4
   5prerequisite()
   6{
   7        msg="skip all tests:"
   8
   9        if [ $UID != 0 ]; then
  10                echo $msg must be run as root >&2
  11                exit 0
  12        fi
  13
  14        SYSFS=`mount -t sysfs | head -1 | awk '{ print $3 }'`
  15
  16        if [ ! -d "$SYSFS" ]; then
  17                echo $msg sysfs is not mounted >&2
  18                exit 0
  19        fi
  20
  21        if ! ls $SYSFS/devices/system/memory/memory* > /dev/null 2>&1; then
  22                echo $msg memory hotplug is not supported >&2
  23                exit 0
  24        fi
  25}
  26
  27#
  28# list all hot-pluggable memory
  29#
  30hotpluggable_memory()
  31{
  32        local state=${1:-.\*}
  33
  34        for memory in $SYSFS/devices/system/memory/memory*; do
  35                if grep -q 1 $memory/removable &&
  36                   grep -q $state $memory/state; then
  37                        echo ${memory##/*/memory}
  38                fi
  39        done
  40}
  41
  42hotplaggable_offline_memory()
  43{
  44        hotpluggable_memory offline
  45}
  46
  47hotpluggable_online_memory()
  48{
  49        hotpluggable_memory online
  50}
  51
  52memory_is_online()
  53{
  54        grep -q online $SYSFS/devices/system/memory/memory$1/state
  55}
  56
  57memory_is_offline()
  58{
  59        grep -q offline $SYSFS/devices/system/memory/memory$1/state
  60}
  61
  62online_memory()
  63{
  64        echo online > $SYSFS/devices/system/memory/memory$1/state
  65}
  66
  67offline_memory()
  68{
  69        echo offline > $SYSFS/devices/system/memory/memory$1/state
  70}
  71
  72online_memory_expect_success()
  73{
  74        local memory=$1
  75
  76        if ! online_memory $memory; then
  77                echo $FUNCNAME $memory: unexpected fail >&2
  78        elif ! memory_is_online $memory; then
  79                echo $FUNCNAME $memory: unexpected offline >&2
  80        fi
  81}
  82
  83online_memory_expect_fail()
  84{
  85        local memory=$1
  86
  87        if online_memory $memory 2> /dev/null; then
  88                echo $FUNCNAME $memory: unexpected success >&2
  89        elif ! memory_is_offline $memory; then
  90                echo $FUNCNAME $memory: unexpected online >&2
  91        fi
  92}
  93
  94offline_memory_expect_success()
  95{
  96        local memory=$1
  97
  98        if ! offline_memory $memory; then
  99                echo $FUNCNAME $memory: unexpected fail >&2
 100        elif ! memory_is_offline $memory; then
 101                echo $FUNCNAME $memory: unexpected offline >&2
 102        fi
 103}
 104
 105offline_memory_expect_fail()
 106{
 107        local memory=$1
 108
 109        if offline_memory $memory 2> /dev/null; then
 110                echo $FUNCNAME $memory: unexpected success >&2
 111        elif ! memory_is_online $memory; then
 112                echo $FUNCNAME $memory: unexpected offline >&2
 113        fi
 114}
 115
 116error=-12
 117priority=0
 118ratio=10
 119
 120while getopts e:hp:r: opt; do
 121        case $opt in
 122        e)
 123                error=$OPTARG
 124                ;;
 125        h)
 126                echo "Usage $0 [ -e errno ] [ -p notifier-priority ] [ -r percent-of-memory-to-offline ]"
 127                exit
 128                ;;
 129        p)
 130                priority=$OPTARG
 131                ;;
 132        r)
 133                ratio=$OPTARG
 134                ;;
 135        esac
 136done
 137
 138if ! [ "$error" -ge -4095 -a "$error" -lt 0 ]; then
 139        echo "error code must be -4095 <= errno < 0" >&2
 140        exit 1
 141fi
 142
 143prerequisite
 144
 145#
 146# Online all hot-pluggable memory
 147#
 148for memory in `hotplaggable_offline_memory`; do
 149        online_memory_expect_success $memory
 150done
 151
 152#
 153# Offline $ratio percent of hot-pluggable memory
 154#
 155for memory in `hotpluggable_online_memory`; do
 156        if [ $((RANDOM % 100)) -lt $ratio ]; then
 157                offline_memory_expect_success $memory
 158        fi
 159done
 160
 161#
 162# Online all hot-pluggable memory again
 163#
 164for memory in `hotplaggable_offline_memory`; do
 165        online_memory_expect_success $memory
 166done
 167
 168#
 169# Test with memory notifier error injection
 170#
 171
 172DEBUGFS=`mount -t debugfs | head -1 | awk '{ print $3 }'`
 173NOTIFIER_ERR_INJECT_DIR=$DEBUGFS/notifier-error-inject/memory
 174
 175prerequisite_extra()
 176{
 177        msg="skip extra tests:"
 178
 179        /sbin/modprobe -q -r memory-notifier-error-inject
 180        /sbin/modprobe -q memory-notifier-error-inject priority=$priority
 181
 182        if [ ! -d "$DEBUGFS" ]; then
 183                echo $msg debugfs is not mounted >&2
 184                exit 0
 185        fi
 186
 187        if [ ! -d $NOTIFIER_ERR_INJECT_DIR ]; then
 188                echo $msg memory-notifier-error-inject module is not available >&2
 189                exit 0
 190        fi
 191}
 192
 193prerequisite_extra
 194
 195#
 196# Offline $ratio percent of hot-pluggable memory
 197#
 198echo 0 > $NOTIFIER_ERR_INJECT_DIR/actions/MEM_GOING_OFFLINE/error
 199for memory in `hotpluggable_online_memory`; do
 200        if [ $((RANDOM % 100)) -lt $ratio ]; then
 201                offline_memory_expect_success $memory
 202        fi
 203done
 204
 205#
 206# Test memory hot-add error handling (offline => online)
 207#
 208echo $error > $NOTIFIER_ERR_INJECT_DIR/actions/MEM_GOING_ONLINE/error
 209for memory in `hotplaggable_offline_memory`; do
 210        online_memory_expect_fail $memory
 211done
 212
 213#
 214# Online all hot-pluggable memory
 215#
 216echo 0 > $NOTIFIER_ERR_INJECT_DIR/actions/MEM_GOING_ONLINE/error
 217for memory in `hotplaggable_offline_memory`; do
 218        online_memory_expect_success $memory
 219done
 220
 221#
 222# Test memory hot-remove error handling (online => offline)
 223#
 224echo $error > $NOTIFIER_ERR_INJECT_DIR/actions/MEM_GOING_OFFLINE/error
 225for memory in `hotpluggable_online_memory`; do
 226        offline_memory_expect_fail $memory
 227done
 228
 229echo 0 > $NOTIFIER_ERR_INJECT_DIR/actions/MEM_GOING_OFFLINE/error
 230/sbin/modprobe -q -r memory-notifier-error-inject
 231