diff options
author | Avi Kivity <avi@qumranet.com> | 2008-01-15 11:27:32 -0500 |
---|---|---|
committer | Avi Kivity <avi@qumranet.com> | 2008-01-30 11:01:22 -0500 |
commit | 6c14280125a374d4c279a68276f97245e03e3f68 (patch) | |
tree | 9a562a81927810f5e1ef38b05c109129a19b93cd /arch/x86/kvm/x86.c | |
parent | 97db56ce6cc2a0766b536cc227a1da20acc5d82f (diff) |
KVM: Fix unbounded preemption latency
When preparing to enter the guest, if an interrupt comes in while
preemption is disabled but interrupts are still enabled, we miss a
preemption point. Fix by explicitly checking whether we need to
reschedule.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Avi Kivity <avi@qumranet.com>
Diffstat (limited to 'arch/x86/kvm/x86.c')
-rw-r--r-- | arch/x86/kvm/x86.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 77d57ff3d74e..f0493e7dcf0c 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c | |||
@@ -2535,6 +2535,13 @@ again: | |||
2535 | 2535 | ||
2536 | local_irq_disable(); | 2536 | local_irq_disable(); |
2537 | 2537 | ||
2538 | if (need_resched()) { | ||
2539 | local_irq_enable(); | ||
2540 | preempt_enable(); | ||
2541 | r = 1; | ||
2542 | goto out; | ||
2543 | } | ||
2544 | |||
2538 | if (signal_pending(current)) { | 2545 | if (signal_pending(current)) { |
2539 | local_irq_enable(); | 2546 | local_irq_enable(); |
2540 | preempt_enable(); | 2547 | preempt_enable(); |