Skip to content

Commit

Permalink
Merge branch 'core-fixes-for-linus' of git://git.kernel.org/pub/scm/l…
Browse files Browse the repository at this point in the history
…inux/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:
  smp: Allow on_each_cpu() to be called while early_boot_irqs_disabled status to init/main.c
  lockdep: Move early boot local IRQ enable/disable status to init/main.c
  • Loading branch information
torvalds committed Jan 21, 2011
2 parents d551d81 + bd924e8 commit 2b1caf6
Show file tree
Hide file tree
Showing 7 changed files with 22 additions and 40 deletions.
2 changes: 1 addition & 1 deletion arch/x86/xen/enlighten.c
Original file line number Diff line number Diff line change
Expand Up @@ -1194,7 +1194,7 @@ asmlinkage void __init xen_start_kernel(void)
per_cpu(xen_vcpu, 0) = &HYPERVISOR_shared_info->vcpu_info[0];

local_irq_disable();
early_boot_irqs_off();
early_boot_irqs_disabled = true;

memblock_init();

Expand Down
2 changes: 2 additions & 0 deletions include/linux/kernel.h
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,8 @@ extern int test_taint(unsigned flag);
extern unsigned long get_taint(void);
extern int root_mountflags;

extern bool early_boot_irqs_disabled;

/* Values used for system_state */
extern enum system_states {
SYSTEM_BOOTING,
Expand Down
8 changes: 0 additions & 8 deletions include/linux/lockdep.h
Original file line number Diff line number Diff line change
Expand Up @@ -436,16 +436,8 @@ do { \
#endif /* CONFIG_LOCKDEP */

#ifdef CONFIG_TRACE_IRQFLAGS
extern void early_boot_irqs_off(void);
extern void early_boot_irqs_on(void);
extern void print_irqtrace_events(struct task_struct *curr);
#else
static inline void early_boot_irqs_off(void)
{
}
static inline void early_boot_irqs_on(void)
{
}
static inline void print_irqtrace_events(struct task_struct *curr)
{
}
Expand Down
13 changes: 11 additions & 2 deletions init/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,15 @@ static inline void mark_rodata_ro(void) { }
extern void tc_init(void);
#endif

/*
* Debug helper: via this flag we know that we are in 'early bootup code'
* where only the boot processor is running with IRQ disabled. This means
* two things - IRQ must not be enabled before the flag is cleared and some
* operations which are not allowed with IRQ disabled are allowed while the
* flag is set.
*/
bool early_boot_irqs_disabled __read_mostly;

enum system_states system_state __read_mostly;
EXPORT_SYMBOL(system_state);

Expand Down Expand Up @@ -554,7 +563,7 @@ asmlinkage void __init start_kernel(void)
cgroup_init_early();

local_irq_disable();
early_boot_irqs_off();
early_boot_irqs_disabled = true;

/*
* Interrupts are still disabled. Do necessary setups, then
Expand Down Expand Up @@ -621,7 +630,7 @@ asmlinkage void __init start_kernel(void)
if (!irqs_disabled())
printk(KERN_CRIT "start_kernel(): bug: interrupts were "
"enabled early\n");
early_boot_irqs_on();
early_boot_irqs_disabled = false;
local_irq_enable();

/* Interrupts are enabled now so all GFP allocations are safe. */
Expand Down
18 changes: 1 addition & 17 deletions kernel/lockdep.c
Original file line number Diff line number Diff line change
Expand Up @@ -2291,22 +2291,6 @@ mark_held_locks(struct task_struct *curr, enum mark_type mark)
return 1;
}

/*
* Debugging helper: via this flag we know that we are in
* 'early bootup code', and will warn about any invalid irqs-on event:
*/
static int early_boot_irqs_enabled;

void early_boot_irqs_off(void)
{
early_boot_irqs_enabled = 0;
}

void early_boot_irqs_on(void)
{
early_boot_irqs_enabled = 1;
}

/*
* Hardirqs will be enabled:
*/
Expand All @@ -2319,7 +2303,7 @@ void trace_hardirqs_on_caller(unsigned long ip)
if (unlikely(!debug_locks || current->lockdep_recursion))
return;

if (DEBUG_LOCKS_WARN_ON(unlikely(!early_boot_irqs_enabled)))
if (DEBUG_LOCKS_WARN_ON(unlikely(early_boot_irqs_disabled)))
return;

if (unlikely(curr->hardirqs_enabled)) {
Expand Down
11 changes: 7 additions & 4 deletions kernel/smp.c
Original file line number Diff line number Diff line change
Expand Up @@ -459,7 +459,7 @@ void smp_call_function_many(const struct cpumask *mask,
* can't happen.
*/
WARN_ON_ONCE(cpu_online(this_cpu) && irqs_disabled()
&& !oops_in_progress);
&& !oops_in_progress && !early_boot_irqs_disabled);

/* So, what's a CPU they want? Ignoring this one. */
cpu = cpumask_first_and(mask, cpu_online_mask);
Expand Down Expand Up @@ -572,17 +572,20 @@ void ipi_call_unlock_irq(void)
#endif /* USE_GENERIC_SMP_HELPERS */

/*
* Call a function on all processors
* Call a function on all processors. May be used during early boot while
* early_boot_irqs_disabled is set. Use local_irq_save/restore() instead
* of local_irq_disable/enable().
*/
int on_each_cpu(void (*func) (void *info), void *info, int wait)
{
unsigned long flags;
int ret = 0;

preempt_disable();
ret = smp_call_function(func, info, wait);
local_irq_disable();
local_irq_save(flags);
func(info);
local_irq_enable();
local_irq_restore(flags);
preempt_enable();
return ret;
}
Expand Down
8 changes: 0 additions & 8 deletions kernel/trace/trace_irqsoff.c
Original file line number Diff line number Diff line change
Expand Up @@ -453,14 +453,6 @@ void time_hardirqs_off(unsigned long a0, unsigned long a1)
* Stubs:
*/

void early_boot_irqs_off(void)
{
}

void early_boot_irqs_on(void)
{
}

void trace_softirqs_on(unsigned long ip)
{
}
Expand Down

0 comments on commit 2b1caf6

Please sign in to comment.