diff options
Diffstat (limited to 'drivers/xen/privcmd.c')
| -rw-r--r-- | drivers/xen/privcmd.c | 18 | 
1 files changed, 9 insertions, 9 deletions
diff --git a/drivers/xen/privcmd.c b/drivers/xen/privcmd.c index 720a7b7abd46..3369734108af 100644 --- a/drivers/xen/privcmd.c +++ b/drivers/xen/privcmd.c @@ -257,7 +257,7 @@ static long privcmd_ioctl_mmap(struct file *file, void __user *udata)  	LIST_HEAD(pagelist);  	struct mmap_gfn_state state; -	/* We only support privcmd_ioctl_mmap_batch for auto translated. */ +	/* We only support privcmd_ioctl_mmap_batch for non-auto-translated. */  	if (xen_feature(XENFEAT_auto_translated_physmap))  		return -ENOSYS; @@ -420,7 +420,7 @@ static int alloc_empty_pages(struct vm_area_struct *vma, int numpgs)  	int rc;  	struct page **pages; -	pages = kcalloc(numpgs, sizeof(pages[0]), GFP_KERNEL); +	pages = kvcalloc(numpgs, sizeof(pages[0]), GFP_KERNEL);  	if (pages == NULL)  		return -ENOMEM; @@ -428,7 +428,7 @@ static int alloc_empty_pages(struct vm_area_struct *vma, int numpgs)  	if (rc != 0) {  		pr_warn("%s Could not alloc %d pfns rc:%d\n", __func__,  			numpgs, rc); -		kfree(pages); +		kvfree(pages);  		return -ENOMEM;  	}  	BUG_ON(vma->vm_private_data != NULL); @@ -803,21 +803,21 @@ static long privcmd_ioctl_mmap_resource(struct file *file,  		unsigned int domid =  			(xdata.flags & XENMEM_rsrc_acq_caller_owned) ?  			DOMID_SELF : kdata.dom; -		int num; +		int num, *errs = (int *)pfns; +		BUILD_BUG_ON(sizeof(*errs) > sizeof(*pfns));  		num = xen_remap_domain_mfn_array(vma,  						 kdata.addr & PAGE_MASK, -						 pfns, kdata.num, (int *)pfns, +						 pfns, kdata.num, errs,  						 vma->vm_page_prot, -						 domid, -						 vma->vm_private_data); +						 domid);  		if (num < 0)  			rc = num;  		else if (num != kdata.num) {  			unsigned int i;  			for (i = 0; i < num; i++) { -				rc = pfns[i]; +				rc = errs[i];  				if (rc < 0)  					break;  			} @@ -912,7 +912,7 @@ static void privcmd_close(struct vm_area_struct *vma)  	else  		pr_crit("unable to unmap MFN range: leaking %d pages. rc=%d\n",  			numpgs, rc); -	kfree(pages); +	kvfree(pages);  }  static vm_fault_t privcmd_fault(struct vm_fault *vmf)  | 
