| #!/bin/bash |
| # |
| # Testcase: Reload the drm module |
| # |
| # ... we've broken this way too often :( |
| # |
| |
| SOURCE_DIR="$( dirname "${BASH_SOURCE[0]}" )" |
| . $SOURCE_DIR/drm_lib.sh |
| |
| # no other drm service should be running, so we can just unbind |
| |
| function reload() { |
| local snd_hda_intel_unloaded |
| |
| echo Reloading i915.ko with $* |
| |
| # we must kick away fbcon (but only fbcon) |
| for vtcon in /sys/class/vtconsole/vtcon*/ ; do |
| if grep "frame buffer device" $vtcon/name > /dev/null ; then |
| echo unbinding $vtcon: `cat $vtcon/name` |
| echo 0 > $vtcon/bind |
| fi |
| done |
| |
| # The sound driver uses our power well |
| pkill alsactl |
| snd_hda_intel_unloaded=0 |
| rmmod snd_hda_intel &> /dev/null && snd_hda_intel_unloaded=1 |
| |
| #ignore errors in ips - gen5 only |
| rmmod intel_ips &> /dev/null |
| rmmod i915 || return $IGT_EXIT_SKIP |
| #ignore errors in intel-gtt, often built-in |
| rmmod intel-gtt &> /dev/null |
| # drm may be used by other devices (nouveau, radeon, udl, etc) |
| rmmod drm_kms_helper &> /dev/null |
| rmmod drm &> /dev/null |
| |
| if lsmod | grep i915 &> /dev/null ; then |
| echo WARNING: i915.ko still loaded! |
| return $IGT_EXIT_FAILURE |
| else |
| echo module successfully unloaded |
| fi |
| |
| modprobe i915 $* |
| |
| if [ -f /sys/class/vtconsole/vtcon1/bind ]; then |
| echo 1 > /sys/class/vtconsole/vtcon1/bind |
| fi |
| |
| modprobe -q snd_hda_intel || return $snd_hda_intel_unloaded |
| } |
| |
| function finish_load() { |
| # does the device exist? |
| if $SOURCE_DIR/gem_alive > /dev/null ; then |
| echo "module successfully loaded again" |
| else |
| echo "failed to reload module successfully" |
| return $IGT_EXIT_FAILURE |
| fi |
| |
| # then try to run something |
| if ! $SOURCE_DIR/gem_exec_store > /dev/null ; then |
| echo "failed to execute a simple batch after reload" |
| return $IGT_EXIT_FAILURE |
| fi |
| |
| return $IGT_EXIT_SUCCESS |
| } |
| |
| reload || exit $? |
| finish_load || exit $? |
| |
| # Repeat the module reload trying to to generate faults |
| for i in $(seq 1 4); do |
| reload inject_load_failure=$i |
| done |
| |
| reload || exit $? |
| finish_load |
| |
| exit $? |