Commit 15096ffceabb9693306982127348890886384aaa

Authored by Xiao Guangrong
Committed by Avi Kivity
1 parent e6d53e3b0d

KVM: handle more completed apfs if possible

If it's no need to inject async #PF to PV guest we can handle
more completed apfs at one time, so we can retry guest #PF
as early as possible

Signed-off-by: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
Acked-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>

Showing 1 changed file with 16 additions and 16 deletions Side-by-side Diff

... ... @@ -124,24 +124,24 @@
124 124 {
125 125 struct kvm_async_pf *work;
126 126  
127   - if (list_empty_careful(&vcpu->async_pf.done) ||
128   - !kvm_arch_can_inject_async_page_present(vcpu))
129   - return;
  127 + while (!list_empty_careful(&vcpu->async_pf.done) &&
  128 + kvm_arch_can_inject_async_page_present(vcpu)) {
  129 + spin_lock(&vcpu->async_pf.lock);
  130 + work = list_first_entry(&vcpu->async_pf.done, typeof(*work),
  131 + link);
  132 + list_del(&work->link);
  133 + spin_unlock(&vcpu->async_pf.lock);
130 134  
131   - spin_lock(&vcpu->async_pf.lock);
132   - work = list_first_entry(&vcpu->async_pf.done, typeof(*work), link);
133   - list_del(&work->link);
134   - spin_unlock(&vcpu->async_pf.lock);
  135 + if (work->page)
  136 + kvm_arch_async_page_ready(vcpu, work);
  137 + kvm_arch_async_page_present(vcpu, work);
135 138  
136   - if (work->page)
137   - kvm_arch_async_page_ready(vcpu, work);
138   - kvm_arch_async_page_present(vcpu, work);
139   -
140   - list_del(&work->queue);
141   - vcpu->async_pf.queued--;
142   - if (work->page)
143   - put_page(work->page);
144   - kmem_cache_free(async_pf_cache, work);
  139 + list_del(&work->queue);
  140 + vcpu->async_pf.queued--;
  141 + if (work->page)
  142 + put_page(work->page);
  143 + kmem_cache_free(async_pf_cache, work);
  144 + }
145 145 }
146 146  
147 147 int kvm_setup_async_pf(struct kvm_vcpu *vcpu, gva_t gva, gfn_t gfn,