x86: fix breakage of vSMP irq operations

25-rc* stopped working with CONFIG_X86_VSMP on vSMP machines.

Looks like the vsmp irq ops got accidentally removed during merge of x86_64
pvops in 2.6.25. -- commit 6abcd98ffa removed
vsmp irq ops.

Tested with both CONFIG_X86_VSMP and without CONFIG_X86_VSMP, on vSMP and non
vSMP x86_64 machines.

Please apply.

Signed-off-by: Ravikiran Thirumalai <kiran@scalex86.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
Ravikiran G Thirumalai 2008-04-04 03:06:29 -07:00 committed by Ingo Molnar
parent 9c9b81f773
commit bae1d2507e

View File

@ -70,6 +70,26 @@ static inline void raw_local_irq_restore(unsigned long flags)
native_restore_fl(flags); native_restore_fl(flags);
} }
#ifdef CONFIG_X86_VSMP
/*
* Interrupt control for the VSMP architecture:
*/
static inline void raw_local_irq_disable(void)
{
unsigned long flags = __raw_local_save_flags();
raw_local_irq_restore((flags & ~X86_EFLAGS_IF) | X86_EFLAGS_AC);
}
static inline void raw_local_irq_enable(void)
{
unsigned long flags = __raw_local_save_flags();
raw_local_irq_restore((flags | X86_EFLAGS_IF) & (~X86_EFLAGS_AC));
}
#else
static inline void raw_local_irq_disable(void) static inline void raw_local_irq_disable(void)
{ {
native_irq_disable(); native_irq_disable();
@ -80,6 +100,8 @@ static inline void raw_local_irq_enable(void)
native_irq_enable(); native_irq_enable();
} }
#endif
/* /*
* Used in the idle loop; sti takes one instruction cycle * Used in the idle loop; sti takes one instruction cycle
* to complete: * to complete:
@ -137,10 +159,17 @@ static inline unsigned long __raw_local_irq_save(void)
#define raw_local_irq_save(flags) \ #define raw_local_irq_save(flags) \
do { (flags) = __raw_local_irq_save(); } while (0) do { (flags) = __raw_local_irq_save(); } while (0)
#ifdef CONFIG_X86_VSMP
static inline int raw_irqs_disabled_flags(unsigned long flags)
{
return !(flags & X86_EFLAGS_IF) || (flags & X86_EFLAGS_AC);
}
#else
static inline int raw_irqs_disabled_flags(unsigned long flags) static inline int raw_irqs_disabled_flags(unsigned long flags)
{ {
return !(flags & X86_EFLAGS_IF); return !(flags & X86_EFLAGS_IF);
} }
#endif
static inline int raw_irqs_disabled(void) static inline int raw_irqs_disabled(void)
{ {