|
@@ -71,15 +71,20 @@ static inline void wd_smp_lock(unsigned long *flags)
|
|
* This may be called from low level interrupt handlers at some
|
|
* This may be called from low level interrupt handlers at some
|
|
* point in future.
|
|
* point in future.
|
|
*/
|
|
*/
|
|
- local_irq_save(*flags);
|
|
|
|
- while (unlikely(test_and_set_bit_lock(0, &__wd_smp_lock)))
|
|
|
|
- cpu_relax();
|
|
|
|
|
|
+ raw_local_irq_save(*flags);
|
|
|
|
+ hard_irq_disable(); /* Make it soft-NMI safe */
|
|
|
|
+ while (unlikely(test_and_set_bit_lock(0, &__wd_smp_lock))) {
|
|
|
|
+ raw_local_irq_restore(*flags);
|
|
|
|
+ spin_until_cond(!test_bit(0, &__wd_smp_lock));
|
|
|
|
+ raw_local_irq_save(*flags);
|
|
|
|
+ hard_irq_disable();
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
static inline void wd_smp_unlock(unsigned long *flags)
|
|
static inline void wd_smp_unlock(unsigned long *flags)
|
|
{
|
|
{
|
|
clear_bit_unlock(0, &__wd_smp_lock);
|
|
clear_bit_unlock(0, &__wd_smp_lock);
|
|
- local_irq_restore(*flags);
|
|
|
|
|
|
+ raw_local_irq_restore(*flags);
|
|
}
|
|
}
|
|
|
|
|
|
static void wd_lockup_ipi(struct pt_regs *regs)
|
|
static void wd_lockup_ipi(struct pt_regs *regs)
|