forked from luck/tmp_suning_uos_patched
xen/xenbus: use apply_to_page_range directly in xenbus_map_ring_pv
Replacing alloc_vm_area with get_vm_area_caller + apply_page_range allows to fill put the phys_addr values directly instead of doing another loop over all addresses. 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-10-hch@lst.de Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
534a6687aa
commit
b723caece3
|
@ -73,16 +73,13 @@ struct map_ring_valloc {
|
|||
struct xenbus_map_node *node;
|
||||
|
||||
/* Why do we need two arrays? See comment of __xenbus_map_ring */
|
||||
union {
|
||||
unsigned long addrs[XENBUS_MAX_RING_GRANTS];
|
||||
pte_t *ptes[XENBUS_MAX_RING_GRANTS];
|
||||
};
|
||||
unsigned long addrs[XENBUS_MAX_RING_GRANTS];
|
||||
phys_addr_t phys_addrs[XENBUS_MAX_RING_GRANTS];
|
||||
|
||||
struct gnttab_map_grant_ref map[XENBUS_MAX_RING_GRANTS];
|
||||
struct gnttab_unmap_grant_ref unmap[XENBUS_MAX_RING_GRANTS];
|
||||
|
||||
unsigned int idx; /* HVM only. */
|
||||
unsigned int idx;
|
||||
};
|
||||
|
||||
static DEFINE_SPINLOCK(xenbus_valloc_lock);
|
||||
|
@ -686,6 +683,14 @@ int xenbus_unmap_ring_vfree(struct xenbus_device *dev, void *vaddr)
|
|||
EXPORT_SYMBOL_GPL(xenbus_unmap_ring_vfree);
|
||||
|
||||
#ifdef CONFIG_XEN_PV
|
||||
static int map_ring_apply(pte_t *pte, unsigned long addr, void *data)
|
||||
{
|
||||
struct map_ring_valloc *info = data;
|
||||
|
||||
info->phys_addrs[info->idx++] = arbitrary_virt_to_machine(pte).maddr;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int xenbus_map_ring_pv(struct xenbus_device *dev,
|
||||
struct map_ring_valloc *info,
|
||||
grant_ref_t *gnt_refs,
|
||||
|
@ -694,18 +699,15 @@ static int xenbus_map_ring_pv(struct xenbus_device *dev,
|
|||
{
|
||||
struct xenbus_map_node *node = info->node;
|
||||
struct vm_struct *area;
|
||||
int err = GNTST_okay;
|
||||
int i;
|
||||
bool leaked;
|
||||
bool leaked = false;
|
||||
int err = -ENOMEM;
|
||||
|
||||
area = alloc_vm_area(XEN_PAGE_SIZE * nr_grefs, info->ptes);
|
||||
area = get_vm_area(XEN_PAGE_SIZE * nr_grefs, VM_IOREMAP);
|
||||
if (!area)
|
||||
return -ENOMEM;
|
||||
|
||||
for (i = 0; i < nr_grefs; i++)
|
||||
info->phys_addrs[i] =
|
||||
arbitrary_virt_to_machine(info->ptes[i]).maddr;
|
||||
|
||||
if (apply_to_page_range(&init_mm, (unsigned long)area->addr,
|
||||
XEN_PAGE_SIZE * nr_grefs, map_ring_apply, info))
|
||||
goto failed;
|
||||
err = __xenbus_map_ring(dev, gnt_refs, nr_grefs, node->handles,
|
||||
info, GNTMAP_host_map | GNTMAP_contains_pte,
|
||||
&leaked);
|
||||
|
|
Loading…
Reference in New Issue
Block a user