aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorGleb Natapov <gleb@redhat.com>2012-11-28 08:19:08 -0500
committerMarcelo Tosatti <mtosatti@redhat.com>2012-11-28 18:30:13 -0500
commit859f8450d8a334a7f7cb994e4676cf918deff832 (patch)
tree9092a37fc3c6b934705ad52380e5eadd35795a4e /arch
parentd98d07ca7e0347d712d54a865af323c4aee04bc2 (diff)
KVM: use is_idle_task() instead of idle_cpu() to decide when to halt in async_pf
As Frederic pointed idle_cpu() may return false even if async fault happened in the idle task if wake up is pending. In this case the code will try to put idle task to sleep. Fix this by using is_idle_task() to check for idle task. Reported-by: Frederic Weisbecker <fweisbec@gmail.com> Signed-off-by: Gleb Natapov <gleb@redhat.com> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/x86/kernel/kvm.c7
1 files changed, 1 insertions, 6 deletions
diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c
index a91c6b482b48..08b973f64032 100644
--- a/arch/x86/kernel/kvm.c
+++ b/arch/x86/kernel/kvm.c
@@ -120,11 +120,6 @@ void kvm_async_pf_task_wait(u32 token)
120 struct kvm_task_sleep_head *b = &async_pf_sleepers[key]; 120 struct kvm_task_sleep_head *b = &async_pf_sleepers[key];
121 struct kvm_task_sleep_node n, *e; 121 struct kvm_task_sleep_node n, *e;
122 DEFINE_WAIT(wait); 122 DEFINE_WAIT(wait);
123 int cpu, idle;
124
125 cpu = get_cpu();
126 idle = idle_cpu(cpu);
127 put_cpu();
128 123
129 spin_lock(&b->lock); 124 spin_lock(&b->lock);
130 e = _find_apf_task(b, token); 125 e = _find_apf_task(b, token);
@@ -138,7 +133,7 @@ void kvm_async_pf_task_wait(u32 token)
138 133
139 n.token = token; 134 n.token = token;
140 n.cpu = smp_processor_id(); 135 n.cpu = smp_processor_id();
141 n.halted = idle || preempt_count() > 1; 136 n.halted = is_idle_task(current) || preempt_count() > 1;
142 init_waitqueue_head(&n.wq); 137 init_waitqueue_head(&n.wq);
143 hlist_add_head(&n.link, &b->list); 138 hlist_add_head(&n.link, &b->list);
144 spin_unlock(&b->lock); 139 spin_unlock(&b->lock);