xref: /openbmc/linux/include/linux/fault-inject.h (revision 0866e82e)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
26ff1cb35SAkinobu Mita #ifndef _LINUX_FAULT_INJECT_H
36ff1cb35SAkinobu Mita #define _LINUX_FAULT_INJECT_H
46ff1cb35SAkinobu Mita 
56ff1cb35SAkinobu Mita #ifdef CONFIG_FAULT_INJECTION
66ff1cb35SAkinobu Mita 
76ff1cb35SAkinobu Mita #include <linux/types.h>
86ff1cb35SAkinobu Mita #include <linux/debugfs.h>
94668c7a2SAkinobu Mita #include <linux/configfs.h>
106adc4a22SDmitry Monakhov #include <linux/ratelimit.h>
1160063497SArun Sharma #include <linux/atomic.h>
126ff1cb35SAkinobu Mita 
136ff1cb35SAkinobu Mita /*
146ff1cb35SAkinobu Mita  * For explanation of the elements of this struct, see
1510ffebbeSMauro Carvalho Chehab  * Documentation/fault-injection/fault-injection.rst
166ff1cb35SAkinobu Mita  */
176ff1cb35SAkinobu Mita struct fault_attr {
186ff1cb35SAkinobu Mita 	unsigned long probability;
196ff1cb35SAkinobu Mita 	unsigned long interval;
206ff1cb35SAkinobu Mita 	atomic_t times;
216ff1cb35SAkinobu Mita 	atomic_t space;
226ff1cb35SAkinobu Mita 	unsigned long verbose;
23621a5f7aSViresh Kumar 	bool task_filter;
24329409aeSAkinobu Mita 	unsigned long stacktrace_depth;
25329409aeSAkinobu Mita 	unsigned long require_start;
26329409aeSAkinobu Mita 	unsigned long require_end;
27329409aeSAkinobu Mita 	unsigned long reject_start;
28329409aeSAkinobu Mita 	unsigned long reject_end;
296ff1cb35SAkinobu Mita 
306ff1cb35SAkinobu Mita 	unsigned long count;
316adc4a22SDmitry Monakhov 	struct ratelimit_state ratelimit_state;
326adc4a22SDmitry Monakhov 	struct dentry *dname;
336ff1cb35SAkinobu Mita };
346ff1cb35SAkinobu Mita 
35ea4452deSQi Zheng enum fault_flags {
36ea4452deSQi Zheng 	FAULT_NOWARN =	1 << 0,
37ea4452deSQi Zheng };
38ea4452deSQi Zheng 
396ff1cb35SAkinobu Mita #define FAULT_ATTR_INITIALIZER {					\
406ff1cb35SAkinobu Mita 		.interval = 1,						\
416ff1cb35SAkinobu Mita 		.times = ATOMIC_INIT(1),				\
42329409aeSAkinobu Mita 		.require_end = ULONG_MAX,				\
43329409aeSAkinobu Mita 		.stacktrace_depth = 32,					\
446adc4a22SDmitry Monakhov 		.ratelimit_state = RATELIMIT_STATE_INIT_DISABLED,	\
456b1b60f4SDon Mullis 		.verbose = 2,						\
466adc4a22SDmitry Monakhov 		.dname = NULL,						\
476ff1cb35SAkinobu Mita 	}
486ff1cb35SAkinobu Mita 
496ff1cb35SAkinobu Mita #define DECLARE_FAULT_ATTR(name) struct fault_attr name = FAULT_ATTR_INITIALIZER
506ff1cb35SAkinobu Mita int setup_fault_attr(struct fault_attr *attr, char *str);
51ea4452deSQi Zheng bool should_fail_ex(struct fault_attr *attr, ssize_t size, int flags);
5208b3df2dSDon Mullis bool should_fail(struct fault_attr *attr, ssize_t size);
536ff1cb35SAkinobu Mita 
546ff1cb35SAkinobu Mita #ifdef CONFIG_FAULT_INJECTION_DEBUG_FS
556ff1cb35SAkinobu Mita 
56dd48c085SAkinobu Mita struct dentry *fault_create_debugfs_attr(const char *name,
57dd48c085SAkinobu Mita 			struct dentry *parent, struct fault_attr *attr);
586ff1cb35SAkinobu Mita 
596ff1cb35SAkinobu Mita #else /* CONFIG_FAULT_INJECTION_DEBUG_FS */
606ff1cb35SAkinobu Mita 
fault_create_debugfs_attr(const char * name,struct dentry * parent,struct fault_attr * attr)61dd48c085SAkinobu Mita static inline struct dentry *fault_create_debugfs_attr(const char *name,
62dd48c085SAkinobu Mita 			struct dentry *parent, struct fault_attr *attr)
636ff1cb35SAkinobu Mita {
64dd48c085SAkinobu Mita 	return ERR_PTR(-ENODEV);
656ff1cb35SAkinobu Mita }
666ff1cb35SAkinobu Mita 
676ff1cb35SAkinobu Mita #endif /* CONFIG_FAULT_INJECTION_DEBUG_FS */
686ff1cb35SAkinobu Mita 
694668c7a2SAkinobu Mita #ifdef CONFIG_FAULT_INJECTION_CONFIGFS
704668c7a2SAkinobu Mita 
714668c7a2SAkinobu Mita struct fault_config {
724668c7a2SAkinobu Mita 	struct fault_attr attr;
734668c7a2SAkinobu Mita 	struct config_group group;
744668c7a2SAkinobu Mita };
754668c7a2SAkinobu Mita 
764668c7a2SAkinobu Mita void fault_config_init(struct fault_config *config, const char *name);
774668c7a2SAkinobu Mita 
784668c7a2SAkinobu Mita #else /* CONFIG_FAULT_INJECTION_CONFIGFS */
794668c7a2SAkinobu Mita 
804668c7a2SAkinobu Mita struct fault_config {
814668c7a2SAkinobu Mita };
824668c7a2SAkinobu Mita 
fault_config_init(struct fault_config * config,const char * name)834668c7a2SAkinobu Mita static inline void fault_config_init(struct fault_config *config,
844668c7a2SAkinobu Mita 			const char *name)
854668c7a2SAkinobu Mita {
864668c7a2SAkinobu Mita }
874668c7a2SAkinobu Mita 
884668c7a2SAkinobu Mita #endif /* CONFIG_FAULT_INJECTION_CONFIGFS */
894668c7a2SAkinobu Mita 
906ff1cb35SAkinobu Mita #endif /* CONFIG_FAULT_INJECTION */
916ff1cb35SAkinobu Mita 
92cc689c5bSIngo Molnar struct kmem_cache;
93cc689c5bSIngo Molnar 
941e7a8181SVlastimil Babka bool should_fail_alloc_page(gfp_t gfp_mask, unsigned int order);
951e7a8181SVlastimil Babka 
96*0866e82eSKefeng Wang #ifdef CONFIG_FAIL_PAGE_ALLOC
97*0866e82eSKefeng Wang bool __should_fail_alloc_page(gfp_t gfp_mask, unsigned int order);
98*0866e82eSKefeng Wang #else
__should_fail_alloc_page(gfp_t gfp_mask,unsigned int order)99*0866e82eSKefeng Wang static inline bool __should_fail_alloc_page(gfp_t gfp_mask, unsigned int order)
100*0866e82eSKefeng Wang {
101*0866e82eSKefeng Wang 	return false;
102*0866e82eSKefeng Wang }
103*0866e82eSKefeng Wang #endif /* CONFIG_FAIL_PAGE_ALLOC */
104*0866e82eSKefeng Wang 
1054f6923fbSHoward McLauchlan int should_failslab(struct kmem_cache *s, gfp_t gfpflags);
106773ff60eSAkinobu Mita #ifdef CONFIG_FAILSLAB
1074f6923fbSHoward McLauchlan extern bool __should_failslab(struct kmem_cache *s, gfp_t gfpflags);
108773ff60eSAkinobu Mita #else
__should_failslab(struct kmem_cache * s,gfp_t gfpflags)1094f6923fbSHoward McLauchlan static inline bool __should_failslab(struct kmem_cache *s, gfp_t gfpflags)
110773ff60eSAkinobu Mita {
111773ff60eSAkinobu Mita 	return false;
112773ff60eSAkinobu Mita }
113773ff60eSAkinobu Mita #endif /* CONFIG_FAILSLAB */
114773ff60eSAkinobu Mita 
1156ff1cb35SAkinobu Mita #endif /* _LINUX_FAULT_INJECT_H */
116