xref: /linux-6.15/include/linux/fault-inject.h (revision 6ce2082f)
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 
5*6ce2082fSJani Nikula #include <linux/err.h>
6*6ce2082fSJani Nikula #include <linux/types.h>
7*6ce2082fSJani Nikula 
8*6ce2082fSJani Nikula struct dentry;
9*6ce2082fSJani Nikula struct kmem_cache;
10*6ce2082fSJani Nikula 
116ff1cb35SAkinobu Mita #ifdef CONFIG_FAULT_INJECTION
126ff1cb35SAkinobu Mita 
13*6ce2082fSJani Nikula #include <linux/atomic.h>
144668c7a2SAkinobu Mita #include <linux/configfs.h>
156adc4a22SDmitry Monakhov #include <linux/ratelimit.h>
166ff1cb35SAkinobu Mita 
176ff1cb35SAkinobu Mita /*
186ff1cb35SAkinobu Mita  * For explanation of the elements of this struct, see
1910ffebbeSMauro Carvalho Chehab  * Documentation/fault-injection/fault-injection.rst
206ff1cb35SAkinobu Mita  */
216ff1cb35SAkinobu Mita struct fault_attr {
226ff1cb35SAkinobu Mita 	unsigned long probability;
236ff1cb35SAkinobu Mita 	unsigned long interval;
246ff1cb35SAkinobu Mita 	atomic_t times;
256ff1cb35SAkinobu Mita 	atomic_t space;
266ff1cb35SAkinobu Mita 	unsigned long verbose;
27621a5f7aSViresh Kumar 	bool task_filter;
28329409aeSAkinobu Mita 	unsigned long stacktrace_depth;
29329409aeSAkinobu Mita 	unsigned long require_start;
30329409aeSAkinobu Mita 	unsigned long require_end;
31329409aeSAkinobu Mita 	unsigned long reject_start;
32329409aeSAkinobu Mita 	unsigned long reject_end;
336ff1cb35SAkinobu Mita 
346ff1cb35SAkinobu Mita 	unsigned long count;
356adc4a22SDmitry Monakhov 	struct ratelimit_state ratelimit_state;
366adc4a22SDmitry Monakhov 	struct dentry *dname;
376ff1cb35SAkinobu Mita };
386ff1cb35SAkinobu Mita 
39ea4452deSQi Zheng enum fault_flags {
40ea4452deSQi Zheng 	FAULT_NOWARN =	1 << 0,
41ea4452deSQi Zheng };
42ea4452deSQi Zheng 
436ff1cb35SAkinobu Mita #define FAULT_ATTR_INITIALIZER {					\
446ff1cb35SAkinobu Mita 		.interval = 1,						\
456ff1cb35SAkinobu Mita 		.times = ATOMIC_INIT(1),				\
46329409aeSAkinobu Mita 		.require_end = ULONG_MAX,				\
47329409aeSAkinobu Mita 		.stacktrace_depth = 32,					\
486adc4a22SDmitry Monakhov 		.ratelimit_state = RATELIMIT_STATE_INIT_DISABLED,	\
496b1b60f4SDon Mullis 		.verbose = 2,						\
506adc4a22SDmitry Monakhov 		.dname = NULL,						\
516ff1cb35SAkinobu Mita 	}
526ff1cb35SAkinobu Mita 
536ff1cb35SAkinobu Mita #define DECLARE_FAULT_ATTR(name) struct fault_attr name = FAULT_ATTR_INITIALIZER
546ff1cb35SAkinobu Mita int setup_fault_attr(struct fault_attr *attr, char *str);
55ea4452deSQi Zheng bool should_fail_ex(struct fault_attr *attr, ssize_t size, int flags);
5608b3df2dSDon Mullis bool should_fail(struct fault_attr *attr, ssize_t size);
576ff1cb35SAkinobu Mita 
58*6ce2082fSJani Nikula #else /* CONFIG_FAULT_INJECTION */
59*6ce2082fSJani Nikula 
60*6ce2082fSJani Nikula struct fault_attr {
61*6ce2082fSJani Nikula };
62*6ce2082fSJani Nikula 
63*6ce2082fSJani Nikula #define DECLARE_FAULT_ATTR(name) struct fault_attr name = {}
64*6ce2082fSJani Nikula 
setup_fault_attr(struct fault_attr * attr,char * str)65*6ce2082fSJani Nikula static inline int setup_fault_attr(struct fault_attr *attr, char *str)
66*6ce2082fSJani Nikula {
67*6ce2082fSJani Nikula 	return 0; /* Note: 0 means error for __setup() handlers! */
68*6ce2082fSJani Nikula }
should_fail_ex(struct fault_attr * attr,ssize_t size,int flags)69*6ce2082fSJani Nikula static inline bool should_fail_ex(struct fault_attr *attr, ssize_t size, int flags)
70*6ce2082fSJani Nikula {
71*6ce2082fSJani Nikula 	return false;
72*6ce2082fSJani Nikula }
should_fail(struct fault_attr * attr,ssize_t size)73*6ce2082fSJani Nikula static inline bool should_fail(struct fault_attr *attr, ssize_t size)
74*6ce2082fSJani Nikula {
75*6ce2082fSJani Nikula 	return false;
76*6ce2082fSJani Nikula }
77*6ce2082fSJani Nikula 
78*6ce2082fSJani Nikula #endif /* CONFIG_FAULT_INJECTION */
79*6ce2082fSJani Nikula 
806ff1cb35SAkinobu Mita #ifdef CONFIG_FAULT_INJECTION_DEBUG_FS
816ff1cb35SAkinobu Mita 
82dd48c085SAkinobu Mita struct dentry *fault_create_debugfs_attr(const char *name,
83dd48c085SAkinobu Mita 			struct dentry *parent, struct fault_attr *attr);
846ff1cb35SAkinobu Mita 
856ff1cb35SAkinobu Mita #else /* CONFIG_FAULT_INJECTION_DEBUG_FS */
866ff1cb35SAkinobu Mita 
fault_create_debugfs_attr(const char * name,struct dentry * parent,struct fault_attr * attr)87dd48c085SAkinobu Mita static inline struct dentry *fault_create_debugfs_attr(const char *name,
88dd48c085SAkinobu Mita 			struct dentry *parent, struct fault_attr *attr)
896ff1cb35SAkinobu Mita {
90dd48c085SAkinobu Mita 	return ERR_PTR(-ENODEV);
916ff1cb35SAkinobu Mita }
926ff1cb35SAkinobu Mita 
936ff1cb35SAkinobu Mita #endif /* CONFIG_FAULT_INJECTION_DEBUG_FS */
946ff1cb35SAkinobu Mita 
954668c7a2SAkinobu Mita #ifdef CONFIG_FAULT_INJECTION_CONFIGFS
964668c7a2SAkinobu Mita 
974668c7a2SAkinobu Mita struct fault_config {
984668c7a2SAkinobu Mita 	struct fault_attr attr;
994668c7a2SAkinobu Mita 	struct config_group group;
1004668c7a2SAkinobu Mita };
1014668c7a2SAkinobu Mita 
1024668c7a2SAkinobu Mita void fault_config_init(struct fault_config *config, const char *name);
1034668c7a2SAkinobu Mita 
1044668c7a2SAkinobu Mita #else /* CONFIG_FAULT_INJECTION_CONFIGFS */
1054668c7a2SAkinobu Mita 
1064668c7a2SAkinobu Mita struct fault_config {
1074668c7a2SAkinobu Mita };
1084668c7a2SAkinobu Mita 
fault_config_init(struct fault_config * config,const char * name)1094668c7a2SAkinobu Mita static inline void fault_config_init(struct fault_config *config,
1104668c7a2SAkinobu Mita 			const char *name)
1114668c7a2SAkinobu Mita {
1124668c7a2SAkinobu Mita }
1134668c7a2SAkinobu Mita 
1144668c7a2SAkinobu Mita #endif /* CONFIG_FAULT_INJECTION_CONFIGFS */
1154668c7a2SAkinobu Mita 
1160866e82eSKefeng Wang #ifdef CONFIG_FAIL_PAGE_ALLOC
11753dabce2SVlastimil Babka bool should_fail_alloc_page(gfp_t gfp_mask, unsigned int order);
1180866e82eSKefeng Wang #else
should_fail_alloc_page(gfp_t gfp_mask,unsigned int order)11953dabce2SVlastimil Babka static inline bool should_fail_alloc_page(gfp_t gfp_mask, unsigned int order)
1200866e82eSKefeng Wang {
1210866e82eSKefeng Wang 	return false;
1220866e82eSKefeng Wang }
1230866e82eSKefeng Wang #endif /* CONFIG_FAIL_PAGE_ALLOC */
1240866e82eSKefeng Wang 
125773ff60eSAkinobu Mita #ifdef CONFIG_FAILSLAB
126a7526fe8SVlastimil Babka int should_failslab(struct kmem_cache *s, gfp_t gfpflags);
127773ff60eSAkinobu Mita #else
should_failslab(struct kmem_cache * s,gfp_t gfpflags)128a7526fe8SVlastimil Babka static inline int should_failslab(struct kmem_cache *s, gfp_t gfpflags)
129773ff60eSAkinobu Mita {
130773ff60eSAkinobu Mita 	return false;
131773ff60eSAkinobu Mita }
132773ff60eSAkinobu Mita #endif /* CONFIG_FAILSLAB */
133773ff60eSAkinobu Mita 
1346ff1cb35SAkinobu Mita #endif /* _LINUX_FAULT_INJECT_H */
135