xref: /freebsd/share/man/man9/fail.9 (revision 70e20d4e1a6b23cb7bd8b869d1ff782c590f0fa8)
1cfeb7489SZachary Loafman.\"
2cfeb7489SZachary Loafman.\" Copyright (c) 2009 Isilon Inc http://www.isilon.com/
3cfeb7489SZachary Loafman.\"
4cfeb7489SZachary Loafman.\" Redistribution and use in source and binary forms, with or without
5cfeb7489SZachary Loafman.\" modification, are permitted provided that the following conditions
6cfeb7489SZachary Loafman.\" are met:
7cfeb7489SZachary Loafman.\" 1. Redistributions of source code must retain the above copyright
8cfeb7489SZachary Loafman.\"    notice(s), this list of conditions and the following disclaimer as
9cfeb7489SZachary Loafman.\"    the first lines of this file unmodified other than the possible
10cfeb7489SZachary Loafman.\"    addition of one or more copyright notices.
11cfeb7489SZachary Loafman.\" 2. Redistributions in binary form must reproduce the above copyright
12cfeb7489SZachary Loafman.\"    notice(s), this list of conditions and the following disclaimer in the
13cfeb7489SZachary Loafman.\"    documentation and/or other materials provided with the distribution.
14cfeb7489SZachary Loafman.\"
15cfeb7489SZachary Loafman.\" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY
16cfeb7489SZachary Loafman.\" EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17cfeb7489SZachary Loafman.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18cfeb7489SZachary Loafman.\" DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY
19cfeb7489SZachary Loafman.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20cfeb7489SZachary Loafman.\" (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
21cfeb7489SZachary Loafman.\" SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
22cfeb7489SZachary Loafman.\" CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23cfeb7489SZachary Loafman.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24cfeb7489SZachary Loafman.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
25cfeb7489SZachary Loafman.\" DAMAGE.
26cfeb7489SZachary Loafman.\"
27cfeb7489SZachary Loafman.\" $FreeBSD$
28cfeb7489SZachary Loafman.\"
29*70e20d4eSConrad Meyer.Dd February 02, 2016
30cfeb7489SZachary Loafman.Dt FAIL 9
31cfeb7489SZachary Loafman.Os
32cfeb7489SZachary Loafman.Sh NAME
33cfeb7489SZachary Loafman.Nm KFAIL_POINT_CODE ,
34*70e20d4eSConrad Meyer.Nm KFAIL_POINT_CODE_FLAGS ,
35*70e20d4eSConrad Meyer.Nm KFAIL_POINT_CODE_COND ,
36cfeb7489SZachary Loafman.Nm KFAIL_POINT_RETURN ,
37cfeb7489SZachary Loafman.Nm KFAIL_POINT_RETURN_VOID ,
38cfeb7489SZachary Loafman.Nm KFAIL_POINT_ERROR ,
39cfeb7489SZachary Loafman.Nm KFAIL_POINT_GOTO ,
40*70e20d4eSConrad Meyer.Nm KFAIL_POINT_SLEEP_CALLBACKS ,
41cfeb7489SZachary Loafman.Nm fail_point ,
42cfeb7489SZachary Loafman.Nm DEBUG_FP
43cfeb7489SZachary Loafman.Nd fail points
44cfeb7489SZachary Loafman.Sh SYNOPSIS
45cfeb7489SZachary Loafman.In sys/fail.h
46cfeb7489SZachary Loafman.Fn KFAIL_POINT_CODE "parent" "name" "code"
47*70e20d4eSConrad Meyer.Fn KFAIL_POINT_CODE_FLAGS "parent" "name" "flags" "code"
48*70e20d4eSConrad Meyer.Fn KFAIL_POINT_CODE_COND "parent" "name" "cond" "flags" "code"
49cfeb7489SZachary Loafman.Fn KFAIL_POINT_RETURN "parent" "name"
50cfeb7489SZachary Loafman.Fn KFAIL_POINT_RETURN_VOID "parent" "name"
51cfeb7489SZachary Loafman.Fn KFAIL_POINT_ERROR "parent" "name" "error_var"
52cfeb7489SZachary Loafman.Fn KFAIL_POINT_GOTO "parent" "name" "error_var" "label"
53*70e20d4eSConrad Meyer.Fn KFAIL_POINT_SLEEP_CALLBACKS "parent" "name" "pre_func" "pre_arg" "post_func" "post_arg" "code"
54cfeb7489SZachary Loafman.Sh DESCRIPTION
55cfeb7489SZachary LoafmanFail points are used to add code points where errors may be injected
56eae608efSZachary Loafmanin a user controlled fashion.
57eae608efSZachary LoafmanFail points provide a convenient wrapper around user-provided error
58eae608efSZachary Loafmaninjection code, providing a
59eae608efSZachary Loafman.Xr sysctl 9
60eae608efSZachary LoafmanMIB, and a parser for that MIB that describes how the error
61cfeb7489SZachary Loafmaninjection code should fire.
62cfeb7489SZachary Loafman.Pp
63cfeb7489SZachary LoafmanThe base fail point macro is
64cfeb7489SZachary Loafman.Fn KFAIL_POINT_CODE
65cfeb7489SZachary Loafmanwhere
66cfeb7489SZachary Loafman.Fa parent
67cfeb7489SZachary Loafmanis a sysctl tree (frequently
68cfeb7489SZachary Loafman.Sy DEBUG_FP
69cfeb7489SZachary Loafmanfor kernel fail points, but various subsystems may wish to provide
70cfeb7489SZachary Loafmantheir own fail point trees), and
71cfeb7489SZachary Loafman.Fa name
72cfeb7489SZachary Loafmanis the name of the MIB in that tree, and
73cfeb7489SZachary Loafman.Fa code
74eae608efSZachary Loafmanis the error injection code.
75eae608efSZachary LoafmanThe
76cfeb7489SZachary Loafman.Fa code
77cfeb7489SZachary Loafmanargument does not require braces, but it is considered good style to
78eae608efSZachary Loafmanuse braces for any multi-line code arguments.
79eae608efSZachary LoafmanInside the
80cfeb7489SZachary Loafman.Fa code
81cfeb7489SZachary Loafmanargument, the evaluation of
82cfeb7489SZachary Loafman.Sy RETURN_VALUE
83cfeb7489SZachary Loafmanis derived from the
84cfeb7489SZachary Loafman.Fn return
85eae608efSZachary Loafmanvalue set in the sysctl MIB.
86*70e20d4eSConrad Meyer.Pp
87*70e20d4eSConrad MeyerAdditionally,
88*70e20d4eSConrad Meyer.Fn KFAIL_POINT_CODE_FLAGS
89*70e20d4eSConrad Meyerprovides a
90*70e20d4eSConrad Meyer.Fa flags
91*70e20d4eSConrad Meyerargument which controls the fail point's behaviour.
92*70e20d4eSConrad MeyerThis can be used to e.g., mark the fail point's context as non-sleepable,
93*70e20d4eSConrad Meyerwhich causes the
94*70e20d4eSConrad Meyer.Sy sleep
95*70e20d4eSConrad Meyeraction to be coerced to a busy wait.
96*70e20d4eSConrad MeyerThe supported flags are:
97*70e20d4eSConrad Meyer.Bl -ohang -offset indent
98*70e20d4eSConrad Meyer.It FAIL_POINT_USE_TIMEOUT_PATH
99*70e20d4eSConrad MeyerRather than sleeping on a
100*70e20d4eSConrad Meyer.Fn sleep
101*70e20d4eSConrad Meyercall, just fire the post-sleep function after a timeout fires.
102*70e20d4eSConrad Meyer.It FAIL_POINT_NONSLEEPABLE
103*70e20d4eSConrad MeyerMark the fail point as being in a non-sleepable context, which coerces
104*70e20d4eSConrad Meyer.Fn sleep
105*70e20d4eSConrad Meyercalls to
106*70e20d4eSConrad Meyer.Fn delay
107*70e20d4eSConrad Meyercalls.
108*70e20d4eSConrad Meyer.El
109*70e20d4eSConrad Meyer.Pp
110*70e20d4eSConrad MeyerLikewise,
111*70e20d4eSConrad Meyer.Fn KFAIL_POINT_CODE_COND
112*70e20d4eSConrad Meyersupplies a
113*70e20d4eSConrad Meyer.Fa cond
114*70e20d4eSConrad Meyerargument, which allows you to set the condition under which the fail point's
115*70e20d4eSConrad Meyercode may fire.
116*70e20d4eSConrad MeyerThis is equivalent to:
117*70e20d4eSConrad Meyer.Bd -literal
118*70e20d4eSConrad Meyer	if (cond)
119*70e20d4eSConrad Meyer		KFAIL_POINT_CODE_FLAGS(...);
120*70e20d4eSConrad Meyer
121*70e20d4eSConrad Meyer.Ed
122eae608efSZachary LoafmanSee
123aa8775c6SChristian Brueffer.Sx SYSCTL VARIABLES
124cfeb7489SZachary Loafmanbelow.
125cfeb7489SZachary Loafman.Pp
126cfeb7489SZachary LoafmanThe remaining
127cfeb7489SZachary Loafman.Fn KFAIL_POINT_*
128cfeb7489SZachary Loafmanmacros are wrappers around common error injection paths:
12963d46d1dSUlrich Spörlein.Bl -inset
130cfeb7489SZachary Loafman.It Fn KFAIL_POINT_RETURN parent name
131cfeb7489SZachary Loafmanis the equivalent of
132cfeb7489SZachary Loafman.Sy KFAIL_POINT_CODE(..., return RETURN_VALUE)
133cfeb7489SZachary Loafman.It Fn KFAIL_POINT_RETURN_VOID parent name
134cfeb7489SZachary Loafmanis the equivalent of
135cfeb7489SZachary Loafman.Sy KFAIL_POINT_CODE(..., return)
136cfeb7489SZachary Loafman.It Fn KFAIL_POINT_ERROR parent name error_var
137cfeb7489SZachary Loafmanis the equivalent of
138cfeb7489SZachary Loafman.Sy KFAIL_POINT_CODE(..., error_var = RETURN_VALUE)
139cfeb7489SZachary Loafman.It Fn KFAIL_POINT_GOTO parent name error_var label
140cfeb7489SZachary Loafmanis the equivalent of
14163d46d1dSUlrich Spörlein.Sy KFAIL_POINT_CODE(..., { error_var = RETURN_VALUE; goto label;})
142cfeb7489SZachary Loafman.El
143cfeb7489SZachary Loafman.Sh SYSCTL VARIABLES
144cfeb7489SZachary LoafmanThe
145cfeb7489SZachary Loafman.Fn KFAIL_POINT_*
146eae608efSZachary Loafmanmacros add sysctl MIBs where specified.
147eae608efSZachary LoafmanMany base kernel MIBs can be found in the
148cfeb7489SZachary Loafman.Sy debug.fail_point
149cfeb7489SZachary Loafmantree (referenced in code by
150aa8775c6SChristian Brueffer.Sy DEBUG_FP ) .
151cfeb7489SZachary Loafman.Pp
152*70e20d4eSConrad MeyerThe sysctl variable may be set in a number of ways:
153aa8775c6SChristian Brueffer.Bd -literal
154*70e20d4eSConrad Meyer  [<pct>%][<cnt>*]<type>[(args...)][-><more terms>]
155aa8775c6SChristian Brueffer.Ed
156cfeb7489SZachary Loafman.Pp
157*70e20d4eSConrad MeyerThe <type> argument specifies which action to take; it can be one of:
158cfeb7489SZachary Loafman.Bl -tag -width ".Dv return"
159cfeb7489SZachary Loafman.It Sy off
160cfeb7489SZachary LoafmanTake no action (does not trigger fail point code)
161cfeb7489SZachary Loafman.It Sy return
162cfeb7489SZachary LoafmanTrigger fail point code with specified argument
163cfeb7489SZachary Loafman.It Sy sleep
164cfeb7489SZachary LoafmanSleep the specified number of milliseconds
165cfeb7489SZachary Loafman.It Sy panic
166cfeb7489SZachary LoafmanPanic
167cfeb7489SZachary Loafman.It Sy break
168eae608efSZachary LoafmanBreak into the debugger, or trap if there is no debugger support
169cfeb7489SZachary Loafman.It Sy print
170cfeb7489SZachary LoafmanPrint that the fail point executed
171*70e20d4eSConrad Meyer.It Sy pause
172*70e20d4eSConrad MeyerThreads sleep at the fail point until the fail point is set to
173*70e20d4eSConrad Meyer.Sy off
174*70e20d4eSConrad Meyer.It Sy yield
175*70e20d4eSConrad MeyerThread yields the cpu when the fail point is evaluated
176*70e20d4eSConrad Meyer.It Sy delay
177*70e20d4eSConrad MeyerSimilar to sleep, but busy waits the cpu.
178*70e20d4eSConrad Meyer(Useful in non-sleepable contexts.)
179cfeb7489SZachary Loafman.El
180cfeb7489SZachary Loafman.Pp
181*70e20d4eSConrad MeyerThe <pct>% and <cnt>* modifiers prior to <type> control when
182eae608efSZachary Loafman<type> is executed.
183*70e20d4eSConrad MeyerThe <pct>% form (e.g. "1.2%") can be used to specify a
184eae608efSZachary Loafmanprobability that <type> will execute.
185*70e20d4eSConrad MeyerThis is a decimal in the range (0, 100] which can specify up to
186*70e20d4eSConrad Meyer1/10,000% precision.
187*70e20d4eSConrad MeyerThe <cnt>* form (e.g. "5*") can be used to specify the number of
188eae608efSZachary Loafmantimes <type> should be executed before this <term> is disabled.
189eae608efSZachary LoafmanOnly the last probability and the last count are used if multiple
190eae608efSZachary Loafmanare specified, i.e. "1.2%2%" is the same as "2%".
191eae608efSZachary LoafmanWhen both a probability and a count are specified, the probability
192eae608efSZachary Loafmanis evaluated before the count, i.e. "2%5*" means "2% of the time,
193eae608efSZachary Loafmanbut only 5 times total".
194cfeb7489SZachary Loafman.Pp
195eae608efSZachary LoafmanThe operator -> can be used to express cascading terms.
196aa8775c6SChristian BruefferIf you specify <term1>-><term2>, it means that if <term1> does not
197aa8775c6SChristian Brueffer.Ql execute ,
198aa8775c6SChristian Brueffer<term2> is evaluated.
199eae608efSZachary LoafmanFor the purpose of this operator, the return() and print() operators
200eae608efSZachary Loafmanare the only types that cascade.
201eae608efSZachary LoafmanA return() term only cascades if the code executes, and a print()
202eae608efSZachary Loafmanterm only cascades when passed a non-zero argument.
203b5bd50aeSMatthew D FlemingA pid can optionally be specified.
204b5bd50aeSMatthew D FlemingThe fail point term is only executed when invoked by a process with a
205b5bd50aeSMatthew D Flemingmatching p_pid.
206cfeb7489SZachary Loafman.Sh EXAMPLES
207ecb0bac9SGlen Barber.Bl -tag -width Sy
208cfeb7489SZachary Loafman.It Sy sysctl debug.fail_point.foobar="2.1%return(5)"
209cfeb7489SZachary Loafman21/1000ths of the time, execute
210cfeb7489SZachary Loafman.Fa code
211cfeb7489SZachary Loafmanwith RETURN_VALUE set to 5.
212cfeb7489SZachary Loafman.It Sy sysctl debug.fail_point.foobar="2%return(5)->5%return(22)"
213eae608efSZachary Loafman2/100ths of the time, execute
214cfeb7489SZachary Loafman.Fa code
215eae608efSZachary Loafmanwith RETURN_VALUE set to 5.
216aa8775c6SChristian BruefferIf that does not happen, 5% of the time execute
217cfeb7489SZachary Loafman.Fa code
218cfeb7489SZachary Loafmanwith RETURN_VALUE set to 22.
219cfeb7489SZachary Loafman.It Sy sysctl debug.fail_point.foobar="5*return(5)->0.1%return(22)"
220eae608efSZachary LoafmanFor 5 times, return 5.
221eae608efSZachary LoafmanAfter that, 1/1000th of the time, return 22.
222cfeb7489SZachary Loafman.It Sy sysctl debug.fail_point.foobar="0.1%5*return(5)"
223eae608efSZachary LoafmanReturn 5 for 1 in 1000 executions, but only 5 times total.
224cfeb7489SZachary Loafman.It Sy sysctl debug.fail_point.foobar="1%*sleep(50)"
225eae608efSZachary Loafman1/100th of the time, sleep 50ms.
226b5bd50aeSMatthew D Fleming.It Sy sysctl debug.fail_point.foobar="1*return(5)[pid 1234]"
227b5bd50aeSMatthew D FlemingReturn 5 once, when pid 1234 executes the fail point.
228cfeb7489SZachary Loafman.El
2290afc94c1SUlrich Spörlein.Sh AUTHORS
2300afc94c1SUlrich Spörlein.An -nosplit
2310afc94c1SUlrich SpörleinThis manual page was written by
232*70e20d4eSConrad Meyer.Pp
233*70e20d4eSConrad Meyer.An Matthew Bryan Aq Mt matthew.bryan@isilon.com
234*70e20d4eSConrad Meyerand
235*70e20d4eSConrad Meyer.Pp
2368a7314fcSBaptiste Daroussin.An Zach Loafman Aq Mt zml@FreeBSD.org .
237cfeb7489SZachary Loafman.Sh CAVEATS
238aa8775c6SChristian BruefferIt is easy to shoot yourself in the foot by setting fail points too
239eae608efSZachary Loafmanaggressively or setting too many in combination.
240eae608efSZachary LoafmanFor example, forcing
241cfeb7489SZachary Loafman.Fn malloc
242cfeb7489SZachary Loafmanto fail consistently is potentially harmful to uptime.
243cfeb7489SZachary Loafman.Pp
244cfeb7489SZachary LoafmanThe
245cfeb7489SZachary Loafman.Fn sleep
246eae608efSZachary Loafmansysctl setting may not be appropriate in all situations.
247eae608efSZachary LoafmanCurrently,
248cfeb7489SZachary Loafman.Fn fail_point_eval
249cfeb7489SZachary Loafmandoes not verify whether the context is appropriate for calling
250cfeb7489SZachary Loafman.Fn msleep .
251*70e20d4eSConrad MeyerYou can force it to evaluate a
252*70e20d4eSConrad Meyer.Sy sleep
253*70e20d4eSConrad Meyeraction as a
254*70e20d4eSConrad Meyer.Sy delay
255*70e20d4eSConrad Meyeraction by specifying the
256*70e20d4eSConrad Meyer.Sy FAIL_POINT_NONSLEEPABLE
257*70e20d4eSConrad Meyerflag at the point the fail point is declared.
258