]> xenbits.xensource.com Git - people/liuw/xen.git/commitdiff
xen/vmap: introduce vmap_order
authorWei Liu <wei.liu2@citrix.com>
Fri, 22 Feb 2019 14:33:46 +0000 (14:33 +0000)
committerWei Liu <wei.liu2@citrix.com>
Fri, 22 Feb 2019 17:27:32 +0000 (17:27 +0000)
Instead of accepting an array and its length, it accepts a page of
arbitrary order and maps it.

Signed-off-by: Wei Liu <wei.liu2@citrix.com>
xen/common/vmap.c
xen/include/xen/vmap.h

index faebc1ddf1145210d95144606107a0a16c9c561e..c68654c71701de914b2b5315fa0fedcd7cc80875 100644 (file)
@@ -218,11 +218,36 @@ void *__vmap(const mfn_t *mfn, unsigned int granularity,
     return va;
 }
 
+static void *__vmap_order(const mfn_t mfn, unsigned int granularity,
+                          unsigned int order, unsigned int align,
+                          unsigned int flags, enum vmap_region type)
+{
+    unsigned int nr = 1UL << order;
+    void *va = vm_alloc(nr * granularity, align, type);
+    unsigned long cur = (unsigned long)va;
+
+    for ( ; va && nr--; mfn_add(mfn, 1), cur += PAGE_SIZE * granularity )
+    {
+        if ( map_pages_to_xen(cur, mfn, granularity, flags) )
+        {
+            vunmap(va);
+            va = NULL;
+        }
+    }
+
+    return va;
+}
+
 void *vmap(const mfn_t *mfn, unsigned int nr)
 {
     return __vmap(mfn, 1, nr, 1, PAGE_HYPERVISOR, VMAP_DEFAULT);
 }
 
+void *vmap_order(const mfn_t mfn, unsigned int order)
+{
+    return __vmap_order(mfn, 1, order, 1, PAGE_HYPERVISOR, VMAP_DEFAULT);
+}
+
 void vunmap(const void *va)
 {
     unsigned long addr = (unsigned long)va;
index 369560e62007556631fcbc9b72d9be583678b400..f4b4edbe00af5058f2605a5bf35e67277905a023 100644 (file)
@@ -15,6 +15,7 @@ void vm_init_type(enum vmap_region type, void *start, void *end);
 void *__vmap(const mfn_t *mfn, unsigned int granularity, unsigned int nr,
              unsigned int align, unsigned int flags, enum vmap_region);
 void *vmap(const mfn_t *mfn, unsigned int nr);
+void *vmap_order(const mfn_t mfn, unsigned int order);
 void vunmap(const void *);
 
 void *vmalloc(size_t size);