Received: by 2002:a25:4158:0:0:0:0:0 with SMTP id o85csp3636187yba; Mon, 29 Apr 2019 06:07:16 -0700 (PDT) X-Google-Smtp-Source: APXvYqwkNvwPgnSMwHnzQahuVz+aYaxkTvlaAoq2bBrP1V1HRo9tIAXav1DNYMSA72haIGCAcdyB X-Received: by 2002:a65:5009:: with SMTP id f9mr58254070pgo.390.1556543235913; Mon, 29 Apr 2019 06:07:15 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1556543235; cv=none; d=google.com; s=arc-20160816; b=ef65XVpTdXjJon3d6dUBvA5gcWWvZxJPkhkJnvEVwbricITTk0znj8GdfWRXJLjlo2 Ki27UlokpzzDCHRBQX6mMWoYKTNs2+DHvEnrTg5vD5xz59xzY7f2pmqiBIWFqRLcFXnu CXUZuL6MoCvMazppEfU7sQFHjixO8nVg3q0fQw4UeLxdQuLllG3IC84rnOzrxTF8B6Gj IjjvJXq6pkk+oUUoWdyyk517IIrtc2/zgm1FXcQtlsLh6jHSq1bUno7V+fqRCM1W0/QM tOIJQWXBB5qRNy3MJL6JGlWK9umam+cMQDuqnwhP/MtS2L9gh0RPeo+Uy1OtJQmvUsKz xwjA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding :content-language:in-reply-to:mime-version:user-agent:date :message-id:from:references:cc:to:subject; bh=j9p8bSkfxYrdYjuq35n+s9a9Yk26oKhj10BgjelgOLc=; b=qFDFNrp0i05/S4i9pkXcHsiRsDJWcjF/du4nRzUdAHypaWPDd696iNVPJPoeqVdCuF GtIAuo0TjzRbnUk6kPK0O1U8j56Fpsri9vRoRnB9vUx0rXuHkYAM276yxQRdq6YCtORm xwpJWNOCnZsXOnodFxzgxrSm82e0/t0QfsxF7COTGlzKeljs/gyz41P4LsWppDY9qU3B DTcl5DOaCtjGJ2gvY2xapFYenYB8H3mK/D5FGiFE9T+WBk6wABl4xVlJh9deb8DHHBR3 0J7KdxTQGvyd82RlKGztsP40MIUzIJbG/W7gVZOLNSuEQJ4svOLDG7h5HKx098y7LR9n FQag== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id s61si30549989plb.313.2019.04.29.06.06.51; Mon, 29 Apr 2019 06:07:15 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726521AbfD2NFu (ORCPT + 99 others); Mon, 29 Apr 2019 09:05:50 -0400 Received: from foss.arm.com ([217.140.101.70]:56304 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726068AbfD2NFu (ORCPT ); Mon, 29 Apr 2019 09:05:50 -0400 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 81232A78; Mon, 29 Apr 2019 06:05:49 -0700 (PDT) Received: from [10.1.196.75] (e110467-lin.cambridge.arm.com [10.1.196.75]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 15DF73F71A; Mon, 29 Apr 2019 06:05:47 -0700 (PDT) Subject: Re: [PATCH 11/26] iommu/dma: Factor out remapped pages lookup To: Christoph Hellwig Cc: Joerg Roedel , Catalin Marinas , Will Deacon , Tom Lendacky , iommu@lists.linux-foundation.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org References: <20190422175942.18788-1-hch@lst.de> <20190422175942.18788-12-hch@lst.de> From: Robin Murphy Message-ID: Date: Mon, 29 Apr 2019 14:05:46 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.6.1 MIME-Version: 1.0 In-Reply-To: <20190422175942.18788-12-hch@lst.de> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-GB Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 22/04/2019 18:59, Christoph Hellwig wrote: > From: Robin Murphy > > Since we duplicate the find_vm_area() logic a few times in places where > we only care aboute the pages, factor out a helper to abstract it. > > Signed-off-by: Robin Murphy > [hch: don't warn when not finding a region, as we'll rely on that later] Yeah, I did think about that and the things which it might make a little easier, but preserved it as-is for the sake of keeping my modifications quick and simple. TBH I'm now feeling more inclined to drop the WARNs entirely at this point, since it's not like there's ever been any general guarantee that freeing the wrong thing shouldn't just crash, but that's something we can easily come back to later if need be. Robin. > Signed-off-by: Christoph Hellwig > --- > drivers/iommu/dma-iommu.c | 32 ++++++++++++++++++++------------ > 1 file changed, 20 insertions(+), 12 deletions(-) > > diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c > index b52c5d6be7b4..8e2d9733113e 100644 > --- a/drivers/iommu/dma-iommu.c > +++ b/drivers/iommu/dma-iommu.c > @@ -525,6 +525,15 @@ static struct page **__iommu_dma_alloc_pages(struct device *dev, > return pages; > } > > +static struct page **__iommu_dma_get_pages(void *cpu_addr) > +{ > + struct vm_struct *area = find_vm_area(cpu_addr); > + > + if (!area || !area->pages) > + return NULL; > + return area->pages; > +} > + > /** > * iommu_dma_free - Free a buffer allocated by __iommu_dma_alloc() > * @dev: Device which owns this buffer > @@ -1023,11 +1032,11 @@ static void iommu_dma_free(struct device *dev, size_t size, void *cpu_addr, > dma_release_from_contiguous(dev, page, size >> PAGE_SHIFT); > dma_common_free_remap(cpu_addr, size, VM_USERMAP); > } else if (is_vmalloc_addr(cpu_addr)){ > - struct vm_struct *area = find_vm_area(cpu_addr); > + struct page **pages = __iommu_dma_get_pages(cpu_addr); > > - if (WARN_ON(!area || !area->pages)) > + if (WARN_ON(!pages)) > return; > - __iommu_dma_free(dev, area->pages, iosize, &handle); > + __iommu_dma_free(dev, pages, iosize, &handle); > dma_common_free_remap(cpu_addr, size, VM_USERMAP); > } else { > __iommu_dma_unmap(dev, handle, iosize); > @@ -1049,7 +1058,7 @@ static int iommu_dma_mmap(struct device *dev, struct vm_area_struct *vma, > { > unsigned long nr_pages = PAGE_ALIGN(size) >> PAGE_SHIFT; > unsigned long off = vma->vm_pgoff; > - struct vm_struct *area; > + struct page **pages; > int ret; > > vma->vm_page_prot = arch_dma_mmap_pgprot(dev, vma->vm_page_prot, attrs); > @@ -1074,11 +1083,10 @@ static int iommu_dma_mmap(struct device *dev, struct vm_area_struct *vma, > return __iommu_dma_mmap_pfn(vma, pfn, size); > } > > - area = find_vm_area(cpu_addr); > - if (WARN_ON(!area || !area->pages)) > + pages = __iommu_dma_get_pages(cpu_addr); > + if (WARN_ON_ONCE(!pages)) > return -ENXIO; > - > - return __iommu_dma_mmap(area->pages, size, vma); > + return __iommu_dma_mmap(pages, size, vma); > } > > static int __iommu_dma_get_sgtable_page(struct sg_table *sgt, struct page *page, > @@ -1096,7 +1104,7 @@ static int iommu_dma_get_sgtable(struct device *dev, struct sg_table *sgt, > unsigned long attrs) > { > unsigned int count = PAGE_ALIGN(size) >> PAGE_SHIFT; > - struct vm_struct *area = find_vm_area(cpu_addr); > + struct page **pages; > > if (!is_vmalloc_addr(cpu_addr)) { > struct page *page = virt_to_page(cpu_addr); > @@ -1112,10 +1120,10 @@ static int iommu_dma_get_sgtable(struct device *dev, struct sg_table *sgt, > return __iommu_dma_get_sgtable_page(sgt, page, size); > } > > - if (WARN_ON(!area || !area->pages)) > + pages = __iommu_dma_get_pages(cpu_addr); > + if (WARN_ON_ONCE(!pages)) > return -ENXIO; > - > - return sg_alloc_table_from_pages(sgt, area->pages, count, 0, size, > + return sg_alloc_table_from_pages(sgt, pages, count, 0, size, > GFP_KERNEL); > } > >