Linux Audio

Check our new training course

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