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

[PATCH 10/11] x86/xen: open code alloc_vm_area in arch_gnttab_valloc



Replace the last call to alloc_vm_area with an open coded version using
an iterator in struct gnttab_vm_area instead of the triple indirection
magic in alloc_vm_area.

Signed-off-by: Christoph Hellwig <hch@xxxxxx>
Reviewed-by: Boris Ostrovsky <boris.ostrovsky@xxxxxxxxxx>
---
 arch/x86/xen/grant-table.c | 27 ++++++++++++++++++++-------
 1 file changed, 20 insertions(+), 7 deletions(-)

diff --git a/arch/x86/xen/grant-table.c b/arch/x86/xen/grant-table.c
index 4988e19598c8a5..1e681bf62561a0 100644
--- a/arch/x86/xen/grant-table.c
+++ b/arch/x86/xen/grant-table.c
@@ -25,6 +25,7 @@
 static struct gnttab_vm_area {
        struct vm_struct *area;
        pte_t **ptes;
+       int idx;
 } gnttab_shared_vm_area, gnttab_status_vm_area;
 
 int arch_gnttab_map_shared(unsigned long *frames, unsigned long nr_gframes,
@@ -90,19 +91,31 @@ void arch_gnttab_unmap(void *shared, unsigned long 
nr_gframes)
        }
 }
 
+static int gnttab_apply(pte_t *pte, unsigned long addr, void *data)
+{
+       struct gnttab_vm_area *area = data;
+
+       area->ptes[area->idx++] = pte;
+       return 0;
+}
+
 static int arch_gnttab_valloc(struct gnttab_vm_area *area, unsigned nr_frames)
 {
        area->ptes = kmalloc_array(nr_frames, sizeof(*area->ptes), GFP_KERNEL);
        if (area->ptes == NULL)
                return -ENOMEM;
-
-       area->area = alloc_vm_area(PAGE_SIZE * nr_frames, area->ptes);
-       if (area->area == NULL) {
-               kfree(area->ptes);
-               return -ENOMEM;
-       }
-
+       area->area = get_vm_area(PAGE_SIZE * nr_frames, VM_IOREMAP);
+       if (!area->area)
+               goto out_free_ptes;
+       if (apply_to_page_range(&init_mm, (unsigned long)area->area->addr,
+                       PAGE_SIZE * nr_frames, gnttab_apply, area))
+               goto out_free_vm_area;
        return 0;
+out_free_vm_area:
+       free_vm_area(area->area);
+out_free_ptes:
+       kfree(area->ptes);
+       return -ENOMEM;
 }
 
 static void arch_gnttab_vfree(struct gnttab_vm_area *area)
-- 
2.28.0




 


Rackspace

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