mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	Model call chain after should_failslab(). Likewise, we can now use a kprobe to override the return value of should_fail_alloc_page() and inject allocation failures into alloc_page*(). This will allow injecting allocation failures using the BCC tools even without building kernel with CONFIG_FAIL_PAGE_ALLOC and booting it with a fail_page_alloc= parameter, which incurs some overhead even when failures are not being injected. On the other hand, this patch adds an unconditional call to should_fail_alloc_page() from page allocation hotpath. That overhead should be rather negligible with CONFIG_FAIL_PAGE_ALLOC=n when there's no kprobe attached, though. [vbabka@suse.cz: changelog addition] Link: http://lkml.kernel.org/r/20181214074330.18917-1-bpoirier@suse.com Signed-off-by: Benjamin Poirier <bpoirier@suse.com> Acked-by: Vlastimil Babka <vbabka@suse.cz> Cc: Arnd Bergmann <arnd@arndb.de> Cc: Michal Hocko <mhocko@suse.com> Cc: Pavel Tatashin <pavel.tatashin@microsoft.com> Cc: Oscar Salvador <osalvador@suse.de> Cc: Mike Rapoport <rppt@linux.vnet.ibm.com> Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com> Cc: Alexander Duyck <alexander.h.duyck@linux.intel.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
		
			
				
	
	
		
			36 lines
		
	
	
	
		
			1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			36 lines
		
	
	
	
		
			1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* SPDX-License-Identifier: GPL-2.0 */
 | 
						|
#ifndef _ASM_GENERIC_ERROR_INJECTION_H
 | 
						|
#define _ASM_GENERIC_ERROR_INJECTION_H
 | 
						|
 | 
						|
#if defined(__KERNEL__) && !defined(__ASSEMBLY__)
 | 
						|
enum {
 | 
						|
	EI_ETYPE_NONE,		/* Dummy value for undefined case */
 | 
						|
	EI_ETYPE_NULL,		/* Return NULL if failure */
 | 
						|
	EI_ETYPE_ERRNO,		/* Return -ERRNO if failure */
 | 
						|
	EI_ETYPE_ERRNO_NULL,	/* Return -ERRNO or NULL if failure */
 | 
						|
	EI_ETYPE_TRUE,		/* Return true if failure */
 | 
						|
};
 | 
						|
 | 
						|
struct error_injection_entry {
 | 
						|
	unsigned long	addr;
 | 
						|
	int		etype;
 | 
						|
};
 | 
						|
 | 
						|
#ifdef CONFIG_FUNCTION_ERROR_INJECTION
 | 
						|
/*
 | 
						|
 * Whitelist ganerating macro. Specify functions which can be
 | 
						|
 * error-injectable using this macro.
 | 
						|
 */
 | 
						|
#define ALLOW_ERROR_INJECTION(fname, _etype)				\
 | 
						|
static struct error_injection_entry __used				\
 | 
						|
	__attribute__((__section__("_error_injection_whitelist")))	\
 | 
						|
	_eil_addr_##fname = {						\
 | 
						|
		.addr = (unsigned long)fname,				\
 | 
						|
		.etype = EI_ETYPE_##_etype,				\
 | 
						|
	};
 | 
						|
#else
 | 
						|
#define ALLOW_ERROR_INJECTION(fname, _etype)
 | 
						|
#endif
 | 
						|
#endif
 | 
						|
 | 
						|
#endif /* _ASM_GENERIC_ERROR_INJECTION_H */
 |