From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:60371) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1c4kf2-0002Z9-L6 for qemu-devel@nongnu.org; Thu, 10 Nov 2016 03:24:41 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1c4kez-0002nC-G1 for qemu-devel@nongnu.org; Thu, 10 Nov 2016 03:24:40 -0500 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:49140 helo=mx0a-001b2d01.pphosted.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1c4kez-0002n4-AW for qemu-devel@nongnu.org; Thu, 10 Nov 2016 03:24:37 -0500 Received: from pps.filterd (m0098416.ppops.net [127.0.0.1]) by mx0b-001b2d01.pphosted.com (8.16.0.17/8.16.0.17) with SMTP id uAA8NkUl140435 for ; Thu, 10 Nov 2016 03:24:36 -0500 Received: from e34.co.us.ibm.com (e34.co.us.ibm.com [32.97.110.152]) by mx0b-001b2d01.pphosted.com with ESMTP id 26md6fuvjh-1 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT) for ; Thu, 10 Nov 2016 03:24:36 -0500 Received: from localhost by e34.co.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Thu, 10 Nov 2016 01:24:35 -0700 Date: Thu, 10 Nov 2016 16:24:28 +0800 From: Dong Jia Shi References: <1478293856-8191-1-git-send-email-kwankhede@nvidia.com> <1478293856-8191-10-git-send-email-kwankhede@nvidia.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1478293856-8191-10-git-send-email-kwankhede@nvidia.com> Message-Id: <20161110082428.GF4716@bjsdjshi@linux.vnet.ibm.com> Subject: Re: [Qemu-devel] [PATCH v11 09/22] vfio iommu type1: Add task structure to vfio_dma List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Kirti Wankhede Cc: alex.williamson@redhat.com, pbonzini@redhat.com, kraxel@redhat.com, cjia@nvidia.com, qemu-devel@nongnu.org, kvm@vger.kernel.org, kevin.tian@intel.com, jike.song@intel.com, bjsdjshi@linux.vnet.ibm.com, linux-kernel@vger.kernel.org * Kirti Wankhede [2016-11-05 02:40:43 +0530]: Hi Kirti, [...] > static int vfio_dma_do_map(struct vfio_iommu *iommu, > struct vfio_iommu_type1_dma_map *map) > { > dma_addr_t iova = map->iova; > unsigned long vaddr = map->vaddr; > size_t size = map->size; > - long npage; > int ret = 0, prot = 0; > uint64_t mask; > struct vfio_dma *dma; > - unsigned long pfn; > + struct vfio_addr_space *addr_space; > + struct mm_struct *mm; > + bool free_addr_space_on_err = false; > > /* Verify that none of our __u64 fields overflow */ > if (map->size != size || map->vaddr != vaddr || map->iova != iova) > @@ -608,47 +685,56 @@ static int vfio_dma_do_map(struct vfio_iommu *iommu, > mutex_lock(&iommu->lock); > > if (vfio_find_dma(iommu, iova, size)) { > - mutex_unlock(&iommu->lock); > - return -EEXIST; > + ret = -EEXIST; > + goto do_map_err; > + } > + > + mm = get_task_mm(current); > + if (!mm) { > + ret = -ENODEV; > + goto do_map_err; > + } > + > + addr_space = vfio_find_addr_space(iommu, mm); > + if (addr_space) { > + atomic_inc(&addr_space->ref_count); > + mmput(mm); > + } else { > + addr_space = kzalloc(sizeof(*addr_space), GFP_KERNEL); > + if (!addr_space) { > + ret = -ENOMEM; No need to call (?): mmput(mm); > + goto do_map_err; > + } > + addr_space->mm = mm; > + atomic_set(&addr_space->ref_count, 1); > + list_add(&addr_space->next, &iommu->addr_space_list); > + free_addr_space_on_err = true; > } > > dma = kzalloc(sizeof(*dma), GFP_KERNEL); > if (!dma) { > - mutex_unlock(&iommu->lock); > - return -ENOMEM; > + if (free_addr_space_on_err) { > + mmput(mm); > + list_del(&addr_space->next); > + kfree(addr_space); > + } > + ret = -ENOMEM; > + goto do_map_err; > } > > dma->iova = iova; > dma->vaddr = vaddr; > dma->prot = prot; > + dma->addr_space = addr_space; > + get_task_struct(current); > + dma->task = current; > + dma->mlock_cap = capable(CAP_IPC_LOCK); > > /* Insert zero-sized and grow as we map chunks of it */ > vfio_link_dma(iommu, dma); > > - while (size) { > - /* Pin a contiguous chunk of memory */ > - npage = __vfio_pin_pages_remote(vaddr + dma->size, > - size >> PAGE_SHIFT, prot, &pfn); > - if (npage <= 0) { > - WARN_ON(!npage); > - ret = (int)npage; > - break; > - } > - > - /* Map it! */ > - ret = vfio_iommu_map(iommu, iova + dma->size, pfn, npage, prot); > - if (ret) { > - __vfio_unpin_pages_remote(pfn, npage, prot, true); > - break; > - } > - > - size -= npage << PAGE_SHIFT; > - dma->size += npage << PAGE_SHIFT; > - } > - > - if (ret) > - vfio_remove_dma(iommu, dma); > - > + ret = vfio_pin_map_dma(iommu, dma, size); > +do_map_err: > mutex_unlock(&iommu->lock); > return ret; > } > -- > 2.7.0 > -- Dong Jia