diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/Kconfig.preempt | 15 | ||||
| -rw-r--r-- | kernel/module.c | 15 |
2 files changed, 27 insertions, 3 deletions
diff --git a/kernel/Kconfig.preempt b/kernel/Kconfig.preempt index 0669b70fa6a3..9fdba03dc1fc 100644 --- a/kernel/Kconfig.preempt +++ b/kernel/Kconfig.preempt | |||
| @@ -52,8 +52,23 @@ config PREEMPT | |||
| 52 | 52 | ||
| 53 | endchoice | 53 | endchoice |
| 54 | 54 | ||
| 55 | config PREEMPT_RCU | ||
| 56 | bool "Preemptible RCU" | ||
| 57 | depends on PREEMPT | ||
| 58 | default n | ||
| 59 | help | ||
| 60 | This option reduces the latency of the kernel by making certain | ||
| 61 | RCU sections preemptible. Normally RCU code is non-preemptible, if | ||
| 62 | this option is selected then read-only RCU sections become | ||
| 63 | preemptible. This helps latency, but may expose bugs due to | ||
| 64 | now-naive assumptions about each RCU read-side critical section | ||
| 65 | remaining on a given CPU through its execution. | ||
| 66 | |||
| 67 | Say N if you are unsure. | ||
| 68 | |||
| 55 | config RCU_TRACE | 69 | config RCU_TRACE |
| 56 | bool "Enable tracing for RCU - currently stats in debugfs" | 70 | bool "Enable tracing for RCU - currently stats in debugfs" |
| 71 | depends on PREEMPT_RCU | ||
| 57 | select DEBUG_FS | 72 | select DEBUG_FS |
| 58 | default y | 73 | default y |
| 59 | help | 74 | help |
diff --git a/kernel/module.c b/kernel/module.c index be4807fb90e4..5d437bffd8dc 100644 --- a/kernel/module.c +++ b/kernel/module.c | |||
| @@ -2178,10 +2178,20 @@ sys_init_module(void __user *umod, | |||
| 2178 | wake_up(&module_wq); | 2178 | wake_up(&module_wq); |
| 2179 | return ret; | 2179 | return ret; |
| 2180 | } | 2180 | } |
| 2181 | if (ret > 0) { | ||
| 2182 | printk(KERN_WARNING "%s: '%s'->init suspiciously returned %d, " | ||
| 2183 | "it should follow 0/-E convention\n" | ||
| 2184 | KERN_WARNING "%s: loading module anyway...\n", | ||
| 2185 | __func__, mod->name, ret, | ||
| 2186 | __func__); | ||
| 2187 | dump_stack(); | ||
| 2188 | } | ||
| 2181 | 2189 | ||
| 2182 | /* Now it's a first class citizen! */ | 2190 | /* Now it's a first class citizen! Wake up anyone waiting for it. */ |
| 2183 | mutex_lock(&module_mutex); | ||
| 2184 | mod->state = MODULE_STATE_LIVE; | 2191 | mod->state = MODULE_STATE_LIVE; |
| 2192 | wake_up(&module_wq); | ||
| 2193 | |||
| 2194 | mutex_lock(&module_mutex); | ||
| 2185 | /* Drop initial reference. */ | 2195 | /* Drop initial reference. */ |
| 2186 | module_put(mod); | 2196 | module_put(mod); |
| 2187 | unwind_remove_table(mod->unwind_info, 1); | 2197 | unwind_remove_table(mod->unwind_info, 1); |
| @@ -2190,7 +2200,6 @@ sys_init_module(void __user *umod, | |||
| 2190 | mod->init_size = 0; | 2200 | mod->init_size = 0; |
| 2191 | mod->init_text_size = 0; | 2201 | mod->init_text_size = 0; |
| 2192 | mutex_unlock(&module_mutex); | 2202 | mutex_unlock(&module_mutex); |
| 2193 | wake_up(&module_wq); | ||
| 2194 | 2203 | ||
| 2195 | return 0; | 2204 | return 0; |
| 2196 | } | 2205 | } |
