From: catalin.marinas@arm.com (Catalin Marinas)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCHv6 3/5] common: dma-mapping: Introduce common remapping functions
Date: Mon, 11 Aug 2014 19:05:42 +0100 [thread overview]
Message-ID: <20140811180542.GI13871@arm.com> (raw)
In-Reply-To: <53E55C86.3040705@codeaurora.org>
On Sat, Aug 09, 2014 at 12:25:58AM +0100, Laura Abbott wrote:
> On 8/8/2014 3:45 PM, Andrew Morton wrote:
> > On Fri, 8 Aug 2014 13:23:15 -0700 Laura Abbott <lauraa@codeaurora.org> wrote:
> >> For architectures without coherent DMA, memory for DMA may
> >> need to be remapped with coherent attributes. Factor out
> >> the the remapping code from arm and put it in a
> >> common location to reduce code duplication.
> >>
> >> As part of this, the arm APIs are now migrated away from
> >> ioremap_page_range to the common APIs which use map_vm_area for remapping.
> >> This should be an equivalent change and using map_vm_area is more
> >> correct as ioremap_page_range is intended to bring in io addresses
> >> into the cpu space and not regular kernel managed memory.
> >>
> >> ...
> >>
> >> @@ -267,3 +269,68 @@ int dma_common_mmap(struct device *dev, struct vm_area_struct *vma,
> >> return ret;
> >> }
> >> EXPORT_SYMBOL(dma_common_mmap);
> >> +
> >> +/*
> >> + * remaps an allocated contiguous region into another vm_area.
> >> + * Cannot be used in non-sleeping contexts
> >> + */
> >> +
> >> +void *dma_common_contiguous_remap(struct page *page, size_t size,
> >> + unsigned long vm_flags,
> >> + pgprot_t prot, const void *caller)
> >> +{
> >> + int i;
> >> + struct page **pages;
> >> + void *ptr;
> >> +
> >> + pages = kmalloc(sizeof(struct page *) << get_order(size), GFP_KERNEL);
> >> + if (!pages)
> >> + return NULL;
> >> +
> >> + for (i = 0; i < (size >> PAGE_SHIFT); i++)
> >> + pages[i] = page + i;
> >
> > Assumes a single mem_map[] array. That's not the case for sparsemem
> > (at least).
>
> Good point. I guess the best option is to increment via pfn and call
> pfn_to_page. Either that or go back to slightly abusing
> ioremap_page_range to remap normal memory.
I now noticed you suggested the pfn_to_page(). I think this should work
and it's better than ioremap_page_range().
--
Catalin
WARNING: multiple messages have this Message-ID (diff)
From: Catalin Marinas <catalin.marinas@arm.com>
To: Laura Abbott <lauraa@codeaurora.org>
Cc: Andrew Morton <akpm@linux-foundation.org>,
David Riley <davidriley@chromium.org>,
Arnd Bergmann <arnd@arndb.de>, Will Deacon <Will.Deacon@arm.com>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"linux-mm@kvack.org" <linux-mm@kvack.org>,
Thierry Reding <thierry.reding@gmail.com>,
Ritesh Harjain <ritesh.harjani@gmail.com>,
Russell King <linux@arm.linux.org.uk>,
"linux-arm-kernel@lists.infradead.org"
<linux-arm-kernel@lists.infradead.org>
Subject: Re: [PATCHv6 3/5] common: dma-mapping: Introduce common remapping functions
Date: Mon, 11 Aug 2014 19:05:42 +0100 [thread overview]
Message-ID: <20140811180542.GI13871@arm.com> (raw)
In-Reply-To: <53E55C86.3040705@codeaurora.org>
On Sat, Aug 09, 2014 at 12:25:58AM +0100, Laura Abbott wrote:
> On 8/8/2014 3:45 PM, Andrew Morton wrote:
> > On Fri, 8 Aug 2014 13:23:15 -0700 Laura Abbott <lauraa@codeaurora.org> wrote:
> >> For architectures without coherent DMA, memory for DMA may
> >> need to be remapped with coherent attributes. Factor out
> >> the the remapping code from arm and put it in a
> >> common location to reduce code duplication.
> >>
> >> As part of this, the arm APIs are now migrated away from
> >> ioremap_page_range to the common APIs which use map_vm_area for remapping.
> >> This should be an equivalent change and using map_vm_area is more
> >> correct as ioremap_page_range is intended to bring in io addresses
> >> into the cpu space and not regular kernel managed memory.
> >>
> >> ...
> >>
> >> @@ -267,3 +269,68 @@ int dma_common_mmap(struct device *dev, struct vm_area_struct *vma,
> >> return ret;
> >> }
> >> EXPORT_SYMBOL(dma_common_mmap);
> >> +
> >> +/*
> >> + * remaps an allocated contiguous region into another vm_area.
> >> + * Cannot be used in non-sleeping contexts
> >> + */
> >> +
> >> +void *dma_common_contiguous_remap(struct page *page, size_t size,
> >> + unsigned long vm_flags,
> >> + pgprot_t prot, const void *caller)
> >> +{
> >> + int i;
> >> + struct page **pages;
> >> + void *ptr;
> >> +
> >> + pages = kmalloc(sizeof(struct page *) << get_order(size), GFP_KERNEL);
> >> + if (!pages)
> >> + return NULL;
> >> +
> >> + for (i = 0; i < (size >> PAGE_SHIFT); i++)
> >> + pages[i] = page + i;
> >
> > Assumes a single mem_map[] array. That's not the case for sparsemem
> > (at least).
>
> Good point. I guess the best option is to increment via pfn and call
> pfn_to_page. Either that or go back to slightly abusing
> ioremap_page_range to remap normal memory.
I now noticed you suggested the pfn_to_page(). I think this should work
and it's better than ioremap_page_range().
--
Catalin
--
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>
WARNING: multiple messages have this Message-ID (diff)
From: Catalin Marinas <catalin.marinas@arm.com>
To: Laura Abbott <lauraa@codeaurora.org>
Cc: Andrew Morton <akpm@linux-foundation.org>,
David Riley <davidriley@chromium.org>,
Arnd Bergmann <arnd@arndb.de>, Will Deacon <Will.Deacon@arm.com>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"linux-mm@kvack.org" <linux-mm@kvack.org>,
Thierry Reding <thierry.reding@gmail.com>,
Ritesh Harjain <ritesh.harjani@gmail.com>,
Russell King <linux@arm.linux.org.uk>,
"linux-arm-kernel@lists.infradead.org"
<linux-arm-kernel@lists.infradead.org>
Subject: Re: [PATCHv6 3/5] common: dma-mapping: Introduce common remapping functions
Date: Mon, 11 Aug 2014 19:05:42 +0100 [thread overview]
Message-ID: <20140811180542.GI13871@arm.com> (raw)
In-Reply-To: <53E55C86.3040705@codeaurora.org>
On Sat, Aug 09, 2014 at 12:25:58AM +0100, Laura Abbott wrote:
> On 8/8/2014 3:45 PM, Andrew Morton wrote:
> > On Fri, 8 Aug 2014 13:23:15 -0700 Laura Abbott <lauraa@codeaurora.org> wrote:
> >> For architectures without coherent DMA, memory for DMA may
> >> need to be remapped with coherent attributes. Factor out
> >> the the remapping code from arm and put it in a
> >> common location to reduce code duplication.
> >>
> >> As part of this, the arm APIs are now migrated away from
> >> ioremap_page_range to the common APIs which use map_vm_area for remapping.
> >> This should be an equivalent change and using map_vm_area is more
> >> correct as ioremap_page_range is intended to bring in io addresses
> >> into the cpu space and not regular kernel managed memory.
> >>
> >> ...
> >>
> >> @@ -267,3 +269,68 @@ int dma_common_mmap(struct device *dev, struct vm_area_struct *vma,
> >> return ret;
> >> }
> >> EXPORT_SYMBOL(dma_common_mmap);
> >> +
> >> +/*
> >> + * remaps an allocated contiguous region into another vm_area.
> >> + * Cannot be used in non-sleeping contexts
> >> + */
> >> +
> >> +void *dma_common_contiguous_remap(struct page *page, size_t size,
> >> + unsigned long vm_flags,
> >> + pgprot_t prot, const void *caller)
> >> +{
> >> + int i;
> >> + struct page **pages;
> >> + void *ptr;
> >> +
> >> + pages = kmalloc(sizeof(struct page *) << get_order(size), GFP_KERNEL);
> >> + if (!pages)
> >> + return NULL;
> >> +
> >> + for (i = 0; i < (size >> PAGE_SHIFT); i++)
> >> + pages[i] = page + i;
> >
> > Assumes a single mem_map[] array. That's not the case for sparsemem
> > (at least).
>
> Good point. I guess the best option is to increment via pfn and call
> pfn_to_page. Either that or go back to slightly abusing
> ioremap_page_range to remap normal memory.
I now noticed you suggested the pfn_to_page(). I think this should work
and it's better than ioremap_page_range().
--
Catalin
next prev parent reply other threads:[~2014-08-11 18:05 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-08-08 20:23 [PATCHv6 1/5] lib/genalloc.c: Add power aligned algorithm Laura Abbott
2014-08-08 20:23 ` Laura Abbott
2014-08-08 20:23 ` Laura Abbott
2014-08-08 20:23 ` [PATCHv6 2/5] lib/genalloc.c: Add genpool range check function Laura Abbott
2014-08-08 20:23 ` Laura Abbott
2014-08-08 20:23 ` Laura Abbott
2014-08-08 22:40 ` Andrew Morton
2014-08-08 22:40 ` Andrew Morton
2014-08-08 22:40 ` Andrew Morton
2014-08-08 20:23 ` [PATCHv6 3/5] common: dma-mapping: Introduce common remapping functions Laura Abbott
2014-08-08 20:23 ` Laura Abbott
2014-08-08 20:23 ` Laura Abbott
2014-08-08 22:45 ` Andrew Morton
2014-08-08 22:45 ` Andrew Morton
2014-08-08 22:45 ` Andrew Morton
2014-08-08 23:25 ` Laura Abbott
2014-08-08 23:25 ` Laura Abbott
2014-08-08 23:25 ` Laura Abbott
2014-08-11 18:05 ` Catalin Marinas [this message]
2014-08-11 18:05 ` Catalin Marinas
2014-08-11 18:05 ` Catalin Marinas
2014-08-11 18:04 ` Catalin Marinas
2014-08-11 18:04 ` Catalin Marinas
2014-08-11 18:04 ` Catalin Marinas
2014-08-08 20:23 ` [PATCHv6 4/5] arm: use genalloc for the atomic pool Laura Abbott
2014-08-08 20:23 ` Laura Abbott
2014-08-08 20:23 ` Laura Abbott
2014-08-08 20:23 ` [PATCHv6 5/5] arm64: Add atomic pool for non-coherent and CMA allocations Laura Abbott
2014-08-08 20:23 ` Laura Abbott
2014-08-08 20:23 ` Laura Abbott
2014-08-08 22:36 ` [PATCHv6 1/5] lib/genalloc.c: Add power aligned algorithm Andrew Morton
2014-08-08 22:36 ` Andrew Morton
2014-08-08 22:36 ` Andrew Morton
2014-08-08 22:41 ` Laura Abbott
2014-08-08 22:41 ` Laura Abbott
2014-08-08 22:41 ` Laura Abbott
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=20140811180542.GI13871@arm.com \
--to=catalin.marinas@arm.com \
--cc=linux-arm-kernel@lists.infradead.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.