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