iommu.lists.linux-foundation.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] dma-contiguous: cleanup dma_alloc_contiguous
@ 2020-07-22 14:43 Christoph Hellwig
  2020-07-23  6:00 ` Nicolin Chen
  0 siblings, 1 reply; 3+ messages in thread
From: Christoph Hellwig @ 2020-07-22 14:43 UTC (permalink / raw)
  To: iommu; +Cc: robin.murphy

Split out a cma_alloc_aligned helper to deal with the "interesting"
calling conventions for cma_alloc, which then allows to the main
function to be written straight forward.  This also takes advantage
of the fact that NULL dev arguments have been gone from the DMA API
for a while.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 kernel/dma/contiguous.c | 31 ++++++++++++++-----------------
 1 file changed, 14 insertions(+), 17 deletions(-)

diff --git a/kernel/dma/contiguous.c b/kernel/dma/contiguous.c
index 15bc5026c485f2..f16b8d3f9932de 100644
--- a/kernel/dma/contiguous.c
+++ b/kernel/dma/contiguous.c
@@ -215,6 +215,13 @@ bool dma_release_from_contiguous(struct device *dev, struct page *pages,
 	return cma_release(dev_get_cma_area(dev), pages, count);
 }
 
+static struct page *cma_alloc_aligned(struct cma *cma, size_t size, gfp_t gfp)
+{
+	return cma_alloc(dma_contiguous_default_area, size >> PAGE_SHIFT,
+			 min_t(size_t, get_order(size), CONFIG_CMA_ALIGNMENT),
+			 gfp & __GFP_NOWARN);
+}
+
 /**
  * dma_alloc_contiguous() - allocate contiguous pages
  * @dev:   Pointer to device for which the allocation is performed.
@@ -231,24 +238,14 @@ bool dma_release_from_contiguous(struct device *dev, struct page *pages,
  */
 struct page *dma_alloc_contiguous(struct device *dev, size_t size, gfp_t gfp)
 {
-	size_t count = size >> PAGE_SHIFT;
-	struct page *page = NULL;
-	struct cma *cma = NULL;
-
-	if (dev && dev->cma_area)
-		cma = dev->cma_area;
-	else if (count > 1)
-		cma = dma_contiguous_default_area;
-
 	/* CMA can be used only in the context which permits sleeping */
-	if (cma && gfpflags_allow_blocking(gfp)) {
-		size_t align = get_order(size);
-		size_t cma_align = min_t(size_t, align, CONFIG_CMA_ALIGNMENT);
-
-		page = cma_alloc(cma, count, cma_align, gfp & __GFP_NOWARN);
-	}
-
-	return page;
+	if (!gfpflags_allow_blocking(gfp))
+		return NULL;
+	if (dev->cma_area)
+		return cma_alloc_aligned(dev->cma_area, size, gfp);
+	if (size <= PAGE_SIZE || !dma_contiguous_default_area)
+		return NULL;
+	return cma_alloc_aligned(dma_contiguous_default_area, size, gfp);
 }
 
 /**
-- 
2.27.0

_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] dma-contiguous: cleanup dma_alloc_contiguous
  2020-07-22 14:43 [PATCH] dma-contiguous: cleanup dma_alloc_contiguous Christoph Hellwig
@ 2020-07-23  6:00 ` Nicolin Chen
  2020-07-23  6:09   ` Christoph Hellwig
  0 siblings, 1 reply; 3+ messages in thread
From: Nicolin Chen @ 2020-07-23  6:00 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: iommu, robin.murphy

On Wed, Jul 22, 2020 at 04:43:07PM +0200, Christoph Hellwig wrote:
> Split out a cma_alloc_aligned helper to deal with the "interesting"
> calling conventions for cma_alloc, which then allows to the main
> function to be written straight forward.  This also takes advantage
> of the fact that NULL dev arguments have been gone from the DMA API
> for a while.
> 
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---
>  kernel/dma/contiguous.c | 31 ++++++++++++++-----------------
>  1 file changed, 14 insertions(+), 17 deletions(-)
> 
> diff --git a/kernel/dma/contiguous.c b/kernel/dma/contiguous.c
> index 15bc5026c485f2..f16b8d3f9932de 100644
> --- a/kernel/dma/contiguous.c
> +++ b/kernel/dma/contiguous.c
> @@ -215,6 +215,13 @@ bool dma_release_from_contiguous(struct device *dev, struct page *pages,
>  	return cma_release(dev_get_cma_area(dev), pages, count);
>  }
>  
> +static struct page *cma_alloc_aligned(struct cma *cma, size_t size, gfp_t gfp)
> +{
> +	return cma_alloc(dma_contiguous_default_area, size >> PAGE_SHIFT,

Probably should be 'cma' here instead of 'dma_contiguous_default_area'?
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] dma-contiguous: cleanup dma_alloc_contiguous
  2020-07-23  6:00 ` Nicolin Chen
@ 2020-07-23  6:09   ` Christoph Hellwig
  0 siblings, 0 replies; 3+ messages in thread
From: Christoph Hellwig @ 2020-07-23  6:09 UTC (permalink / raw)
  To: Nicolin Chen; +Cc: iommu, robin.murphy, Christoph Hellwig

On Wed, Jul 22, 2020 at 11:00:48PM -0700, Nicolin Chen wrote:
> On Wed, Jul 22, 2020 at 04:43:07PM +0200, Christoph Hellwig wrote:
> > Split out a cma_alloc_aligned helper to deal with the "interesting"
> > calling conventions for cma_alloc, which then allows to the main
> > function to be written straight forward.  This also takes advantage
> > of the fact that NULL dev arguments have been gone from the DMA API
> > for a while.
> > 
> > Signed-off-by: Christoph Hellwig <hch@lst.de>
> > ---
> >  kernel/dma/contiguous.c | 31 ++++++++++++++-----------------
> >  1 file changed, 14 insertions(+), 17 deletions(-)
> > 
> > diff --git a/kernel/dma/contiguous.c b/kernel/dma/contiguous.c
> > index 15bc5026c485f2..f16b8d3f9932de 100644
> > --- a/kernel/dma/contiguous.c
> > +++ b/kernel/dma/contiguous.c
> > @@ -215,6 +215,13 @@ bool dma_release_from_contiguous(struct device *dev, struct page *pages,
> >  	return cma_release(dev_get_cma_area(dev), pages, count);
> >  }
> >  
> > +static struct page *cma_alloc_aligned(struct cma *cma, size_t size, gfp_t gfp)
> > +{
> > +	return cma_alloc(dma_contiguous_default_area, size >> PAGE_SHIFT,
> 
> Probably should be 'cma' here instead of 'dma_contiguous_default_area'?

Yes.  If only I could test the per-device CMAs on a normal x86 setup :)
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2020-07-23  6:09 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-07-22 14:43 [PATCH] dma-contiguous: cleanup dma_alloc_contiguous Christoph Hellwig
2020-07-23  6:00 ` Nicolin Chen
2020-07-23  6:09   ` Christoph Hellwig

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).