Skip to content

Commit 5dd63bf

Browse files
Christoph Hellwigtorvalds
authored andcommitted
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@lst.de> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com> Cc: Chris Wilson <chris@chris-wilson.co.uk> Cc: Jani Nikula <jani.nikula@linux.intel.com> Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> Cc: Juergen Gross <jgross@suse.com> Cc: Matthew Auld <matthew.auld@intel.com> Cc: "Matthew Wilcox (Oracle)" <willy@infradead.org> Cc: Minchan Kim <minchan@kernel.org> Cc: Nitin Gupta <ngupta@vflare.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Rodrigo Vivi <rodrigo.vivi@intel.com> Cc: Stefano Stabellini <sstabellini@kernel.org> Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com> Cc: Uladzislau Rezki (Sony) <urezki@gmail.com> Link: https://lkml.kernel.org/r/20201002122204.1534411-11-hch@lst.de Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
1 parent b723cae commit 5dd63bf

1 file changed

Lines changed: 20 additions & 7 deletions

File tree

arch/x86/xen/grant-table.c

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
static struct gnttab_vm_area {
2626
struct vm_struct *area;
2727
pte_t **ptes;
28+
int idx;
2829
} gnttab_shared_vm_area, gnttab_status_vm_area;
2930

3031
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)
9091
}
9192
}
9293

94+
static int gnttab_apply(pte_t *pte, unsigned long addr, void *data)
95+
{
96+
struct gnttab_vm_area *area = data;
97+
98+
area->ptes[area->idx++] = pte;
99+
return 0;
100+
}
101+
93102
static int arch_gnttab_valloc(struct gnttab_vm_area *area, unsigned nr_frames)
94103
{
95104
area->ptes = kmalloc_array(nr_frames, sizeof(*area->ptes), GFP_KERNEL);
96105
if (area->ptes == NULL)
97106
return -ENOMEM;
98-
99-
area->area = alloc_vm_area(PAGE_SIZE * nr_frames, area->ptes);
100-
if (area->area == NULL) {
101-
kfree(area->ptes);
102-
return -ENOMEM;
103-
}
104-
107+
area->area = get_vm_area(PAGE_SIZE * nr_frames, VM_IOREMAP);
108+
if (!area->area)
109+
goto out_free_ptes;
110+
if (apply_to_page_range(&init_mm, (unsigned long)area->area->addr,
111+
PAGE_SIZE * nr_frames, gnttab_apply, area))
112+
goto out_free_vm_area;
105113
return 0;
114+
out_free_vm_area:
115+
free_vm_area(area->area);
116+
out_free_ptes:
117+
kfree(area->ptes);
118+
return -ENOMEM;
106119
}
107120

108121
static void arch_gnttab_vfree(struct gnttab_vm_area *area)

0 commit comments

Comments
 (0)