Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

sched/preempt: Take away preempt_enable_no_resched() from modules

Discourage drivers/modules to be creative with preemption.

Sadly all is implemented in macros and inline so if they want to do
evil they still can, but at least try and discourage some.

Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Peter Zijlstra <peterz@infradead.org>
Cc: Eliezer Tamir <eliezer.tamir@linux.intel.com>
Cc: rui.zhang@intel.com
Cc: jacob.jun.pan@linux.intel.com
Cc: Mike Galbraith <bitbucket@online.de>
Cc: hpa@zytor.com
Cc: Rusty Russell <rusty@rustcorp.com.au>
Cc: Arjan van de Ven <arjan@linux.intel.com>
Cc: lenb@kernel.org
Cc: rjw@rjwysocki.net
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Link: http://lkml.kernel.org/n/tip-fn7h6vu8wtgxk0ih402qcijx@git.kernel.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>

authored by

Peter Zijlstra and committed by
Ingo Molnar
62b94a08 9ea4c380

+24 -3
+20 -2
include/linux/preempt.h
··· 64 64 } while (0) 65 65 66 66 #else 67 - #define preempt_enable() preempt_enable_no_resched() 67 + #define preempt_enable() \ 68 + do { \ 69 + barrier(); \ 70 + preempt_count_dec(); \ 71 + } while (0) 68 72 #define preempt_check_resched() do { } while (0) 69 73 #endif 70 74 ··· 97 93 __preempt_schedule_context(); \ 98 94 } while (0) 99 95 #else 100 - #define preempt_enable_notrace() preempt_enable_no_resched_notrace() 96 + #define preempt_enable_notrace() \ 97 + do { \ 98 + barrier(); \ 99 + __preempt_count_dec(); \ 100 + } while (0) 101 101 #endif 102 102 103 103 #else /* !CONFIG_PREEMPT_COUNT */ ··· 123 115 #define preempt_enable_notrace() barrier() 124 116 125 117 #endif /* CONFIG_PREEMPT_COUNT */ 118 + 119 + #ifdef MODULE 120 + /* 121 + * Modules have no business playing preemption tricks. 122 + */ 123 + #undef sched_preempt_enable_no_resched 124 + #undef preempt_enable_no_resched 125 + #undef preempt_enable_no_resched_notrace 126 + #undef preempt_check_resched 127 + #endif 126 128 127 129 #ifdef CONFIG_PREEMPT_NOTIFIERS 128 130
+4 -1
include/linux/uaccess.h
··· 25 25 26 26 static inline void pagefault_enable(void) 27 27 { 28 + #ifndef CONFIG_PREEMPT 28 29 /* 29 30 * make sure to issue those last loads/stores before enabling 30 31 * the pagefault handler again. 31 32 */ 32 33 barrier(); 33 34 preempt_count_dec(); 34 - preempt_check_resched(); 35 + #else 36 + preempt_enable(); 37 + #endif 35 38 } 36 39 37 40 #ifndef ARCH_HAS_NOCACHE_UACCESS