on-off-test.sh 4.4 KB

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