Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 18584870 authored by Akinobu Mita's avatar Akinobu Mita Committed by Linus Torvalds
Browse files

fault-injection: fix example scripts in documentation



Fix and cleanup example scripts in fault injection documentation.

1. Eliminate broken oops() shell function.

2. Fold failcmd.sh and failmodule.sh into example scripts. It makes
   the example scripts work independent of current working directory.

3. Set "space" parameter to 0 to start injecting errors immediately.

4. Use /sys/module/<modulename>/sections/.data as upper bound of
   .text section. Because some module doesn't have .exit.text section.

Signed-off-by: default avatarAkinobu Mita <akinobu.mita@gmail.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 54114994
Loading
Loading
Loading
Loading
+0 −4
Original line number Diff line number Diff line
#!/bin/bash

echo 1 > /proc/self/make-it-fail
exec $*
+0 −31
Original line number Diff line number Diff line
#!/bin/bash
#
# Usage: failmodule <failname> <modulename> [stacktrace-depth]
#
#	<failname>: "failslab", "fail_alloc_page", or "fail_make_request"
#
#	<modulename>: module name that you want to inject faults.
#
#	[stacktrace-depth]: the maximum number of stacktrace walking allowed
#

STACKTRACE_DEPTH=5
if [ $# -gt 2 ]; then
	STACKTRACE_DEPTH=$3
fi

if [ ! -d /debug/$1 ]; then
	echo "Fault-injection $1 does not exist" >&2
	exit 1
fi
if [ ! -d /sys/module/$2 ]; then
	echo "Module $2 does not exist" >&2
	exit 1
fi

# Disable any fault injection
echo 0 > /debug/$1/stacktrace-depth

echo `cat /sys/module/$2/sections/.text` > /debug/$1/require-start
echo `cat /sys/module/$2/sections/.exit.text` > /debug/$1/require-end
echo $STACKTRACE_DEPTH > /debug/$1/stacktrace-depth
+56 −49
Original line number Diff line number Diff line
@@ -161,70 +161,77 @@ o add a hook to insert failures
Application Examples
--------------------

o inject slab allocation failures into module init/cleanup code
o Inject slab allocation failures into module init/exit code

------------------------------------------------------------------------------
#!/bin/bash

FAILCMD=Documentation/fault-injection/failcmd.sh
BLACKLIST="root_plug evbug"

FAILNAME=failslab
echo Y > /debug/$FAILNAME/task-filter
echo 10 > /debug/$FAILNAME/probability
echo 100 > /debug/$FAILNAME/interval
echo -1 > /debug/$FAILNAME/times
echo 2 > /debug/$FAILNAME/verbose
echo 1 > /debug/$FAILNAME/ignore-gfp-wait

blacklist()
{
	echo $BLACKLIST | grep $1 > /dev/null 2>&1
}
FAILTYPE=failslab
echo Y > /debug/$FAILTYPE/task-filter
echo 10 > /debug/$FAILTYPE/probability
echo 100 > /debug/$FAILTYPE/interval
echo -1 > /debug/$FAILTYPE/times
echo 0 > /debug/$FAILTYPE/space
echo 2 > /debug/$FAILTYPE/verbose
echo 1 > /debug/$FAILTYPE/ignore-gfp-wait

oops()
faulty_system()
{
	dmesg | grep BUG > /dev/null 2>&1
	bash -c "echo 1 > /proc/self/make-it-fail && exec $*"
}

find /lib/modules/`uname -r` -name '*.ko' -exec basename {} .ko \; |
	while read i
	do
		oops && exit 1

		if ! blacklist $i
if [ $# -eq 0 ]
then
			echo inserting $i...
			bash $FAILCMD modprobe $i
	echo "Usage: $0 modulename [ modulename ... ]"
	exit 1
fi
	done

lsmod | awk '{ if ($3 == 0) { print $1 } }' |
	while read i
for m in $*
do
		oops && exit 1
	echo inserting $m...
	faulty_system modprobe $m

		if ! blacklist $i
		then
			echo removing $i...
			bash $FAILCMD modprobe -r $i
		fi
	echo removing $m...
	faulty_system modprobe -r $m
done

------------------------------------------------------------------------------

o inject slab allocation failures only for a specific module
o Inject page allocation failures only for a specific module

------------------------------------------------------------------------------
#!/bin/bash

FAILMOD=Documentation/fault-injection/failmodule.sh
FAILTYPE=fail_page_alloc
module=$1

echo injecting errors into the module $1...
if [ -z $module ]
then
	echo "Usage: $0 <modulename>"
	exit 1
fi

modprobe $1
bash $FAILMOD failslab $1 10
echo 25 > /debug/failslab/probability
modprobe $module

------------------------------------------------------------------------------
if [ ! -d /sys/module/$module/sections ]
then
	echo Module $module is not loaded
	exit 1
fi

cat /sys/module/$module/sections/.text > /debug/$FAILTYPE/require-start
cat /sys/module/$module/sections/.data > /debug/$FAILTYPE/require-end

echo N > /debug/$FAILTYPE/task-filter
echo 10 > /debug/$FAILTYPE/probability
echo 100 > /debug/$FAILTYPE/interval
echo -1 > /debug/$FAILTYPE/times
echo 0 > /debug/$FAILTYPE/space
echo 2 > /debug/$FAILTYPE/verbose
echo 1 > /debug/$FAILTYPE/ignore-gfp-wait
echo 1 > /debug/$FAILTYPE/ignore-gfp-highmem
echo 10 > /debug/$FAILTYPE/stacktrace-depth

trap "echo 0 > /debug/$FAILTYPE/probability" SIGINT SIGTERM EXIT

echo "Injecting errors into the module $module... (interrupt to stop)"
sleep 1000000