[PATCH] lockdep: annotate i386 apm
Lockdep doesn't like to enable interrupts when they are enabled already. BUG: warning at kernel/lockdep.c:1814/trace_hardirqs_on() (Not tainted) [<c04051ed>] show_trace_log_lvl+0x58/0x16a [<c04057fa>] show_trace+0xd/0x10 [<c0405913>] dump_stack+0x19/0x1b [<c043abfb>] trace_hardirqs_on+0xa2/0x11e [<c041463c>] apm_bios_call_simple+0xcd/0xfd [<c0415242>] apm+0x92/0x5b1 [<c0402005>] kernel_thread_helper+0x5/0xb DWARF2 unwinder stuck at kernel_thread_helper+0x5/0xb Leftover inexact backtrace: [<c04057fa>] show_trace+0xd/0x10 [<c0405913>] dump_stack+0x19/0x1b [<c043abfb>] trace_hardirqs_on+0xa2/0x11e [<c041463c>] apm_bios_call_simple+0xcd/0xfd [<c0415242>] apm+0x92/0x5b1 [<c0402005>] kernel_thread_helper+0x5/0xb Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Stephen Rothwell <sfr@canb.auug.org.au> Cc: Ingo Molnar <mingo@elte.hu> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
committed by
Linus Torvalds
parent
6a15f46c12
commit
3864c4894a
@@ -540,12 +540,31 @@ static inline void apm_restore_cpus(cpumask_t mask)
|
|||||||
* Also, we KNOW that for the non error case of apm_bios_call, there
|
* Also, we KNOW that for the non error case of apm_bios_call, there
|
||||||
* is no useful data returned in the low order 8 bits of eax.
|
* is no useful data returned in the low order 8 bits of eax.
|
||||||
*/
|
*/
|
||||||
#define APM_DO_CLI \
|
|
||||||
if (apm_info.allow_ints) \
|
static inline unsigned long __apm_irq_save(void)
|
||||||
local_irq_enable(); \
|
{
|
||||||
else \
|
unsigned long flags;
|
||||||
|
local_save_flags(flags);
|
||||||
|
if (apm_info.allow_ints) {
|
||||||
|
if (irqs_disabled_flags(flags))
|
||||||
|
local_irq_enable();
|
||||||
|
} else
|
||||||
local_irq_disable();
|
local_irq_disable();
|
||||||
|
|
||||||
|
return flags;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define apm_irq_save(flags) \
|
||||||
|
do { flags = __apm_irq_save(); } while (0)
|
||||||
|
|
||||||
|
static inline void apm_irq_restore(unsigned long flags)
|
||||||
|
{
|
||||||
|
if (irqs_disabled_flags(flags))
|
||||||
|
local_irq_disable();
|
||||||
|
else if (irqs_disabled())
|
||||||
|
local_irq_enable();
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef APM_ZERO_SEGS
|
#ifdef APM_ZERO_SEGS
|
||||||
# define APM_DECL_SEGS \
|
# define APM_DECL_SEGS \
|
||||||
unsigned int saved_fs; unsigned int saved_gs;
|
unsigned int saved_fs; unsigned int saved_gs;
|
||||||
@@ -596,12 +615,11 @@ static u8 apm_bios_call(u32 func, u32 ebx_in, u32 ecx_in,
|
|||||||
save_desc_40 = gdt[0x40 / 8];
|
save_desc_40 = gdt[0x40 / 8];
|
||||||
gdt[0x40 / 8] = bad_bios_desc;
|
gdt[0x40 / 8] = bad_bios_desc;
|
||||||
|
|
||||||
local_save_flags(flags);
|
apm_irq_save(flags);
|
||||||
APM_DO_CLI;
|
|
||||||
APM_DO_SAVE_SEGS;
|
APM_DO_SAVE_SEGS;
|
||||||
apm_bios_call_asm(func, ebx_in, ecx_in, eax, ebx, ecx, edx, esi);
|
apm_bios_call_asm(func, ebx_in, ecx_in, eax, ebx, ecx, edx, esi);
|
||||||
APM_DO_RESTORE_SEGS;
|
APM_DO_RESTORE_SEGS;
|
||||||
local_irq_restore(flags);
|
apm_irq_restore(flags);
|
||||||
gdt[0x40 / 8] = save_desc_40;
|
gdt[0x40 / 8] = save_desc_40;
|
||||||
put_cpu();
|
put_cpu();
|
||||||
apm_restore_cpus(cpus);
|
apm_restore_cpus(cpus);
|
||||||
@@ -640,12 +658,11 @@ static u8 apm_bios_call_simple(u32 func, u32 ebx_in, u32 ecx_in, u32 *eax)
|
|||||||
save_desc_40 = gdt[0x40 / 8];
|
save_desc_40 = gdt[0x40 / 8];
|
||||||
gdt[0x40 / 8] = bad_bios_desc;
|
gdt[0x40 / 8] = bad_bios_desc;
|
||||||
|
|
||||||
local_save_flags(flags);
|
apm_irq_save(flags);
|
||||||
APM_DO_CLI;
|
|
||||||
APM_DO_SAVE_SEGS;
|
APM_DO_SAVE_SEGS;
|
||||||
error = apm_bios_call_simple_asm(func, ebx_in, ecx_in, eax);
|
error = apm_bios_call_simple_asm(func, ebx_in, ecx_in, eax);
|
||||||
APM_DO_RESTORE_SEGS;
|
APM_DO_RESTORE_SEGS;
|
||||||
local_irq_restore(flags);
|
apm_irq_restore(flags);
|
||||||
gdt[0x40 / 8] = save_desc_40;
|
gdt[0x40 / 8] = save_desc_40;
|
||||||
put_cpu();
|
put_cpu();
|
||||||
apm_restore_cpus(cpus);
|
apm_restore_cpus(cpus);
|
||||||
|
Reference in New Issue
Block a user