aboutsummaryrefslogtreecommitdiffstats
path: root/include/xen/xen-ops.h
diff options
context:
space:
mode:
authorDavid Vrabel <david.vrabel@citrix.com>2015-03-11 10:49:57 -0400
committerDavid Vrabel <david.vrabel@citrix.com>2015-03-16 10:49:15 -0400
commit4e8c0c8c4bf3a5b5c98046e146ab3884bf7a7d0e (patch)
treee2da5980fd405c7109a342b13f0a2a1214f94b61 /include/xen/xen-ops.h
parent628c28eefd6f2cef03b212081b466ae43fd093a3 (diff)
xen/privcmd: improve performance of MMAPBATCH_V2
Make the IOCTL_PRIVCMD_MMAPBATCH_V2 (and older V1 version) map multiple frames at a time rather than one at a time, despite the pages being non-consecutive GFNs. xen_remap_foreign_mfn_array() is added which maps an array of GFNs (instead of a consecutive range of GFNs). Since per-frame errors are returned in an array, privcmd must set the MMAPBATCH_V1 error bits as part of the "report errors" phase, after all the frames are mapped. Migrate times are significantly improved (when using a PV toolstack domain). For example, for an idle 12 GiB PV guest: Before After real 0m38.179s 0m26.868s user 0m15.096s 0m13.652s sys 0m28.988s 0m18.732s Signed-off-by: David Vrabel <david.vrabel@citrix.com> Reviewed-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Diffstat (limited to 'include/xen/xen-ops.h')
-rw-r--r--include/xen/xen-ops.h45
1 files changed, 41 insertions, 4 deletions
diff --git a/include/xen/xen-ops.h b/include/xen/xen-ops.h
index 9eb88a4512bd..c643e6a94c9a 100644
--- a/include/xen/xen-ops.h
+++ b/include/xen/xen-ops.h
@@ -27,17 +27,54 @@ int xen_create_contiguous_region(phys_addr_t pstart, unsigned int order,
27void xen_destroy_contiguous_region(phys_addr_t pstart, unsigned int order); 27void xen_destroy_contiguous_region(phys_addr_t pstart, unsigned int order);
28 28
29struct vm_area_struct; 29struct vm_area_struct;
30
31/*
32 * xen_remap_domain_mfn_array() - map an array of foreign frames
33 * @vma: VMA to map the pages into
34 * @addr: Address at which to map the pages
35 * @gfn: Array of GFNs to map
36 * @nr: Number entries in the GFN array
37 * @err_ptr: Returns per-GFN error status.
38 * @prot: page protection mask
39 * @domid: Domain owning the pages
40 * @pages: Array of pages if this domain has an auto-translated physmap
41 *
42 * @gfn and @err_ptr may point to the same buffer, the GFNs will be
43 * overwritten by the error codes after they are mapped.
44 *
45 * Returns the number of successfully mapped frames, or a -ve error
46 * code.
47 */
48int xen_remap_domain_mfn_array(struct vm_area_struct *vma,
49 unsigned long addr,
50 xen_pfn_t *gfn, int nr,
51 int *err_ptr, pgprot_t prot,
52 unsigned domid,
53 struct page **pages);
54
55/* xen_remap_domain_mfn_range() - map a range of foreign frames
56 * @vma: VMA to map the pages into
57 * @addr: Address at which to map the pages
58 * @gfn: First GFN to map.
59 * @nr: Number frames to map
60 * @prot: page protection mask
61 * @domid: Domain owning the pages
62 * @pages: Array of pages if this domain has an auto-translated physmap
63 *
64 * Returns the number of successfully mapped frames, or a -ve error
65 * code.
66 */
30int xen_remap_domain_mfn_range(struct vm_area_struct *vma, 67int xen_remap_domain_mfn_range(struct vm_area_struct *vma,
31 unsigned long addr, 68 unsigned long addr,
32 xen_pfn_t mfn, int nr, 69 xen_pfn_t gfn, int nr,
33 pgprot_t prot, unsigned domid, 70 pgprot_t prot, unsigned domid,
34 struct page **pages); 71 struct page **pages);
35int xen_unmap_domain_mfn_range(struct vm_area_struct *vma, 72int xen_unmap_domain_mfn_range(struct vm_area_struct *vma,
36 int numpgs, struct page **pages); 73 int numpgs, struct page **pages);
37int xen_xlate_remap_gfn_range(struct vm_area_struct *vma, 74int xen_xlate_remap_gfn_array(struct vm_area_struct *vma,
38 unsigned long addr, 75 unsigned long addr,
39 xen_pfn_t gfn, int nr, 76 xen_pfn_t *gfn, int nr,
40 pgprot_t prot, 77 int *err_ptr, pgprot_t prot,
41 unsigned domid, 78 unsigned domid,
42 struct page **pages); 79 struct page **pages);
43int xen_xlate_unmap_gfn_range(struct vm_area_struct *vma, 80int xen_xlate_unmap_gfn_range(struct vm_area_struct *vma,