This patch introduces CONFIG_DEBUG_PAGEFAULT_COUNT, to detect over-/underflows in the pagefault_count resulting from a wrong usage of pagefault_enable() and pagefault_disable(). Signed-off-by: David Hildenbrand <dahi@xxxxxxxxxxxxxxxxxx> --- include/linux/uaccess.h | 8 +++++++- lib/Kconfig.debug | 9 +++++++++ mm/maccess.c | 11 +++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/include/linux/uaccess.h b/include/linux/uaccess.h index 1dfc678..6ffb90b 100644 --- a/include/linux/uaccess.h +++ b/include/linux/uaccess.h @@ -20,11 +20,17 @@ static __always_inline void pagefault_count_inc(void) (*pagefault_count_ptr())++; } -static __always_inline void pagefault_count_dec(void) +static __always_inline void __pagefault_count_dec(void) { (*pagefault_count_ptr())--; } +#ifdef CONFIG_DEBUG_PAGEFAULT_COUNT +extern void pagefault_count_dec(void); +#else +#define pagefault_count_dec() __pagefault_count_dec() +#endif + /* * These routines enable/disable the pagefault handler. If disabled, it will * not take any locks and go straight to the fixup table. diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index d780351..9dea6e0 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug @@ -860,6 +860,15 @@ config DEBUG_PREEMPT if kernel code uses it in a preemption-unsafe way. Also, the kernel will detect preemption count underflows. +config DEBUG_PAGEFAULT_COUNT + bool "Debug pagefault_disable / pagefault_enable" + depends on DEBUG_KERNEL + default n + help + If you say Y here then the kernel will detect pagefault count + over-/underflows and therefore non-matching pagefault_enable() and + pagefault_disable() calls. + menu "Lock Debugging (spinlocks, mutexes, etc...)" config DEBUG_RT_MUTEXES diff --git a/mm/maccess.c b/mm/maccess.c index d53adf9..4b72aa1 100644 --- a/mm/maccess.c +++ b/mm/maccess.c @@ -5,6 +5,17 @@ #include <linux/mm.h> #include <linux/uaccess.h> +#ifdef CONFIG_DEBUG_PAGEFAULT_COUNT +void pagefault_count_dec(void) +{ + __pagefault_count_dec(); + + /* underflow / previous overflow ? */ + WARN_ON(pagefault_count() < 0); +} +EXPORT_SYMBOL(pagefault_count_dec); +#endif + /** * probe_kernel_read(): safely attempt to read from a location * @dst: pointer to the buffer that shall take the data -- 1.8.5.5 -- To unsubscribe from this list: send the line "unsubscribe linux-arch" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html