Commit 859f8450 authored by Gleb Natapov's avatar Gleb Natapov Committed by Marcelo Tosatti

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: default avatarFrederic Weisbecker <fweisbec@gmail.com>
Signed-off-by: default avatarGleb Natapov <gleb@redhat.com>
Signed-off-by: default avatarMarcelo Tosatti <mtosatti@redhat.com>
parent d98d07ca
...@@ -120,11 +120,6 @@ void kvm_async_pf_task_wait(u32 token) ...@@ -120,11 +120,6 @@ void kvm_async_pf_task_wait(u32 token)
struct kvm_task_sleep_head *b = &async_pf_sleepers[key]; struct kvm_task_sleep_head *b = &async_pf_sleepers[key];
struct kvm_task_sleep_node n, *e; struct kvm_task_sleep_node n, *e;
DEFINE_WAIT(wait); DEFINE_WAIT(wait);
int cpu, idle;
cpu = get_cpu();
idle = idle_cpu(cpu);
put_cpu();
spin_lock(&b->lock); spin_lock(&b->lock);
e = _find_apf_task(b, token); e = _find_apf_task(b, token);
...@@ -138,7 +133,7 @@ void kvm_async_pf_task_wait(u32 token) ...@@ -138,7 +133,7 @@ void kvm_async_pf_task_wait(u32 token)
n.token = token; n.token = token;
n.cpu = smp_processor_id(); n.cpu = smp_processor_id();
n.halted = idle || preempt_count() > 1; n.halted = is_idle_task(current) || preempt_count() > 1;
init_waitqueue_head(&n.wq); init_waitqueue_head(&n.wq);
hlist_add_head(&n.link, &b->list); hlist_add_head(&n.link, &b->list);
spin_unlock(&b->lock); spin_unlock(&b->lock);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment