[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [V8 PATCH 0/8] pvh dom0....



On Fri, 28 Mar 2014 18:36:07 +0100
Roger Pau Monnà <roger.pau@xxxxxxxxxx> wrote:

> On 22/03/14 02:39, Mukesh Rathor wrote:
> > Hi all,
> > 
> > Finally, please find V8 of dom0 PVH patches based on commit bc69aaf.
> > 
> >   git tree: git://oss.oracle.com/git/mrathor/xen.git  branch:
> > dom0pvh-v8
> 
> Hello Mukesh,
> 
> Thanks for the patches, do you have the Linux side of them? (I think 
> the only missing bit is the support for XENMEM_add_to_physmap_range).

Attached and linlined below what I've in my tree...

> Also, while testing them I've found that from time to time I would
> hit the following ASSERT on shutdown:

Ok, I'll add that to my series.

thanks Roger,
Mukesh



diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c
index 256282e..9063d0a 100644
--- a/arch/x86/xen/mmu.c
+++ b/arch/x86/xen/mmu.c
@@ -2511,6 +2511,91 @@ void __init xen_hvm_init_mmu_ops(void)
 }
 #endif
 
+/* 
+ * Map foreign gmfn, fgmfn, to local pfn, lpfn. This for the user space
+ * creating new guest on pvh dom0 and needing to map domU pages.
+ */
+static int autox_add_to_p2m(unsigned long lpfn, unsigned long fgmfn,
+                           unsigned int domid)
+{
+       int rc, err = 0;
+       xen_pfn_t gpfn = lpfn;
+       xen_ulong_t idx = fgmfn;
+
+       struct xen_add_to_physmap_range xatp = {
+               .domid = DOMID_SELF,
+               .foreign_domid = domid,
+               .size = 1,
+               .space = XENMAPSPACE_gmfn_foreign,
+       };
+       set_xen_guest_handle(xatp.idxs, &idx);
+       set_xen_guest_handle(xatp.gpfns, &gpfn);
+       set_xen_guest_handle(xatp.errs, &err);
+
+       rc = HYPERVISOR_memory_op(XENMEM_add_to_physmap_range, &xatp);
+       return rc;
+}
+
+static int autox_remove_from_p2m(unsigned long spfn, int count)
+{
+       struct xen_remove_from_physmap xrp;
+       int i, rc;
+
+       for (i = 0; i < count; i++) {
+               xrp.domid = DOMID_SELF;
+               xrp.gpfn = spfn+i;
+               rc = HYPERVISOR_memory_op(XENMEM_remove_from_physmap, &xrp);
+               if (rc)
+                       break;
+       }
+       return rc;
+}
+
+struct autox_remap_data {
+       unsigned long fgmfn; /* foreign domain's gmfn */
+       pgprot_t prot;
+       domid_t  domid;
+       int index;
+       struct page **pages;
+};
+
+static int autox_map_pte_fn(pte_t *ptep, pgtable_t token, unsigned long addr,
+                           void *data)
+{
+       int rc;
+       struct autox_remap_data *remap = data;
+       unsigned long pfn = page_to_pfn(remap->pages[remap->index++]);
+       pte_t pteval = pte_mkspecial(pfn_pte(pfn, remap->prot));
+
+       rc = autox_add_to_p2m(pfn, remap->fgmfn, remap->domid);
+       if (rc)
+               return rc;
+       native_set_pte(ptep, pteval);
+
+       return 0;
+}
+
+static int autox_remap_gmfn_range(struct vm_area_struct *vma,
+                                 unsigned long addr, unsigned long mfn,
+                                 int nr, pgprot_t prot, unsigned domid,
+                                 struct page **pages)
+{
+       int err;
+       struct autox_remap_data pvhdata;
+
+       BUG_ON(!pages);
+
+       pvhdata.fgmfn = mfn;
+       pvhdata.prot = prot;
+       pvhdata.domid = domid;
+       pvhdata.index = 0;
+       pvhdata.pages = pages;
+       err = apply_to_page_range(vma->vm_mm, addr, nr << PAGE_SHIFT,
+                                 autox_map_pte_fn, &pvhdata);
+       flush_tlb_all();
+       return err;
+}
+
 #define REMAP_BATCH_SIZE 16
 
 struct remap_data {
@@ -2545,13 +2630,16 @@ int xen_remap_domain_mfn_range(struct vm_area_struct 
*vma,
        unsigned long range;
        int err = 0;
 
-       if (xen_feature(XENFEAT_auto_translated_physmap))
-               return -EINVAL;
-
        prot = __pgprot(pgprot_val(prot) | _PAGE_IOMAP);
 
        BUG_ON(!((vma->vm_flags & (VM_PFNMAP | VM_IO)) == (VM_PFNMAP | VM_IO)));
 
+       if (xen_feature(XENFEAT_auto_translated_physmap)) {
+               /* We need to update the local page tables and the xen HAP */
+               return autox_remap_gmfn_range(vma, addr, mfn, nr, prot,
+                                             domid, pages);
+       }
+
        rmd.mfn = mfn;
        rmd.prot = prot;
 
@@ -2589,6 +2677,18 @@ int xen_unmap_domain_mfn_range(struct vm_area_struct 
*vma,
        if (!pages || !xen_feature(XENFEAT_auto_translated_physmap))
                return 0;
 
-       return -EINVAL;
+       while (numpgs--) {
+
+               /* The mmu has already cleaned up the process mmu resources at
+                * this point (lookup_address will return NULL). */
+               unsigned long pfn = page_to_pfn(pages[numpgs]);
+
+               autox_remove_from_p2m(pfn, 1);
+       }
+       /* We don't need to flush tlbs because as part of autox_remove_from_p2m,
+        * the hypervisor will do tlb flushes after removing the p2m entries
+        * from the EPT/NPT */
+
+       return 0;
 }
 EXPORT_SYMBOL_GPL(xen_unmap_domain_mfn_range);

Attachment: linux.patch
Description: Text Data

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.