2
2
#ifndef _ASM_X86_KVM_PAGE_TRACK_H
3
3
#define _ASM_X86_KVM_PAGE_TRACK_H
4
4
5
- enum kvm_page_track_mode {
6
- KVM_PAGE_TRACK_WRITE ,
7
- KVM_PAGE_TRACK_MAX ,
8
- };
5
+ #include <linux/kvm_types.h>
9
6
7
+ #ifdef CONFIG_KVM_EXTERNAL_WRITE_TRACKING
10
8
/*
11
9
* The notifier represented by @kvm_page_track_notifier_node is linked into
12
10
* the head which will be notified when guest is triggering the track event.
@@ -26,54 +24,39 @@ struct kvm_page_track_notifier_node {
26
24
* It is called when guest is writing the write-tracked page
27
25
* and write emulation is finished at that time.
28
26
*
29
- * @vcpu: the vcpu where the write access happened.
30
27
* @gpa: the physical address written by guest.
31
28
* @new: the data was written to the address.
32
29
* @bytes: the written length.
33
30
* @node: this node
34
31
*/
35
- void (* track_write )(struct kvm_vcpu * vcpu , gpa_t gpa , const u8 * new ,
36
- int bytes , struct kvm_page_track_notifier_node * node );
32
+ void (* track_write )(gpa_t gpa , const u8 * new , int bytes ,
33
+ struct kvm_page_track_notifier_node * node );
34
+
37
35
/*
38
- * It is called when memory slot is being moved or removed
39
- * users can drop write-protection for the pages in that memory slot
36
+ * Invoked when a memory region is removed from the guest. Or in KVM
37
+ * terms, when a memslot is deleted.
40
38
*
41
- * @kvm: the kvm where memory slot being moved or removed
42
- * @slot: the memory slot being moved or removed
43
- * @node: this node
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
44
42
*/
45
- void (* track_flush_slot )( struct kvm * kvm , struct kvm_memory_slot * slot ,
46
- struct kvm_page_track_notifier_node * node );
43
+ void (* track_remove_region )( gfn_t gfn , unsigned long nr_pages ,
44
+ struct kvm_page_track_notifier_node * node );
47
45
};
48
46
49
- int kvm_page_track_init (struct kvm * kvm );
50
- void kvm_page_track_cleanup (struct kvm * kvm );
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
51
52
- bool kvm_page_track_write_tracking_enabled (struct kvm * kvm );
53
- int kvm_page_track_write_tracking_alloc (struct kvm_memory_slot * slot );
54
-
55
- void kvm_page_track_free_memslot (struct kvm_memory_slot * slot );
56
- int kvm_page_track_create_memslot (struct kvm * kvm ,
57
- struct kvm_memory_slot * slot ,
58
- unsigned long npages );
59
-
60
- void kvm_slot_page_track_add_page (struct kvm * kvm ,
61
- struct kvm_memory_slot * slot , gfn_t gfn ,
62
- enum kvm_page_track_mode mode );
63
- void kvm_slot_page_track_remove_page (struct kvm * kvm ,
64
- struct kvm_memory_slot * slot , gfn_t gfn ,
65
- enum kvm_page_track_mode mode );
66
- bool kvm_slot_page_track_is_active (struct kvm * kvm ,
67
- const struct kvm_memory_slot * slot ,
68
- gfn_t gfn , enum kvm_page_track_mode mode );
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 */
69
61
70
- void
71
- kvm_page_track_register_notifier (struct kvm * kvm ,
72
- struct kvm_page_track_notifier_node * n );
73
- void
74
- kvm_page_track_unregister_notifier (struct kvm * kvm ,
75
- struct kvm_page_track_notifier_node * n );
76
- void kvm_page_track_write (struct kvm_vcpu * vcpu , gpa_t gpa , const u8 * new ,
77
- int bytes );
78
- void kvm_page_track_flush_slot (struct kvm * kvm , struct kvm_memory_slot * slot );
79
62
#endif
0 commit comments