diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-01-26 12:47:56 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-01-26 12:47:56 -0500 |
| commit | 3386c05bdbd3e60ca7158253442f0a00133db28e (patch) | |
| tree | 19e48f0352e65eb83a0e922fb75528ed39f44ebd | |
| parent | 1e70c7f7a9d4a3d2cc78b40e1d7768d99cd79899 (diff) | |
| parent | 6552ebae25ffd57574c6e72d17fce67fea08b918 (diff) | |
Merge branch 'core-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'core-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
debugobjects: add and use INIT_WORK_ON_STACK
rcu: remove duplicate CONFIG_RCU_CPU_STALL_DETECTOR
relay: fix lock imbalance in relay_late_setup_files
oprofile: fix uninitialized use of struct op_entry
rcu: move Kconfig menu
softlock: fix false panic which can occur if softlockup_thresh is reduced
rcu: add __cpuinit to rcu_init_percpu_data()
| -rw-r--r-- | arch/x86/kernel/hpet.c | 1 | ||||
| -rw-r--r-- | drivers/oprofile/cpu_buffer.c | 5 | ||||
| -rw-r--r-- | drivers/oprofile/cpu_buffer.h | 7 | ||||
| -rw-r--r-- | include/linux/sched.h | 3 | ||||
| -rw-r--r-- | include/linux/workqueue.h | 6 | ||||
| -rw-r--r-- | init/Kconfig | 179 | ||||
| -rw-r--r-- | kernel/rcuclassic.c | 2 | ||||
| -rw-r--r-- | kernel/rcutree.c | 2 | ||||
| -rw-r--r-- | kernel/relay.c | 4 | ||||
| -rw-r--r-- | kernel/softlockup.c | 9 | ||||
| -rw-r--r-- | kernel/sysctl.c | 2 | ||||
| -rw-r--r-- | lib/Kconfig.debug | 13 |
12 files changed, 129 insertions, 104 deletions
diff --git a/arch/x86/kernel/hpet.c b/arch/x86/kernel/hpet.c index bb2e0f0975ae..64d5ad0b8add 100644 --- a/arch/x86/kernel/hpet.c +++ b/arch/x86/kernel/hpet.c | |||
| @@ -633,6 +633,7 @@ static int hpet_cpuhp_notify(struct notifier_block *n, | |||
| 633 | /* FIXME: add schedule_work_on() */ | 633 | /* FIXME: add schedule_work_on() */ |
| 634 | schedule_delayed_work_on(cpu, &work.work, 0); | 634 | schedule_delayed_work_on(cpu, &work.work, 0); |
| 635 | wait_for_completion(&work.complete); | 635 | wait_for_completion(&work.complete); |
| 636 | destroy_timer_on_stack(&work.work.timer); | ||
| 636 | break; | 637 | break; |
| 637 | case CPU_DEAD: | 638 | case CPU_DEAD: |
| 638 | if (hdev) { | 639 | if (hdev) { |
diff --git a/drivers/oprofile/cpu_buffer.c b/drivers/oprofile/cpu_buffer.c index 2e03b6d796d3..e76d715e4342 100644 --- a/drivers/oprofile/cpu_buffer.c +++ b/drivers/oprofile/cpu_buffer.c | |||
| @@ -393,16 +393,21 @@ oprofile_write_reserve(struct op_entry *entry, struct pt_regs * const regs, | |||
| 393 | return; | 393 | return; |
| 394 | 394 | ||
| 395 | fail: | 395 | fail: |
| 396 | entry->event = NULL; | ||
| 396 | cpu_buf->sample_lost_overflow++; | 397 | cpu_buf->sample_lost_overflow++; |
| 397 | } | 398 | } |
| 398 | 399 | ||
| 399 | int oprofile_add_data(struct op_entry *entry, unsigned long val) | 400 | int oprofile_add_data(struct op_entry *entry, unsigned long val) |
| 400 | { | 401 | { |
| 402 | if (!entry->event) | ||
| 403 | return 0; | ||
| 401 | return op_cpu_buffer_add_data(entry, val); | 404 | return op_cpu_buffer_add_data(entry, val); |
| 402 | } | 405 | } |
| 403 | 406 | ||
| 404 | int oprofile_write_commit(struct op_entry *entry) | 407 | int oprofile_write_commit(struct op_entry *entry) |
| 405 | { | 408 | { |
| 409 | if (!entry->event) | ||
| 410 | return -EINVAL; | ||
| 406 | return op_cpu_buffer_write_commit(entry); | 411 | return op_cpu_buffer_write_commit(entry); |
| 407 | } | 412 | } |
| 408 | 413 | ||
diff --git a/drivers/oprofile/cpu_buffer.h b/drivers/oprofile/cpu_buffer.h index 63f81c44846a..272995d20293 100644 --- a/drivers/oprofile/cpu_buffer.h +++ b/drivers/oprofile/cpu_buffer.h | |||
| @@ -66,6 +66,13 @@ static inline void op_cpu_buffer_reset(int cpu) | |||
| 66 | cpu_buf->last_task = NULL; | 66 | cpu_buf->last_task = NULL; |
| 67 | } | 67 | } |
| 68 | 68 | ||
| 69 | /* | ||
| 70 | * op_cpu_buffer_add_data() and op_cpu_buffer_write_commit() may be | ||
| 71 | * called only if op_cpu_buffer_write_reserve() did not return NULL or | ||
| 72 | * entry->event != NULL, otherwise entry->size or entry->event will be | ||
| 73 | * used uninitialized. | ||
| 74 | */ | ||
| 75 | |||
| 69 | struct op_sample | 76 | struct op_sample |
| 70 | *op_cpu_buffer_write_reserve(struct op_entry *entry, unsigned long size); | 77 | *op_cpu_buffer_write_reserve(struct op_entry *entry, unsigned long size); |
| 71 | int op_cpu_buffer_write_commit(struct op_entry *entry); | 78 | int op_cpu_buffer_write_commit(struct op_entry *entry); |
diff --git a/include/linux/sched.h b/include/linux/sched.h index c20943eabb4c..02e16d207304 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
| @@ -293,6 +293,9 @@ extern void sched_show_task(struct task_struct *p); | |||
| 293 | extern void softlockup_tick(void); | 293 | extern void softlockup_tick(void); |
| 294 | extern void touch_softlockup_watchdog(void); | 294 | extern void touch_softlockup_watchdog(void); |
| 295 | extern void touch_all_softlockup_watchdogs(void); | 295 | extern void touch_all_softlockup_watchdogs(void); |
| 296 | extern int proc_dosoftlockup_thresh(struct ctl_table *table, int write, | ||
| 297 | struct file *filp, void __user *buffer, | ||
| 298 | size_t *lenp, loff_t *ppos); | ||
| 296 | extern unsigned int softlockup_panic; | 299 | extern unsigned int softlockup_panic; |
| 297 | extern unsigned long sysctl_hung_task_check_count; | 300 | extern unsigned long sysctl_hung_task_check_count; |
| 298 | extern unsigned long sysctl_hung_task_timeout_secs; | 301 | extern unsigned long sysctl_hung_task_timeout_secs; |
diff --git a/include/linux/workqueue.h b/include/linux/workqueue.h index 47151c8495aa..3cd51e579ab1 100644 --- a/include/linux/workqueue.h +++ b/include/linux/workqueue.h | |||
| @@ -130,6 +130,12 @@ struct execute_work { | |||
| 130 | init_timer_deferrable(&(_work)->timer); \ | 130 | init_timer_deferrable(&(_work)->timer); \ |
| 131 | } while (0) | 131 | } while (0) |
| 132 | 132 | ||
| 133 | #define INIT_DELAYED_WORK_ON_STACK(_work, _func) \ | ||
| 134 | do { \ | ||
| 135 | INIT_WORK(&(_work)->work, (_func)); \ | ||
| 136 | init_timer_on_stack(&(_work)->timer); \ | ||
| 137 | } while (0) | ||
| 138 | |||
| 133 | /** | 139 | /** |
| 134 | * work_pending - Find out whether a work item is currently pending | 140 | * work_pending - Find out whether a work item is currently pending |
| 135 | * @work: The work item in question | 141 | * @work: The work item in question |
diff --git a/init/Kconfig b/init/Kconfig index 2af83825634e..3be35f3a001b 100644 --- a/init/Kconfig +++ b/init/Kconfig | |||
| @@ -238,6 +238,98 @@ config AUDIT_TREE | |||
| 238 | def_bool y | 238 | def_bool y |
| 239 | depends on AUDITSYSCALL && INOTIFY | 239 | depends on AUDITSYSCALL && INOTIFY |
| 240 | 240 | ||
| 241 | menu "RCU Subsystem" | ||
| 242 | |||
| 243 | choice | ||
| 244 | prompt "RCU Implementation" | ||
| 245 | default CLASSIC_RCU | ||
| 246 | |||
| 247 | config CLASSIC_RCU | ||
| 248 | bool "Classic RCU" | ||
| 249 | help | ||
| 250 | This option selects the classic RCU implementation that is | ||
| 251 | designed for best read-side performance on non-realtime | ||
| 252 | systems. | ||
| 253 | |||
| 254 | Select this option if you are unsure. | ||
| 255 | |||
| 256 | config TREE_RCU | ||
| 257 | bool "Tree-based hierarchical RCU" | ||
| 258 | help | ||
| 259 | This option selects the RCU implementation that is | ||
| 260 | designed for very large SMP system with hundreds or | ||
| 261 | thousands of CPUs. | ||
| 262 | |||
| 263 | config PREEMPT_RCU | ||
| 264 | bool "Preemptible RCU" | ||
| 265 | depends on PREEMPT | ||
| 266 | help | ||
| 267 | This option reduces the latency of the kernel by making certain | ||
| 268 | RCU sections preemptible. Normally RCU code is non-preemptible, if | ||
| 269 | this option is selected then read-only RCU sections become | ||
| 270 | preemptible. This helps latency, but may expose bugs due to | ||
| 271 | now-naive assumptions about each RCU read-side critical section | ||
| 272 | remaining on a given CPU through its execution. | ||
| 273 | |||
| 274 | endchoice | ||
| 275 | |||
| 276 | config RCU_TRACE | ||
| 277 | bool "Enable tracing for RCU" | ||
| 278 | depends on TREE_RCU || PREEMPT_RCU | ||
| 279 | help | ||
| 280 | This option provides tracing in RCU which presents stats | ||
| 281 | in debugfs for debugging RCU implementation. | ||
| 282 | |||
| 283 | Say Y here if you want to enable RCU tracing | ||
| 284 | Say N if you are unsure. | ||
| 285 | |||
| 286 | config RCU_FANOUT | ||
| 287 | int "Tree-based hierarchical RCU fanout value" | ||
| 288 | range 2 64 if 64BIT | ||
| 289 | range 2 32 if !64BIT | ||
| 290 | depends on TREE_RCU | ||
| 291 | default 64 if 64BIT | ||
| 292 | default 32 if !64BIT | ||
| 293 | help | ||
| 294 | This option controls the fanout of hierarchical implementations | ||
| 295 | of RCU, allowing RCU to work efficiently on machines with | ||
| 296 | large numbers of CPUs. This value must be at least the cube | ||
| 297 | root of NR_CPUS, which allows NR_CPUS up to 32,768 for 32-bit | ||
| 298 | systems and up to 262,144 for 64-bit systems. | ||
| 299 | |||
| 300 | Select a specific number if testing RCU itself. | ||
| 301 | Take the default if unsure. | ||
| 302 | |||
| 303 | config RCU_FANOUT_EXACT | ||
| 304 | bool "Disable tree-based hierarchical RCU auto-balancing" | ||
| 305 | depends on TREE_RCU | ||
| 306 | default n | ||
| 307 | help | ||
| 308 | This option forces use of the exact RCU_FANOUT value specified, | ||
| 309 | regardless of imbalances in the hierarchy. This is useful for | ||
| 310 | testing RCU itself, and might one day be useful on systems with | ||
| 311 | strong NUMA behavior. | ||
| 312 | |||
| 313 | Without RCU_FANOUT_EXACT, the code will balance the hierarchy. | ||
| 314 | |||
| 315 | Say N if unsure. | ||
| 316 | |||
| 317 | config TREE_RCU_TRACE | ||
| 318 | def_bool RCU_TRACE && TREE_RCU | ||
| 319 | select DEBUG_FS | ||
| 320 | h | ||
