mirror of
https://github.com/torvalds/linux.git
synced 2024-11-11 06:31:49 +00:00
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()
This commit is contained in:
commit
3386c05bdb
@ -633,6 +633,7 @@ static int hpet_cpuhp_notify(struct notifier_block *n,
|
|||||||
/* FIXME: add schedule_work_on() */
|
/* FIXME: add schedule_work_on() */
|
||||||
schedule_delayed_work_on(cpu, &work.work, 0);
|
schedule_delayed_work_on(cpu, &work.work, 0);
|
||||||
wait_for_completion(&work.complete);
|
wait_for_completion(&work.complete);
|
||||||
|
destroy_timer_on_stack(&work.work.timer);
|
||||||
break;
|
break;
|
||||||
case CPU_DEAD:
|
case CPU_DEAD:
|
||||||
if (hdev) {
|
if (hdev) {
|
||||||
|
@ -393,16 +393,21 @@ oprofile_write_reserve(struct op_entry *entry, struct pt_regs * const regs,
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
|
entry->event = NULL;
|
||||||
cpu_buf->sample_lost_overflow++;
|
cpu_buf->sample_lost_overflow++;
|
||||||
}
|
}
|
||||||
|
|
||||||
int oprofile_add_data(struct op_entry *entry, unsigned long val)
|
int oprofile_add_data(struct op_entry *entry, unsigned long val)
|
||||||
{
|
{
|
||||||
|
if (!entry->event)
|
||||||
|
return 0;
|
||||||
return op_cpu_buffer_add_data(entry, val);
|
return op_cpu_buffer_add_data(entry, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
int oprofile_write_commit(struct op_entry *entry)
|
int oprofile_write_commit(struct op_entry *entry)
|
||||||
{
|
{
|
||||||
|
if (!entry->event)
|
||||||
|
return -EINVAL;
|
||||||
return op_cpu_buffer_write_commit(entry);
|
return op_cpu_buffer_write_commit(entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -66,6 +66,13 @@ static inline void op_cpu_buffer_reset(int cpu)
|
|||||||
cpu_buf->last_task = NULL;
|
cpu_buf->last_task = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* op_cpu_buffer_add_data() and op_cpu_buffer_write_commit() may be
|
||||||
|
* called only if op_cpu_buffer_write_reserve() did not return NULL or
|
||||||
|
* entry->event != NULL, otherwise entry->size or entry->event will be
|
||||||
|
* used uninitialized.
|
||||||
|
*/
|
||||||
|
|
||||||
struct op_sample
|
struct op_sample
|
||||||
*op_cpu_buffer_write_reserve(struct op_entry *entry, unsigned long size);
|
*op_cpu_buffer_write_reserve(struct op_entry *entry, unsigned long size);
|
||||||
int op_cpu_buffer_write_commit(struct op_entry *entry);
|
int op_cpu_buffer_write_commit(struct op_entry *entry);
|
||||||
|
@ -293,6 +293,9 @@ extern void sched_show_task(struct task_struct *p);
|
|||||||
extern void softlockup_tick(void);
|
extern void softlockup_tick(void);
|
||||||
extern void touch_softlockup_watchdog(void);
|
extern void touch_softlockup_watchdog(void);
|
||||||
extern void touch_all_softlockup_watchdogs(void);
|
extern void touch_all_softlockup_watchdogs(void);
|
||||||
|
extern int proc_dosoftlockup_thresh(struct ctl_table *table, int write,
|
||||||
|
struct file *filp, void __user *buffer,
|
||||||
|
size_t *lenp, loff_t *ppos);
|
||||||
extern unsigned int softlockup_panic;
|
extern unsigned int softlockup_panic;
|
||||||
extern unsigned long sysctl_hung_task_check_count;
|
extern unsigned long sysctl_hung_task_check_count;
|
||||||
extern unsigned long sysctl_hung_task_timeout_secs;
|
extern unsigned long sysctl_hung_task_timeout_secs;
|
||||||
|
@ -130,6 +130,12 @@ struct execute_work {
|
|||||||
init_timer_deferrable(&(_work)->timer); \
|
init_timer_deferrable(&(_work)->timer); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
#define INIT_DELAYED_WORK_ON_STACK(_work, _func) \
|
||||||
|
do { \
|
||||||
|
INIT_WORK(&(_work)->work, (_func)); \
|
||||||
|
init_timer_on_stack(&(_work)->timer); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* work_pending - Find out whether a work item is currently pending
|
* work_pending - Find out whether a work item is currently pending
|
||||||
* @work: The work item in question
|
* @work: The work item in question
|
||||||
|
179
init/Kconfig
179
init/Kconfig
@ -238,6 +238,98 @@ config AUDIT_TREE
|
|||||||
def_bool y
|
def_bool y
|
||||||
depends on AUDITSYSCALL && INOTIFY
|
depends on AUDITSYSCALL && INOTIFY
|
||||||
|
|
||||||
|
menu "RCU Subsystem"
|
||||||
|
|
||||||
|
choice
|
||||||
|
prompt "RCU Implementation"
|
||||||
|
default CLASSIC_RCU
|
||||||
|
|
||||||
|
config CLASSIC_RCU
|
||||||
|
bool "Classic RCU"
|
||||||
|
help
|
||||||
|
This option selects the classic RCU implementation that is
|
||||||
|
designed for best read-side performance on non-realtime
|
||||||
|
systems.
|
||||||
|
|
||||||
|
Select this option if you are unsure.
|
||||||
|
|
||||||
|
config TREE_RCU
|
||||||
|
bool "Tree-based hierarchical RCU"
|
||||||
|
help
|
||||||
|
This option selects the RCU implementation that is
|
||||||
|
designed for very large SMP system with hundreds or
|
||||||
|
thousands of CPUs.
|
||||||
|
|
||||||
|
config PREEMPT_RCU
|
||||||
|
bool "Preemptible RCU"
|
||||||
|
depends on PREEMPT
|
||||||
|
help
|
||||||
|
This option reduces the latency of the kernel by making certain
|
||||||
|
RCU sections preemptible. Normally RCU code is non-preemptible, if
|
||||||
|
this option is selected then read-only RCU sections become
|
||||||
|
preemptible. This helps latency, but may expose bugs due to
|
||||||
|
now-naive assumptions about each RCU read-side critical section
|
||||||
|
remaining on a given CPU through its execution.
|
||||||
|
|
||||||
|
endchoice
|
||||||
|
|
||||||
|
config RCU_TRACE
|
||||||
|
bool "Enable tracing for RCU"
|
||||||
|
depends on TREE_RCU || PREEMPT_RCU
|
||||||
|
help
|
||||||
|
This option provides tracing in RCU which presents stats
|
||||||
|
in debugfs for debugging RCU implementation.
|
||||||
|
|
||||||
|
Say Y here if you want to enable RCU tracing
|
||||||
|
Say N if you are unsure.
|
||||||
|
|
||||||
|
config RCU_FANOUT
|
||||||
|
int "Tree-based hierarchical RCU fanout value"
|
||||||
|
range 2 64 if 64BIT
|
||||||
|
range 2 32 if !64BIT
|
||||||
|
depends on TREE_RCU
|
||||||
|
default 64 if 64BIT
|
||||||
|
default 32 if !64BIT
|
||||||
|
help
|
||||||
|
This option controls the fanout of hierarchical implementations
|
||||||
|
of RCU, allowing RCU to work efficiently on machines with
|
||||||
|
large numbers of CPUs. This value must be at least the cube
|
||||||
|
root of NR_CPUS, which allows NR_CPUS up to 32,768 for 32-bit
|
||||||
|
systems and up to 262,144 for 64-bit systems.
|
||||||
|
|
||||||
|
Select a specific number if testing RCU itself.
|
||||||
|
Take the default if unsure.
|
||||||
|
|
||||||
|
config RCU_FANOUT_EXACT
|
||||||
|
bool "Disable tree-based hierarchical RCU auto-balancing"
|
||||||
|
depends on TREE_RCU
|
||||||
|
default n
|
||||||
|
help
|
||||||
|
This option forces use of the exact RCU_FANOUT value specified,
|
||||||
|
regardless of imbalances in the hierarchy. This is useful for
|
||||||
|
testing RCU itself, and might one day be useful on systems with
|
||||||
|
strong NUMA behavior.
|
||||||
|
|
||||||
|
Without RCU_FANOUT_EXACT, the code will balance the hierarchy.
|
||||||
|
|
||||||
|
Say N if unsure.
|
||||||
|
|
||||||
|
config TREE_RCU_TRACE
|
||||||
|
def_bool RCU_TRACE && TREE_RCU
|
||||||
|
select DEBUG_FS
|
||||||
|
help
|
||||||
|
This option provides tracing for the TREE_RCU implementation,
|
||||||
|
permitting Makefile to trivially select kernel/rcutree_trace.c.
|
||||||
|
|
||||||
|
config PREEMPT_RCU_TRACE
|
||||||
|
def_bool RCU_TRACE && PREEMPT_RCU
|
||||||
|
select DEBUG_FS
|
||||||
|
help
|
||||||
|
This option provides tracing for the PREEMPT_RCU implementation,
|
||||||
|
permitting Makefile to trivially select kernel/rcupreempt_trace.c.
|
||||||
|
|
||||||
|
endmenu # "RCU Subsystem"
|
||||||
|
|
||||||
config IKCONFIG
|
config IKCONFIG
|
||||||
tristate "Kernel .config support"
|
tristate "Kernel .config support"
|
||||||
---help---
|
---help---
|
||||||
@ -972,90 +1064,3 @@ source "block/Kconfig"
|
|||||||
config PREEMPT_NOTIFIERS
|
config PREEMPT_NOTIFIERS
|
||||||
bool
|
bool
|
||||||
|
|
||||||
choice
|
|
||||||
prompt "RCU Implementation"
|
|
||||||
default CLASSIC_RCU
|
|
||||||
|
|
||||||
config CLASSIC_RCU
|
|
||||||
bool "Classic RCU"
|
|
||||||
help
|
|
||||||
This option selects the classic RCU implementation that is
|
|
||||||
designed for best read-side performance on non-realtime
|
|
||||||
systems.
|
|
||||||
|
|
||||||
Select this option if you are unsure.
|
|
||||||
|
|
||||||
config TREE_RCU
|
|
||||||
bool "Tree-based hierarchical RCU"
|
|
||||||
help
|
|
||||||
This option selects the RCU implementation that is
|
|
||||||
designed for very large SMP system with hundreds or
|
|
||||||
thousands of CPUs.
|
|
||||||
|
|
||||||
config PREEMPT_RCU
|
|
||||||
bool "Preemptible RCU"
|
|
||||||
depends on PREEMPT
|
|
||||||
help
|
|
||||||
This option reduces the latency of the kernel by making certain
|
|
||||||
RCU sections preemptible. Normally RCU code is non-preemptible, if
|
|
||||||
this option is selected then read-only RCU sections become
|
|
||||||
preemptible. This helps latency, but may expose bugs due to
|
|
||||||
now-naive assumptions about each RCU read-side critical section
|
|
||||||
remaining on a given CPU through its execution.
|
|
||||||
|
|
||||||
endchoice
|
|
||||||
|
|
||||||
config RCU_TRACE
|
|
||||||
bool "Enable tracing for RCU"
|
|
||||||
depends on TREE_RCU || PREEMPT_RCU
|
|
||||||
help
|
|
||||||
This option provides tracing in RCU which presents stats
|
|
||||||
in debugfs for debugging RCU implementation.
|
|
||||||
|
|
||||||
Say Y here if you want to enable RCU tracing
|
|
||||||
Say N if you are unsure.
|
|
||||||
|
|
||||||
config RCU_FANOUT
|
|
||||||
int "Tree-based hierarchical RCU fanout value"
|
|
||||||
range 2 64 if 64BIT
|
|
||||||
range 2 32 if !64BIT
|
|
||||||
depends on TREE_RCU
|
|
||||||
default 64 if 64BIT
|
|
||||||
default 32 if !64BIT
|
|
||||||
help
|
|
||||||
This option controls the fanout of hierarchical implementations
|
|
||||||
of RCU, allowing RCU to work efficiently on machines with
|
|
||||||
large numbers of CPUs. This value must be at least the cube
|
|
||||||
root of NR_CPUS, which allows NR_CPUS up to 32,768 for 32-bit
|
|
||||||
systems and up to 262,144 for 64-bit systems.
|
|
||||||
|
|
||||||
Select a specific number if testing RCU itself.
|
|
||||||
Take the default if unsure.
|
|
||||||
|
|
||||||
config RCU_FANOUT_EXACT
|
|
||||||
bool "Disable tree-based hierarchical RCU auto-balancing"
|
|
||||||
depends on TREE_RCU
|
|
||||||
default n
|
|
||||||
help
|
|
||||||
This option forces use of the exact RCU_FANOUT value specified,
|
|
||||||
regardless of imbalances in the hierarchy. This is useful for
|
|
||||||
testing RCU itself, and might one day be useful on systems with
|
|
||||||
strong NUMA behavior.
|
|
||||||
|
|
||||||
Without RCU_FANOUT_EXACT, the code will balance the hierarchy.
|
|
||||||
|
|
||||||
Say N if unsure.
|
|
||||||
|
|
||||||
config TREE_RCU_TRACE
|
|
||||||
def_bool RCU_TRACE && TREE_RCU
|
|
||||||
select DEBUG_FS
|
|
||||||
help
|
|
||||||
This option provides tracing for the TREE_RCU implementation,
|
|
||||||
permitting Makefile to trivially select kernel/rcutree_trace.c.
|
|
||||||
|
|
||||||
config PREEMPT_RCU_TRACE
|
|
||||||
def_bool RCU_TRACE && PREEMPT_RCU
|
|
||||||
select DEBUG_FS
|
|
||||||
help
|
|
||||||
This option provides tracing for the PREEMPT_RCU implementation,
|
|
||||||
permitting Makefile to trivially select kernel/rcupreempt_trace.c.
|
|
||||||
|
@ -716,7 +716,7 @@ void rcu_check_callbacks(int cpu, int user)
|
|||||||
raise_rcu_softirq();
|
raise_rcu_softirq();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rcu_init_percpu_data(int cpu, struct rcu_ctrlblk *rcp,
|
static void __cpuinit rcu_init_percpu_data(int cpu, struct rcu_ctrlblk *rcp,
|
||||||
struct rcu_data *rdp)
|
struct rcu_data *rdp)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
@ -1314,7 +1314,7 @@ int rcu_needs_cpu(int cpu)
|
|||||||
* access due to the fact that this CPU cannot possibly have any RCU
|
* access due to the fact that this CPU cannot possibly have any RCU
|
||||||
* callbacks in flight yet.
|
* callbacks in flight yet.
|
||||||
*/
|
*/
|
||||||
static void
|
static void __cpuinit
|
||||||
rcu_init_percpu_data(int cpu, struct rcu_state *rsp)
|
rcu_init_percpu_data(int cpu, struct rcu_state *rsp)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
@ -663,8 +663,10 @@ int relay_late_setup_files(struct rchan *chan,
|
|||||||
|
|
||||||
mutex_lock(&relay_channels_mutex);
|
mutex_lock(&relay_channels_mutex);
|
||||||
/* Is chan already set up? */
|
/* Is chan already set up? */
|
||||||
if (unlikely(chan->has_base_filename))
|
if (unlikely(chan->has_base_filename)) {
|
||||||
|
mutex_unlock(&relay_channels_mutex);
|
||||||
return -EEXIST;
|
return -EEXIST;
|
||||||
|
}
|
||||||
chan->has_base_filename = 1;
|
chan->has_base_filename = 1;
|
||||||
chan->parent = parent;
|
chan->parent = parent;
|
||||||
curr_cpu = get_cpu();
|
curr_cpu = get_cpu();
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
#include <linux/lockdep.h>
|
#include <linux/lockdep.h>
|
||||||
#include <linux/notifier.h>
|
#include <linux/notifier.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
|
#include <linux/sysctl.h>
|
||||||
|
|
||||||
#include <asm/irq_regs.h>
|
#include <asm/irq_regs.h>
|
||||||
|
|
||||||
@ -88,6 +89,14 @@ void touch_all_softlockup_watchdogs(void)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(touch_all_softlockup_watchdogs);
|
EXPORT_SYMBOL(touch_all_softlockup_watchdogs);
|
||||||
|
|
||||||
|
int proc_dosoftlockup_thresh(struct ctl_table *table, int write,
|
||||||
|
struct file *filp, void __user *buffer,
|
||||||
|
size_t *lenp, loff_t *ppos)
|
||||||
|
{
|
||||||
|
touch_all_softlockup_watchdogs();
|
||||||
|
return proc_dointvec_minmax(table, write, filp, buffer, lenp, ppos);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This callback runs from the timer interrupt, and checks
|
* This callback runs from the timer interrupt, and checks
|
||||||
* whether the watchdog thread has hung or not:
|
* whether the watchdog thread has hung or not:
|
||||||
|
@ -809,7 +809,7 @@ static struct ctl_table kern_table[] = {
|
|||||||
.data = &softlockup_thresh,
|
.data = &softlockup_thresh,
|
||||||
.maxlen = sizeof(int),
|
.maxlen = sizeof(int),
|
||||||
.mode = 0644,
|
.mode = 0644,
|
||||||
.proc_handler = &proc_dointvec_minmax,
|
.proc_handler = &proc_dosoftlockup_thresh,
|
||||||
.strategy = &sysctl_intvec,
|
.strategy = &sysctl_intvec,
|
||||||
.extra1 = &neg_one,
|
.extra1 = &neg_one,
|
||||||
.extra2 = &sixty,
|
.extra2 = &sixty,
|
||||||
|
@ -640,19 +640,6 @@ config RCU_TORTURE_TEST_RUNNABLE
|
|||||||
Say N here if you want the RCU torture tests to start only
|
Say N here if you want the RCU torture tests to start only
|
||||||
after being manually enabled via /proc.
|
after being manually enabled via /proc.
|
||||||
|
|
||||||
config RCU_CPU_STALL_DETECTOR
|
|
||||||
bool "Check for stalled CPUs delaying RCU grace periods"
|
|
||||||
depends on CLASSIC_RCU
|
|
||||||
default n
|
|
||||||
help
|
|
||||||
This option causes RCU to printk information on which
|
|
||||||
CPUs are delaying the current grace period, but only when
|
|
||||||
the grace period extends for excessive time periods.
|
|
||||||
|
|
||||||
Say Y if you want RCU to perform such checks.
|
|
||||||
|
|
||||||
Say N if you are unsure.
|
|
||||||
|
|
||||||
config RCU_CPU_STALL_DETECTOR
|
config RCU_CPU_STALL_DETECTOR
|
||||||
bool "Check for stalled CPUs delaying RCU grace periods"
|
bool "Check for stalled CPUs delaying RCU grace periods"
|
||||||
depends on CLASSIC_RCU || TREE_RCU
|
depends on CLASSIC_RCU || TREE_RCU
|
||||||
|
Loading…
Reference in New Issue
Block a user