kvm_page_track.h 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #ifndef _ASM_X86_KVM_PAGE_TRACK_H
  2. #define _ASM_X86_KVM_PAGE_TRACK_H
  3. enum kvm_page_track_mode {
  4. KVM_PAGE_TRACK_WRITE,
  5. KVM_PAGE_TRACK_MAX,
  6. };
  7. /*
  8. * The notifier represented by @kvm_page_track_notifier_node is linked into
  9. * the head which will be notified when guest is triggering the track event.
  10. *
  11. * Write access on the head is protected by kvm->mmu_lock, read access
  12. * is protected by track_srcu.
  13. */
  14. struct kvm_page_track_notifier_head {
  15. struct srcu_struct track_srcu;
  16. struct hlist_head track_notifier_list;
  17. };
  18. struct kvm_page_track_notifier_node {
  19. struct hlist_node node;
  20. /*
  21. * It is called when guest is writing the write-tracked page
  22. * and write emulation is finished at that time.
  23. *
  24. * @vcpu: the vcpu where the write access happened.
  25. * @gpa: the physical address written by guest.
  26. * @new: the data was written to the address.
  27. * @bytes: the written length.
  28. * @node: this node
  29. */
  30. void (*track_write)(struct kvm_vcpu *vcpu, gpa_t gpa, const u8 *new,
  31. int bytes, struct kvm_page_track_notifier_node *node);
  32. /*
  33. * It is called when memory slot is being moved or removed
  34. * users can drop write-protection for the pages in that memory slot
  35. *
  36. * @kvm: the kvm where memory slot being moved or removed
  37. * @slot: the memory slot being moved or removed
  38. * @node: this node
  39. */
  40. void (*track_flush_slot)(struct kvm *kvm, struct kvm_memory_slot *slot,
  41. struct kvm_page_track_notifier_node *node);
  42. };
  43. void kvm_page_track_init(struct kvm *kvm);
  44. void kvm_page_track_cleanup(struct kvm *kvm);
  45. void kvm_page_track_free_memslot(struct kvm_memory_slot *free,
  46. struct kvm_memory_slot *dont);
  47. int kvm_page_track_create_memslot(struct kvm_memory_slot *slot,
  48. unsigned long npages);
  49. void kvm_slot_page_track_add_page(struct kvm *kvm,
  50. struct kvm_memory_slot *slot, gfn_t gfn,
  51. enum kvm_page_track_mode mode);
  52. void kvm_slot_page_track_remove_page(struct kvm *kvm,
  53. struct kvm_memory_slot *slot, gfn_t gfn,
  54. enum kvm_page_track_mode mode);
  55. bool kvm_page_track_is_active(struct kvm_vcpu *vcpu, gfn_t gfn,
  56. enum kvm_page_track_mode mode);
  57. void
  58. kvm_page_track_register_notifier(struct kvm *kvm,
  59. struct kvm_page_track_notifier_node *n);
  60. void
  61. kvm_page_track_unregister_notifier(struct kvm *kvm,
  62. struct kvm_page_track_notifier_node *n);
  63. void kvm_page_track_write(struct kvm_vcpu *vcpu, gpa_t gpa, const u8 *new,
  64. int bytes);
  65. void kvm_page_track_flush_slot(struct kvm *kvm, struct kvm_memory_slot *slot);
  66. #endif