]> xenbits.xensource.com Git - people/liuw/xen.git/commitdiff
xen/vmap: remove xmalloc dependency in vmalloc_type
authorWei Liu <wei.liu2@citrix.com>
Fri, 22 Feb 2019 15:40:14 +0000 (15:40 +0000)
committerWei Liu <wei.liu2@citrix.com>
Fri, 22 Feb 2019 17:27:35 +0000 (17:27 +0000)
xmalloc requires xenheap to work, but we will soon implement xenheap
on top of vmap.

Remove the dependency by using vmap_order to implement vmalloc_type.

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

index c68654c71701de914b2b5315fa0fedcd7cc80875..ef2f681066f994aed7ea8d7095119a105cdf5c09 100644 (file)
@@ -268,19 +268,28 @@ static void *vmalloc_type(size_t size, enum vmap_region type)
 {
     mfn_t *mfn;
     size_t pages, i;
-    struct page_info *pg;
+    struct page_info *tmp_page;
     void *va;
+    unsigned int order;
 
     ASSERT(size);
 
     pages = PFN_UP(size);
-    mfn = xmalloc_array(mfn_t, pages);
+    order = get_order_from_bytes(pages * sizeof(mfn_t));
+    tmp_page = alloc_domheap_pages(NULL, order, 0);
+    if ( tmp_page == NULL )
+        return NULL;
+
+    mfn = vmap_order(page_to_mfn(tmp_page), order);
     if ( mfn == NULL )
+    {
+        free_domheap_pages(tmp_page, order);
         return NULL;
+    }
 
     for ( i = 0; i < pages; i++ )
     {
-        pg = alloc_domheap_page(NULL, 0);
+        struct page_info *pg = alloc_domheap_page(NULL, 0);
         if ( pg == NULL )
             goto error;
         mfn[i] = page_to_mfn(pg);
@@ -290,13 +299,16 @@ static void *vmalloc_type(size_t size, enum vmap_region type)
     if ( va == NULL )
         goto error;
 
-    xfree(mfn);
+    vunmap(mfn);
+    free_domheap_pages(tmp_page, order);
     return va;
 
  error:
+    ASSERT(mfn);
     while ( i-- )
         free_domheap_page(mfn_to_page(mfn[i]));
-    xfree(mfn);
+    vunmap(mfn);
+    free_domheap_pages(tmp_page, order);
     return NULL;
 }