diff options
Diffstat (limited to 'arch/x86/xen/grant-table.c')
| -rw-r--r-- | arch/x86/xen/grant-table.c | 70 | 
1 files changed, 10 insertions, 60 deletions
diff --git a/arch/x86/xen/grant-table.c b/arch/x86/xen/grant-table.c index ebfa9b2c871d..1580e7a5a4cf 100644 --- a/arch/x86/xen/grant-table.c +++ b/arch/x86/xen/grant-table.c @@ -49,7 +49,7 @@  static struct gnttab_vm_area {  	struct vm_struct *area;  	pte_t **ptes; -} gnttab_shared_vm_area, gnttab_status_vm_area; +} gnttab_shared_vm_area;  int arch_gnttab_map_shared(unsigned long *frames, unsigned long nr_gframes,  			   unsigned long max_nr_gframes, @@ -73,43 +73,16 @@ int arch_gnttab_map_shared(unsigned long *frames, unsigned long nr_gframes,  	return 0;  } -int arch_gnttab_map_status(uint64_t *frames, unsigned long nr_gframes, -			   unsigned long max_nr_gframes, -			   grant_status_t **__shared) -{ -	grant_status_t *shared = *__shared; -	unsigned long addr; -	unsigned long i; - -	if (shared == NULL) -		*__shared = shared = gnttab_status_vm_area.area->addr; - -	addr = (unsigned long)shared; - -	for (i = 0; i < nr_gframes; i++) { -		set_pte_at(&init_mm, addr, gnttab_status_vm_area.ptes[i], -			   mfn_pte(frames[i], PAGE_KERNEL)); -		addr += PAGE_SIZE; -	} - -	return 0; -} -  void arch_gnttab_unmap(void *shared, unsigned long nr_gframes)  { -	pte_t **ptes;  	unsigned long addr;  	unsigned long i; -	if (shared == gnttab_status_vm_area.area->addr) -		ptes = gnttab_status_vm_area.ptes; -	else -		ptes = gnttab_shared_vm_area.ptes; -  	addr = (unsigned long)shared;  	for (i = 0; i < nr_gframes; i++) { -		set_pte_at(&init_mm, addr, ptes[i], __pte(0)); +		set_pte_at(&init_mm, addr, gnttab_shared_vm_area.ptes[i], +			   __pte(0));  		addr += PAGE_SIZE;  	}  } @@ -129,35 +102,12 @@ static int arch_gnttab_valloc(struct gnttab_vm_area *area, unsigned nr_frames)  	return 0;  } -static void arch_gnttab_vfree(struct gnttab_vm_area *area) +int arch_gnttab_init(unsigned long nr_shared)  { -	free_vm_area(area->area); -	kfree(area->ptes); -} - -int arch_gnttab_init(unsigned long nr_shared, unsigned long nr_status) -{ -	int ret; -  	if (!xen_pv_domain())  		return 0; -	ret = arch_gnttab_valloc(&gnttab_shared_vm_area, nr_shared); -	if (ret < 0) -		return ret; - -	/* -	 * Always allocate the space for the status frames in case -	 * we're migrated to a host with V2 support. -	 */ -	ret = arch_gnttab_valloc(&gnttab_status_vm_area, nr_status); -	if (ret < 0) -		goto err; - -	return 0; -  err: -	arch_gnttab_vfree(&gnttab_shared_vm_area); -	return -ENOMEM; +	return arch_gnttab_valloc(&gnttab_shared_vm_area, nr_shared);  }  #ifdef CONFIG_XEN_PVH @@ -168,6 +118,7 @@ static int __init xlated_setup_gnttab_pages(void)  {  	struct page **pages;  	xen_pfn_t *pfns; +	void *vaddr;  	int rc;  	unsigned int i;  	unsigned long nr_grant_frames = gnttab_max_grant_frames(); @@ -193,21 +144,20 @@ static int __init xlated_setup_gnttab_pages(void)  	for (i = 0; i < nr_grant_frames; i++)  		pfns[i] = page_to_pfn(pages[i]); -	rc = arch_gnttab_map_shared(pfns, nr_grant_frames, nr_grant_frames, -				    &xen_auto_xlat_grant_frames.vaddr); - -	if (rc) { +	vaddr = vmap(pages, nr_grant_frames, 0, PAGE_KERNEL); +	if (!vaddr) {  		pr_warn("%s Couldn't map %ld pfns rc:%d\n", __func__,  			nr_grant_frames, rc);  		free_xenballooned_pages(nr_grant_frames, pages);  		kfree(pages);  		kfree(pfns); -		return rc; +		return -ENOMEM;  	}  	kfree(pages);  	xen_auto_xlat_grant_frames.pfn = pfns;  	xen_auto_xlat_grant_frames.count = nr_grant_frames; +	xen_auto_xlat_grant_frames.vaddr = vaddr;  	return 0;  }  |