Gregory Haskins wrote:
+/*
+ * ------------
+ * XINTERFACE (External Interface)
+ * -------------
+ */
+
+static struct kvm *
+intf_to_kvm(struct kvm_xinterface *intf)
+{
+       return container_of(intf, struct kvm, xinterface);
+}
+
+static unsigned long
+xinterface_gpa_to_hva(struct kvm_xinterface *intf, unsigned long gpa)
+{
+       struct kvm *kvm = intf_to_kvm(intf);
+       unsigned long addr;
+
+       addr = gfn_to_hva(kvm, gpa >> PAGE_SHIFT);
+       if (kvm_is_error_hva(addr))
+               return 0;
+
+       return addr + offset_in_page(gpa);
+}
+
+static struct page *
+xinterface_gpa_to_page(struct kvm_xinterface *intf, unsigned long gpa)
+{
+       struct kvm *kvm = intf_to_kvm(intf);
+       struct page *page;
+
+       page = gfn_to_page(kvm, gpa >> PAGE_SHIFT);
+       if (page == bad_page)
+               return ERR_PTR(-EINVAL);
+
+       return page;
+}
+
+static void
+xinterface_release(struct kvm_xinterface *intf)
+{
+       struct kvm *kvm = intf_to_kvm(intf);
+
+       kvm_put_kvm(kvm);
+}
+
+struct kvm_xinterface_ops _kvm_xinterface_ops = {
+       .gpa_to_hva  = xinterface_gpa_to_hva,
+       .gpa_to_page = xinterface_gpa_to_page,
+       .release     = xinterface_release,
+};

How do you deal with locking?

The mappings (gpa_to_page) are not fixed. They can and do change very often. The interface doesn't seem to attempt to cope with this.

Regards,

Anthony Liguori
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to