mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-15 16:24:13 +08:00
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:
parent
9c9b81f773
commit
bae1d2507e
@ -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)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user