async_pf.c 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * kvm asynchronous fault support
  4. *
  5. * Copyright 2010 Red Hat, Inc.
  6. *
  7. * Author:
  8. * Gleb Natapov <[email protected]>
  9. */
  10. #include <linux/kvm_host.h>
  11. #include <linux/slab.h>
  12. #include <linux/module.h>
  13. #include <linux/mmu_context.h>
  14. #include <linux/sched/mm.h>
  15. #include "async_pf.h"
  16. #include <trace/events/kvm.h>
  17. static struct kmem_cache *async_pf_cache;
  18. int kvm_async_pf_init(void)
  19. {
  20. async_pf_cache = KMEM_CACHE(kvm_async_pf, 0);
  21. if (!async_pf_cache)
  22. return -ENOMEM;
  23. return 0;
  24. }
  25. void kvm_async_pf_deinit(void)
  26. {
  27. kmem_cache_destroy(async_pf_cache);
  28. async_pf_cache = NULL;
  29. }
  30. void kvm_async_pf_vcpu_init(struct kvm_vcpu *vcpu)
  31. {
  32. INIT_LIST_HEAD(&vcpu->async_pf.done);
  33. INIT_LIST_HEAD(&vcpu->async_pf.queue);
  34. spin_lock_init(&vcpu->async_pf.lock);
  35. }
  36. static void async_pf_execute(struct work_struct *work)
  37. {
  38. struct kvm_async_pf *apf =
  39. container_of(work, struct kvm_async_pf, work);
  40. struct mm_struct *mm = apf->mm;
  41. struct kvm_vcpu *vcpu = apf->vcpu;
  42. unsigned long addr = apf->addr;
  43. gpa_t cr2_or_gpa = apf->cr2_or_gpa;
  44. int locked = 1;
  45. bool first;
  46. might_sleep();
  47. /*
  48. * This work is run asynchronously to the task which owns
  49. * mm and might be done in another context, so we must
  50. * access remotely.
  51. */
  52. mmap_read_lock(mm);
  53. get_user_pages_remote(mm, addr, 1, FOLL_WRITE, NULL, NULL,
  54. &locked);
  55. if (locked)
  56. mmap_read_unlock(mm);
  57. if (IS_ENABLED(CONFIG_KVM_ASYNC_PF_SYNC))
  58. kvm_arch_async_page_present(vcpu, apf);
  59. spin_lock(&vcpu->async_pf.lock);
  60. first = list_empty(&vcpu->async_pf.done);
  61. list_add_tail(&apf->link, &vcpu->async_pf.done);
  62. apf->vcpu = NULL;
  63. spin_unlock(&vcpu->async_pf.lock);
  64. if (!IS_ENABLED(CONFIG_KVM_ASYNC_PF_SYNC) && first)
  65. kvm_arch_async_page_present_queued(vcpu);
  66. /*
  67. * apf may be freed by kvm_check_async_pf_completion() after
  68. * this point
  69. */
  70. trace_kvm_async_pf_completed(addr, cr2_or_gpa);
  71. __kvm_vcpu_wake_up(vcpu);
  72. mmput(mm);
  73. kvm_put_kvm(vcpu->kvm);
  74. }
  75. void kvm_clear_async_pf_completion_queue(struct kvm_vcpu *vcpu)
  76. {
  77. spin_lock(&vcpu->async_pf.lock);
  78. /* cancel outstanding work queue item */
  79. while (!list_empty(&vcpu->async_pf.queue)) {
  80. struct kvm_async_pf *work =
  81. list_first_entry(&vcpu->async_pf.queue,
  82. typeof(*work), queue);
  83. list_del(&work->queue);
  84. /*
  85. * We know it's present in vcpu->async_pf.done, do
  86. * nothing here.
  87. */
  88. if (!work->vcpu)
  89. continue;
  90. spin_unlock(&vcpu->async_pf.lock);
  91. #ifdef CONFIG_KVM_ASYNC_PF_SYNC
  92. flush_work(&work->work);
  93. #else
  94. if (cancel_work_sync(&work->work)) {
  95. mmput(work->mm);
  96. kvm_put_kvm(vcpu->kvm); /* == work->vcpu->kvm */
  97. kmem_cache_free(async_pf_cache, work);
  98. }
  99. #endif
  100. spin_lock(&vcpu->async_pf.lock);
  101. }
  102. while (!list_empty(&vcpu->async_pf.done)) {
  103. struct kvm_async_pf *work =
  104. list_first_entry(&vcpu->async_pf.done,
  105. typeof(*work), link);
  106. list_del(&work->link);
  107. kmem_cache_free(async_pf_cache, work);
  108. }
  109. spin_unlock(&vcpu->async_pf.lock);
  110. vcpu->async_pf.queued = 0;
  111. }
  112. void kvm_check_async_pf_completion(struct kvm_vcpu *vcpu)
  113. {
  114. struct kvm_async_pf *work;
  115. while (!list_empty_careful(&vcpu->async_pf.done) &&
  116. kvm_arch_can_dequeue_async_page_present(vcpu)) {
  117. spin_lock(&vcpu->async_pf.lock);
  118. work = list_first_entry(&vcpu->async_pf.done, typeof(*work),
  119. link);
  120. list_del(&work->link);
  121. spin_unlock(&vcpu->async_pf.lock);
  122. kvm_arch_async_page_ready(vcpu, work);
  123. if (!IS_ENABLED(CONFIG_KVM_ASYNC_PF_SYNC))
  124. kvm_arch_async_page_present(vcpu, work);
  125. list_del(&work->queue);
  126. vcpu->async_pf.queued--;
  127. kmem_cache_free(async_pf_cache, work);
  128. }
  129. }
  130. /*
  131. * Try to schedule a job to handle page fault asynchronously. Returns 'true' on
  132. * success, 'false' on failure (page fault has to be handled synchronously).
  133. */
  134. bool kvm_setup_async_pf(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa,
  135. unsigned long hva, struct kvm_arch_async_pf *arch)
  136. {
  137. struct kvm_async_pf *work;
  138. if (vcpu->async_pf.queued >= ASYNC_PF_PER_VCPU)
  139. return false;
  140. /* Arch specific code should not do async PF in this case */
  141. if (unlikely(kvm_is_error_hva(hva)))
  142. return false;
  143. /*
  144. * do alloc nowait since if we are going to sleep anyway we
  145. * may as well sleep faulting in page
  146. */
  147. work = kmem_cache_zalloc(async_pf_cache, GFP_NOWAIT | __GFP_NOWARN);
  148. if (!work)
  149. return false;
  150. work->wakeup_all = false;
  151. work->vcpu = vcpu;
  152. work->cr2_or_gpa = cr2_or_gpa;
  153. work->addr = hva;
  154. work->arch = *arch;
  155. work->mm = current->mm;
  156. mmget(work->mm);
  157. kvm_get_kvm(work->vcpu->kvm);
  158. INIT_WORK(&work->work, async_pf_execute);
  159. list_add_tail(&work->queue, &vcpu->async_pf.queue);
  160. vcpu->async_pf.queued++;
  161. work->notpresent_injected = kvm_arch_async_page_not_present(vcpu, work);
  162. schedule_work(&work->work);
  163. return true;
  164. }
  165. int kvm_async_pf_wakeup_all(struct kvm_vcpu *vcpu)
  166. {
  167. struct kvm_async_pf *work;
  168. bool first;
  169. if (!list_empty_careful(&vcpu->async_pf.done))
  170. return 0;
  171. work = kmem_cache_zalloc(async_pf_cache, GFP_ATOMIC);
  172. if (!work)
  173. return -ENOMEM;
  174. work->wakeup_all = true;
  175. INIT_LIST_HEAD(&work->queue); /* for list_del to work */
  176. spin_lock(&vcpu->async_pf.lock);
  177. first = list_empty(&vcpu->async_pf.done);
  178. list_add_tail(&work->link, &vcpu->async_pf.done);
  179. spin_unlock(&vcpu->async_pf.lock);
  180. if (!IS_ENABLED(CONFIG_KVM_ASYNC_PF_SYNC) && first)
  181. kvm_arch_async_page_present_queued(vcpu);
  182. vcpu->async_pf.queued++;
  183. return 0;
  184. }