]>
Commit | Line | Data |
---|---|---|
d89dffa9 AM |
1 | #!/bin/bash |
2 | ||
3 | SYSFS= | |
4 | ||
5 | prerequisite() | |
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 | |
fae61a87 PHL |
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 | |
d89dffa9 AM |
30 | } |
31 | ||
32 | # | |
33 | # list all hot-pluggable memory | |
34 | # | |
35 | hotpluggable_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 | ||
a54726dd | 47 | hotpluggable_offline_memory() |
d89dffa9 AM |
48 | { |
49 | hotpluggable_memory offline | |
50 | } | |
51 | ||
52 | hotpluggable_online_memory() | |
53 | { | |
54 | hotpluggable_memory online | |
55 | } | |
56 | ||
57 | memory_is_online() | |
58 | { | |
59 | grep -q online $SYSFS/devices/system/memory/memory$1/state | |
60 | } | |
61 | ||
62 | memory_is_offline() | |
63 | { | |
64 | grep -q offline $SYSFS/devices/system/memory/memory$1/state | |
65 | } | |
66 | ||
67 | online_memory() | |
68 | { | |
69 | echo online > $SYSFS/devices/system/memory/memory$1/state | |
70 | } | |
71 | ||
72 | offline_memory() | |
73 | { | |
74 | echo offline > $SYSFS/devices/system/memory/memory$1/state | |
75 | } | |
76 | ||
77 | online_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 | ||
88 | online_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 | ||
99 | offline_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 | ||
110 | offline_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 | ||
121 | error=-12 | |
122 | priority=0 | |
123 | ratio=10 | |
124 | ||
125 | while 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 | |
3b476858 PHL |
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 | |
d89dffa9 AM |
143 | ;; |
144 | esac | |
145 | done | |
146 | ||
147 | if ! [ "$error" -ge -4095 -a "$error" -lt 0 ]; then | |
148 | echo "error code must be -4095 <= errno < 0" >&2 | |
149 | exit 1 | |
150 | fi | |
151 | ||
152 | prerequisite | |
153 | ||
ddddda9b SK |
154 | echo "Test scope: $ratio% hotplug memory" |
155 | echo -e "\t online all hotplug memory in offline state" | |
156 | echo -e "\t offline $ratio% hotplug memory in online state" | |
157 | echo -e "\t online all hotplug memory in offline state" | |
158 | ||
d89dffa9 AM |
159 | # |
160 | # Online all hot-pluggable memory | |
161 | # | |
a54726dd | 162 | for memory in `hotpluggable_offline_memory`; do |
ddddda9b | 163 | echo offline-online $memory |
d89dffa9 AM |
164 | online_memory_expect_success $memory |
165 | done | |
166 | ||
167 | # | |
168 | # Offline $ratio percent of hot-pluggable memory | |
169 | # | |
170 | for memory in `hotpluggable_online_memory`; do | |
171 | if [ $((RANDOM % 100)) -lt $ratio ]; then | |
ddddda9b | 172 | echo online-offline $memory |
d89dffa9 AM |
173 | offline_memory_expect_success $memory |
174 | fi | |
175 | done | |
176 | ||
177 | # | |
178 | # Online all hot-pluggable memory again | |
179 | # | |
a54726dd | 180 | for memory in `hotpluggable_offline_memory`; do |
ddddda9b | 181 | echo offline-online $memory |
d89dffa9 AM |
182 | online_memory_expect_success $memory |
183 | done | |
184 | ||
185 | # | |
186 | # Test with memory notifier error injection | |
187 | # | |
188 | ||
189 | DEBUGFS=`mount -t debugfs | head -1 | awk '{ print $3 }'` | |
190 | NOTIFIER_ERR_INJECT_DIR=$DEBUGFS/notifier-error-inject/memory | |
191 | ||
192 | prerequisite_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 | ||
210 | prerequisite_extra | |
211 | ||
212 | # | |
213 | # Offline $ratio percent of hot-pluggable memory | |
214 | # | |
215 | echo 0 > $NOTIFIER_ERR_INJECT_DIR/actions/MEM_GOING_OFFLINE/error | |
216 | for memory in `hotpluggable_online_memory`; do | |
217 | if [ $((RANDOM % 100)) -lt $ratio ]; then | |
218 | offline_memory_expect_success $memory | |
219 | fi | |
220 | done | |
221 | ||
222 | # | |
223 | # Test memory hot-add error handling (offline => online) | |
224 | # | |
225 | echo $error > $NOTIFIER_ERR_INJECT_DIR/actions/MEM_GOING_ONLINE/error | |
a54726dd | 226 | for memory in `hotpluggable_offline_memory`; do |
d89dffa9 AM |
227 | online_memory_expect_fail $memory |
228 | done | |
229 | ||
230 | # | |
231 | # Online all hot-pluggable memory | |
232 | # | |
233 | echo 0 > $NOTIFIER_ERR_INJECT_DIR/actions/MEM_GOING_ONLINE/error | |
a54726dd | 234 | for memory in `hotpluggable_offline_memory`; do |
d89dffa9 AM |
235 | online_memory_expect_success $memory |
236 | done | |
237 | ||
238 | # | |
239 | # Test memory hot-remove error handling (online => offline) | |
240 | # | |
241 | echo $error > $NOTIFIER_ERR_INJECT_DIR/actions/MEM_GOING_OFFLINE/error | |
242 | for memory in `hotpluggable_online_memory`; do | |
243 | offline_memory_expect_fail $memory | |
244 | done | |
245 | ||
246 | echo 0 > $NOTIFIER_ERR_INJECT_DIR/actions/MEM_GOING_OFFLINE/error | |
247 | /sbin/modprobe -q -r memory-notifier-error-inject |