1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef _ASM_X86_KVM_PAGE_TRACK_H 3 #define _ASM_X86_KVM_PAGE_TRACK_H 4 5 #include <linux/kvm_types.h> 6 7 #ifdef CONFIG_KVM_EXTERNAL_WRITE_TRACKING 8 /* 9 * The notifier represented by @kvm_page_track_notifier_node is linked into 10 * the head which will be notified when guest is triggering the track event. 11 * 12 * Write access on the head is protected by kvm->mmu_lock, read access 13 * is protected by track_srcu. 14 */ 15 struct kvm_page_track_notifier_head { 16 struct srcu_struct track_srcu; 17 struct hlist_head track_notifier_list; 18 }; 19 20 struct kvm_page_track_notifier_node { 21 struct hlist_node node; 22 23 /* 24 * It is called when guest is writing the write-tracked page 25 * and write emulation is finished at that time. 26 * 27 * @gpa: the physical address written by guest. 28 * @new: the data was written to the address. 29 * @bytes: the written length. 30 * @node: this node 31 */ 32 void (*track_write)(gpa_t gpa, const u8 *new, int bytes, 33 struct kvm_page_track_notifier_node *node); 34 35 /* 36 * Invoked when a memory region is removed from the guest. Or in KVM 37 * terms, when a memslot is deleted. 38 * 39 * @gfn: base gfn of the region being removed 40 * @nr_pages: number of pages in the to-be-removed region 41 * @node: this node 42 */ 43 void (*track_remove_region)(gfn_t gfn, unsigned long nr_pages, 44 struct kvm_page_track_notifier_node *node); 45 }; 46 47 int kvm_page_track_register_notifier(struct kvm *kvm, 48 struct kvm_page_track_notifier_node *n); 49 void kvm_page_track_unregister_notifier(struct kvm *kvm, 50 struct kvm_page_track_notifier_node *n); 51 52 int kvm_write_track_add_gfn(struct kvm *kvm, gfn_t gfn); 53 int kvm_write_track_remove_gfn(struct kvm *kvm, gfn_t gfn); 54 #else 55 /* 56 * Allow defining a node in a structure even if page tracking is disabled, e.g. 57 * to play nice with testing headers via direct inclusion from the command line. 58 */ 59 struct kvm_page_track_notifier_node {}; 60 #endif /* CONFIG_KVM_EXTERNAL_WRITE_TRACKING */ 61 62 #endif 63