linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: Gioh Kim <gioh.kim@lge.com>
To: Michal Nazarewicz <mina86@mina86.com>,
	Joonsoo Kim <iamjoonsoo.kim@lge.com>
Cc: "Marek Szyprowski" <m.szyprowski@samsung.com>,
	linux-mm@kvack.org, linux-kernel@vger.kernel.org,
	"Heesub Shin" <heesub.shin@samsung.com>,
	"Mel Gorman" <mgorman@suse.de>,
	"Johannes Weiner" <hannes@cmpxchg.org>, 이건호 <gunho.lee@lge.com>,
	"'Chanho Min'" <chanho.min@lge.com>
Subject: Re: [RFC PATCH] arm: dma-mapping: fallback allocation for cma failure
Date: Thu, 22 May 2014 10:02:51 +0900	[thread overview]
Message-ID: <537D4CBB.80305@lge.com> (raw)
In-Reply-To: <xa1td2f699j4.fsf@mina86.com>

I appreciate your comments.
The previous patch was ugly. But now it's beautiful! Just 3 lines!

I'm not familiar with kernel patch process.
Can I have your name at Signed-off-by: line?
What tag do I have to write your name in?


--------------------------------- 8< ----------------------------------------------
 From 135c986cfaa5a7291519308b3d47e58bf9f5af25 Mon Sep 17 00:00:00 2001
From: Gioh Kim <gioh.kim@lge.com>
Date: Tue, 20 May 2014 14:16:20 +0900
Subject: [PATCH] arm: dma-mapping: add checking cma area initialized

If CMA is turned on and CMA size is set to zero, kernel should
behave as if CMA was not enabled at compile time.
Every dma allocation should check existence of cma area
before requesting memory.

Signed-off-by: Gioh Kim <gioh.kim@lge.com>
Signed-off-by: Joonsoo Kim <iamjoonsoo.kim@lge.com>
---
  arch/arm/mm/dma-mapping.c |    7 ++++---
  1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c
index 18e98df..9173a13 100644
--- a/arch/arm/mm/dma-mapping.c
+++ b/arch/arm/mm/dma-mapping.c
@@ -390,12 +390,13 @@ static int __init atomic_pool_init(void)
         if (!pages)
                 goto no_pages;

-       if (IS_ENABLED(CONFIG_DMA_CMA))
+       if (dev_get_cma_area(NULL))
                 ptr = __alloc_from_contiguous(NULL, pool->size, prot, &page,
                                               atomic_pool_init);
         else
                 ptr = __alloc_remap_buffer(NULL, pool->size, gfp, prot, &page,
                                            atomic_pool_init);
