f22b1e8500
Get/put references to KVM when a page-track notifier is (un)registered instead of relying on the caller to do so. Forcing the caller to do the bookkeeping is unnecessary and adds one more thing for users to get wrong, e.g. see commit 9ed1fdee9ee3 ("drm/i915/gvt: Get reference to KVM iff attachment to VM is successful"). Reviewed-by: Yan Zhao <yan.y.zhao@intel.com> Tested-by: Yongwei Ma <yongwei.ma@intel.com> Link: https://lore.kernel.org/r/20230729013535.1070024-29-seanjc@google.com Signed-off-by: Sean Christopherson <seanjc@google.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
63 lines
1.9 KiB
C
63 lines
1.9 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef _ASM_X86_KVM_PAGE_TRACK_H
|
|
#define _ASM_X86_KVM_PAGE_TRACK_H
|
|
|
|
#include <linux/kvm_types.h>
|
|
|
|
#ifdef CONFIG_KVM_EXTERNAL_WRITE_TRACKING
|
|
/*
|
|
* The notifier represented by @kvm_page_track_notifier_node is linked into
|
|
* the head which will be notified when guest is triggering the track event.
|
|
*
|
|
* Write access on the head is protected by kvm->mmu_lock, read access
|
|
* is protected by track_srcu.
|
|
*/
|
|
struct kvm_page_track_notifier_head {
|
|
struct srcu_struct track_srcu;
|
|
struct hlist_head track_notifier_list;
|
|
};
|
|
|
|
struct kvm_page_track_notifier_node {
|
|
struct hlist_node node;
|
|
|
|
/*
|
|
* It is called when guest is writing the write-tracked page
|
|
* and write emulation is finished at that time.
|
|
*
|
|
* @gpa: the physical address written by guest.
|
|
* @new: the data was written to the address.
|
|
* @bytes: the written length.
|
|
* @node: this node
|
|
*/
|
|
void (*track_write)(gpa_t gpa, const u8 *new, int bytes,
|
|
struct kvm_page_track_notifier_node *node);
|
|
|
|
/*
|
|
* Invoked when a memory region is removed from the guest. Or in KVM
|
|
* terms, when a memslot is deleted.
|
|
*
|
|
* @gfn: base gfn of the region being removed
|
|
* @nr_pages: number of pages in the to-be-removed region
|
|
* @node: this node
|
|
*/
|
|
void (*track_remove_region)(gfn_t gfn, unsigned long nr_pages,
|
|
struct kvm_page_track_notifier_node *node);
|
|
};
|
|
|
|
int kvm_page_track_register_notifier(struct kvm *kvm,
|
|
struct kvm_page_track_notifier_node *n);
|
|
void kvm_page_track_unregister_notifier(struct kvm *kvm,
|
|
struct kvm_page_track_notifier_node *n);
|
|
|
|
int kvm_write_track_add_gfn(struct kvm *kvm, gfn_t gfn);
|
|
int kvm_write_track_remove_gfn(struct kvm *kvm, gfn_t gfn);
|
|
#else
|
|
/*
|
|
* Allow defining a node in a structure even if page tracking is disabled, e.g.
|
|
* to play nice with testing headers via direct inclusion from the command line.
|
|
*/
|
|
struct kvm_page_track_notifier_node {};
|
|
#endif /* CONFIG_KVM_EXTERNAL_WRITE_TRACKING */
|
|
|
|
#endif
|