Lines Matching full:work

45 static void async_pf_execute(struct work_struct *work)  in async_pf_execute()  argument
48 container_of(work, struct kvm_async_pf, work); in async_pf_execute()
59 * This work is run asynchronously to the task which owns in async_pf_execute()
92 static void kvm_flush_and_free_async_pf_work(struct kvm_async_pf *work) in kvm_flush_and_free_async_pf_work() argument
95 * The async #PF is "done", but KVM must wait for the work item itself, in kvm_flush_and_free_async_pf_work()
98 * after the last call to module_put(). Note, flushing the work item in kvm_flush_and_free_async_pf_work()
104 * need to be flushed (but sanity check that the work wasn't queued). in kvm_flush_and_free_async_pf_work()
106 if (work->wakeup_all) in kvm_flush_and_free_async_pf_work()
107 WARN_ON_ONCE(work->work.func); in kvm_flush_and_free_async_pf_work()
109 flush_work(&work->work); in kvm_flush_and_free_async_pf_work()
110 kmem_cache_free(async_pf_cache, work); in kvm_flush_and_free_async_pf_work()
117 /* cancel outstanding work queue item */ in kvm_clear_async_pf_completion_queue()
119 struct kvm_async_pf *work = in kvm_clear_async_pf_completion_queue() local
121 typeof(*work), queue); in kvm_clear_async_pf_completion_queue()
122 list_del(&work->queue); in kvm_clear_async_pf_completion_queue()
128 if (!work->vcpu) in kvm_clear_async_pf_completion_queue()
133 flush_work(&work->work); in kvm_clear_async_pf_completion_queue()
135 if (cancel_work_sync(&work->work)) { in kvm_clear_async_pf_completion_queue()
136 mmput(work->mm); in kvm_clear_async_pf_completion_queue()
137 kmem_cache_free(async_pf_cache, work); in kvm_clear_async_pf_completion_queue()
144 struct kvm_async_pf *work = in kvm_clear_async_pf_completion_queue() local
146 typeof(*work), link); in kvm_clear_async_pf_completion_queue()
147 list_del(&work->link); in kvm_clear_async_pf_completion_queue()
150 kvm_flush_and_free_async_pf_work(work); in kvm_clear_async_pf_completion_queue()
160 struct kvm_async_pf *work; in kvm_check_async_pf_completion() local
165 work = list_first_entry(&vcpu->async_pf.done, typeof(*work), in kvm_check_async_pf_completion()
167 list_del(&work->link); in kvm_check_async_pf_completion()
170 kvm_arch_async_page_ready(vcpu, work); in kvm_check_async_pf_completion()
172 kvm_arch_async_page_present(vcpu, work); in kvm_check_async_pf_completion()
174 list_del(&work->queue); in kvm_check_async_pf_completion()
176 kvm_flush_and_free_async_pf_work(work); in kvm_check_async_pf_completion()
187 struct kvm_async_pf *work; in kvm_setup_async_pf() local
200 work = kmem_cache_zalloc(async_pf_cache, GFP_NOWAIT | __GFP_NOWARN); in kvm_setup_async_pf()
201 if (!work) in kvm_setup_async_pf()
204 work->wakeup_all = false; in kvm_setup_async_pf()
205 work->vcpu = vcpu; in kvm_setup_async_pf()
206 work->cr2_or_gpa = cr2_or_gpa; in kvm_setup_async_pf()
207 work->addr = hva; in kvm_setup_async_pf()
208 work->arch = *arch; in kvm_setup_async_pf()
209 work->mm = current->mm; in kvm_setup_async_pf()
210 mmget(work->mm); in kvm_setup_async_pf()
212 INIT_WORK(&work->work, async_pf_execute); in kvm_setup_async_pf()
214 list_add_tail(&work->queue, &vcpu->async_pf.queue); in kvm_setup_async_pf()
216 work->notpresent_injected = kvm_arch_async_page_not_present(vcpu, work); in kvm_setup_async_pf()
218 schedule_work(&work->work); in kvm_setup_async_pf()
225 struct kvm_async_pf *work; in kvm_async_pf_wakeup_all() local
231 work = kmem_cache_zalloc(async_pf_cache, GFP_ATOMIC); in kvm_async_pf_wakeup_all()
232 if (!work) in kvm_async_pf_wakeup_all()
235 work->wakeup_all = true; in kvm_async_pf_wakeup_all()
236 INIT_LIST_HEAD(&work->queue); /* for list_del to work */ in kvm_async_pf_wakeup_all()
240 list_add_tail(&work->link, &vcpu->async_pf.done); in kvm_async_pf_wakeup_all()