|
@@ -225,3 +225,28 @@ void kvm_page_track_write(struct kvm_vcpu *vcpu, gpa_t gpa, const u8 *new,
|
|
|
n->track_write(vcpu, gpa, new, bytes);
|
|
|
srcu_read_unlock(&head->track_srcu, idx);
|
|
|
}
|
|
|
+
|
|
|
+/*
|
|
|
+ * Notify the node that memory slot is being removed or moved so that it can
|
|
|
+ * drop write-protection for the pages in the memory slot.
|
|
|
+ *
|
|
|
+ * The node should figure out it has any write-protected pages in this slot
|
|
|
+ * by itself.
|
|
|
+ */
|
|
|
+void kvm_page_track_flush_slot(struct kvm *kvm, struct kvm_memory_slot *slot)
|
|
|
+{
|
|
|
+ struct kvm_page_track_notifier_head *head;
|
|
|
+ struct kvm_page_track_notifier_node *n;
|
|
|
+ int idx;
|
|
|
+
|
|
|
+ head = &kvm->arch.track_notifier_head;
|
|
|
+
|
|
|
+ if (hlist_empty(&head->track_notifier_list))
|
|
|
+ return;
|
|
|
+
|
|
|
+ idx = srcu_read_lock(&head->track_srcu);
|
|
|
+ hlist_for_each_entry_rcu(n, &head->track_notifier_list, node)
|
|
|
+ if (n->track_flush_slot)
|
|
|
+ n->track_flush_slot(kvm, slot);
|
|
|
+ srcu_read_unlock(&head->track_srcu, idx);
|
|
|
+}
|