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