Commit 15096ffceabb9693306982127348890886384aaa
Committed by
Avi Kivity
1 parent
e6d53e3b0d
Exists in
master
and in
39 other branches
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
virt/kvm/async_pf.c
... | ... | @@ -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, |