+
         if (ptr) {
                 int i;

@@ -701,7 +702,7 @@ static void *__dma_alloc(struct device *dev, size_t size, dma_addr_t *handle,
                 addr = __alloc_simple_buffer(dev, size, gfp, &page);
         else if (!(gfp & __GFP_WAIT))
                 addr = __alloc_from_pool(size, &page);
-       else if (!IS_ENABLED(CONFIG_DMA_CMA))
+       else if (!dev_get_cma_area(dev))
                 addr = __alloc_remap_buffer(dev, size, gfp, prot, &page, caller);
         else
                 addr = __alloc_from_contiguous(dev, size, prot, &page, caller);
@@ -790,7 +791,7 @@ static void __arm_dma_free(struct device *dev, size_t size, void *cpu_addr,
                 __dma_free_buffer(page, size);
         } else if (__free_from_pool(cpu_addr, size)) {
                 return;
-       } else if (!IS_ENABLED(CONFIG_DMA_CMA)) {
+       } else if (!dev_get_cma_area(dev)) {
                 __dma_free_remap(cpu_addr, size);
                 __dma_free_buffer(page, size);
         } else {
--
1.7.9.5


2014-05-22 i??i ? 5:11, Michal Nazarewicz i?' e,?:
> On Wed, May 21 2014, Gioh Kim <gioh.kim@lge.com> wrote:
>> Date: Tue, 20 May 2014 14:16:20 +0900
>> Subject: [PATCH] arm: dma-mapping: add checking cma area initialized
>>
>> If CMA is turned on and CMA size is set to zero, kernel should
>> behave as if CMA was not enabled at compile time.
>> Every dma allocation should check existence of cma area
>> before requesting memory.
>>
>> Signed-off-by: Gioh Kim <gioh.kim@lge.com>
>> Signed-off-by: Joonsoo Kim <iamjoonsoo.kim@lge.com>
>
> Some minor comments.  Also, I'd love for someone more experienced with
> ARM to take a look at this as well.
>
>> ---
>>    arch/arm/mm/dma-mapping.c |   12 ++++++++----
>>    1 file changed, 8 insertions(+), 4 deletions(-)
>>
>> diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c
>> index 18e98df..61f7b93 100644
>> --- a/arch/arm/mm/dma-mapping.c
>> +++ b/arch/arm/mm/dma-mapping.c
>> @@ -379,7 +379,7 @@ static int __init atomic_pool_init(void)
>>           unsigned long *bitmap;
>>           struct page *page;
>>           struct page **pages;
>> -       void *ptr;
>> +       void *ptr = NULL;
>
> This is unnecessary any more.
>
>>           int bitmap_size = BITS_TO_LONGS(nr_pages) * sizeof(long);
>>
>>           bitmap = kzalloc(bitmap_size, GFP_KERNEL);
>> @@ -390,12 +390,13 @@ static int __init atomic_pool_init(void)
>>           if (!pages)
>>                   goto no_pages;
>>
>> -       if (IS_ENABLED(CONFIG_DMA_CMA))
>> +       if (IS_ENABLED(CONFIG_DMA_CMA) && dma_contiguous_default_area)
>
> +	if (dev_get_cma_area(NULL))
>
> dev_get_cma_area returns NULL if !IS_ENABLED(CONFIG_DMA_CMA) so there's
> no need to check it explicitly.  And with NULL argument,
> deg_get_cma_area returns the default area.
>
>>                   ptr = __alloc_from_contiguous(NULL, pool->size, prot, &page,
>>                                                 atomic_pool_init);
>>           else
>>                   ptr = __alloc_remap_buffer(NULL, pool->size, gfp, prot, &page,
>>                                              atomic_pool_init);
>> +
>>           if (ptr) {
>>                   int i;
>>
>> @@ -669,6 +670,7 @@ static void *__dma_alloc(struct device *dev, size_t size, dma_addr_t *handle,
>>           u64 mask = get_coherent_dma_mask(dev);
>>           struct page *page = NULL;
>>           void *addr;
>> +       struct cma *cma = dev_get_cma_area(dev);
>>
>>    #ifdef CONFIG_DMA_API_DEBUG
>>           u64 limit = (mask + 1) & ~mask;
>> @@ -701,7 +703,7 @@ static void *__dma_alloc(struct device *dev, size_t size, dma_addr_t *handle,
>>                   addr = __alloc_simple_buffer(dev, size, gfp, &page);
>>           else if (!(gfp & __GFP_WAIT))
>>                   addr = __alloc_from_pool(size, &page);
>> -       else if (!IS_ENABLED(CONFIG_DMA_CMA))
>> +       else if (!IS_ENABLED(CONFIG_DMA_CMA) || !cma)
>
> Like above, just do:
>
> +	else if (!dev_get_cma_area(dev))
>
> This will also allow to drop the a??cmaa?? variable above.
>
>>                   addr = __alloc_remap_buffer(dev, size, gfp, prot, &page, caller);
>>           else
>>                   addr = __alloc_from_contiguous(dev, size, prot, &page, caller);
>> @@ -780,6 +782,7 @@ static void __arm_dma_free(struct device *dev, size_t size, void *cpu_addr,
>>                              bool is_coherent)
>>    {
>>           struct page *page = pfn_to_page(dma_to_pfn(dev, handle));
>> +       struct cma *cma = dev_get_cma_area(dev);
>>
>>           if (dma_release_from_coherent(dev, get_order(size), cpu_addr))
>>                   return;
>> @@ -790,7 +793,7 @@ static void __arm_dma_free(struct device *dev, size_t size, void *cpu_addr,
>>                   __dma_free_buffer(page, size);
>>           } else if (__free_from_pool(cpu_addr, size)) {
>>                   return;
>> -       } else if (!IS_ENABLED(CONFIG_DMA_CMA)) {
>> +       } else if (!IS_ENABLED(CONFIG_DMA_CMA) || !cma) {
>
> Ditto.
>
>>                   __dma_free_remap(cpu_addr, size);
>>                   __dma_free_buffer(page, size);
>>           } else {
>> @@ -798,6 +801,7 @@ static void __arm_dma_free(struct device *dev, size_t size, void *cpu_addr,
>>                    * Non-atomic allocations cannot be freed with IRQs disabled
>>                    */
>>                   WARN_ON(irqs_disabled());
>> +
>
> Unrelated change.
>
>>                   __free_from_contiguous(dev, page, cpu_addr, size);
>>           }
>>    }
>> --
>> 1.7.9.5
>

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

  reply	other threads:[~2014-05-22  1:02 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-05-20  5:57 [RFC PATCH] arm: dma-mapping: fallback allocation for cma failure Gioh Kim
2014-05-20  6:52 ` Joonsoo Kim
2014-05-20  7:05   ` Gioh Kim
2014-05-20  8:32     ` Joonsoo Kim
2014-05-20 23:39       ` Gioh Kim
2014-05-20 18:22   ` Michal Nazarewicz
2014-05-21  0:24     ` Gioh Kim
2014-05-21  8:06     ` Gioh Kim
2014-05-21 20:11       ` Michal Nazarewicz
2014-05-22  1:02         ` Gioh Kim [this message]
2014-05-22  3:22           ` Michal Nazarewicz
2014-05-22  4:30             ` Gioh Kim

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=537D4CBB.80305@lge.com \
    --to=gioh.kim@lge.com \
    --cc=chanho.min@lge.com \
    --cc=gunho.lee@lge.com \
    --cc=hannes@cmpxchg.org \
    --cc=heesub.shin@samsung.com \
    --cc=iamjoonsoo.kim@lge.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=m.szyprowski@samsung.com \
    --cc=mgorman@suse.de \
    --cc=mina86@mina86.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).