From: Marek Szyprowski <m.szyprowski-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
To: Akinobu Mita
<akinobu.mita-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>,
linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org
Cc: Andi Kleen <andi-Vw/NltI1exuRpAAqCnN02g@public.gmane.org>,
x86-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org,
iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org,
Ingo Molnar <mingo-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>,
"H. Peter Anvin" <hpa-YMNOUZJC4hwAvxtiuMwx3w@public.gmane.org>,
Thomas Gleixner <tglx-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org>,
David Woodhouse <dwmw2-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org>
Subject: Re: [PATCH v2 3/5] intel-iommu: integrate DMA CMA
Date: Thu, 16 Jan 2014 15:28:04 +0100 [thread overview]
Message-ID: <52D7EC74.7030401@samsung.com> (raw)
In-Reply-To: <1389708830-5841-4-git-send-email-akinobu.mita-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Hello,
On 2014-01-14 15:13, Akinobu Mita wrote:
> This adds support for the DMA Contiguous Memory Allocator for intel-iommu.
> This change enables dma_alloc_coherent() to allocate big contiguous
> memory.
>
> It is achieved in the same way as nommu_dma_ops currently does, i.e.
> trying to allocate memory by dma_alloc_from_contiguous() and alloc_pages()
> is used as a fallback.
>
> Cc: Marek Szyprowski <m.szyprowski-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
> Cc: Konrad Rzeszutek Wilk <konrad.wilk-QHcLZuEGTsvQT0dZR+AlfA@public.gmane.org>
> Cc: David Woodhouse <dwmw2-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org>
> Cc: Don Dutile <ddutile-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
> Cc: Thomas Gleixner <tglx-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org>
> Cc: Ingo Molnar <mingo-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
> Cc: "H. Peter Anvin" <hpa-YMNOUZJC4hwAvxtiuMwx3w@public.gmane.org>
> Cc: Andi Kleen <andi-Vw/NltI1exuRpAAqCnN02g@public.gmane.org>
> Cc: x86-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org
> Cc: iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org
> Signed-off-by: Akinobu Mita <akinobu.mita-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
> ---
> No change from the previous version
>
> drivers/iommu/intel-iommu.c | 32 ++++++++++++++++++++++++--------
> 1 file changed, 24 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
> index fd426ca..172c2b0 100644
> --- a/drivers/iommu/intel-iommu.c
> +++ b/drivers/iommu/intel-iommu.c
> @@ -3004,7 +3004,7 @@ static void *intel_alloc_coherent(struct device *hwdev, size_t size,
> dma_addr_t *dma_handle, gfp_t flags,
> struct dma_attrs *attrs)
> {
> - void *vaddr;
> + struct page *page = NULL;
> int order;
>
> size = PAGE_ALIGN(size);
> @@ -3019,17 +3019,31 @@ static void *intel_alloc_coherent(struct device *hwdev, size_t size,
> flags |= GFP_DMA32;
> }
>
> - vaddr = (void *)__get_free_pages(flags, order);
> - if (!vaddr)
> + if (!(flags & GFP_ATOMIC)) {
GFP_ATOMIC is not a flag, so please change the above check to:
if (flags & __GFP_WAIT)
I will also fix the similar issue in arch/x86/kernel/pci-dma.c
> + unsigned int count = size >> PAGE_SHIFT;
> +
> + page = dma_alloc_from_contiguous(hwdev, count, order);
> + if (page && iommu_no_mapping(hwdev) &&
> + page_to_phys(page) + size > hwdev->coherent_dma_mask) {
> + dma_release_from_contiguous(hwdev, page, count);
> + page = NULL;
> + }
> + }
> +
> + if (!page)
> + page = alloc_pages(flags, order);
> + if (!page)
> return NULL;
> - memset(vaddr, 0, size);
> + memset(page_address(page), 0, size);
>
> - *dma_handle = __intel_map_single(hwdev, virt_to_bus(vaddr), size,
> + *dma_handle = __intel_map_single(hwdev, page_to_phys(page), size,
> DMA_BIDIRECTIONAL,
> hwdev->coherent_dma_mask);
> if (*dma_handle)
> - return vaddr;
> - free_pages((unsigned long)vaddr, order);
> + return page_address(page);
> + if (!dma_release_from_contiguous(hwdev, page, size >> PAGE_SHIFT))
> + __free_pages(page, order);
> +
> return NULL;
> }
>
> @@ -3037,12 +3051,14 @@ static void intel_free_coherent(struct device *hwdev, size_t size, void *vaddr,
> dma_addr_t dma_handle, struct dma_attrs *attrs)
> {
> int order;
> + struct page *page = virt_to_page(vaddr);
>
> size = PAGE_ALIGN(size);
> order = get_order(size);
>
> intel_unmap_page(hwdev, dma_handle, size, DMA_BIDIRECTIONAL, NULL);
> - free_pages((unsigned long)vaddr, order);
> + if (!dma_release_from_contiguous(hwdev, page, size >> PAGE_SHIFT))
> + __free_pages(page, order);
> }
>
> static void intel_unmap_sg(struct device *hwdev, struct scatterlist *sglist,
Best regards
--
Marek Szyprowski, PhD
Samsung R&D Institute Poland
WARNING: multiple messages have this Message-ID (diff)
From: Marek Szyprowski <m.szyprowski@samsung.com>
To: Akinobu Mita <akinobu.mita@gmail.com>,
linux-kernel@vger.kernel.org, akpm@linux-foundation.org
Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
David Woodhouse <dwmw2@infradead.org>,
Don Dutile <ddutile@redhat.com>,
Thomas Gleixner <tglx@linutronix.de>,
Ingo Molnar <mingo@redhat.com>, "H. Peter Anvin" <hpa@zytor.com>,
Andi Kleen <andi@firstfloor.org>,
x86@kernel.org, iommu@lists.linux-foundation.org
Subject: Re: [PATCH v2 3/5] intel-iommu: integrate DMA CMA
Date: Thu, 16 Jan 2014 15:28:04 +0100 [thread overview]
Message-ID: <52D7EC74.7030401@samsung.com> (raw)
In-Reply-To: <1389708830-5841-4-git-send-email-akinobu.mita@gmail.com>
Hello,
On 2014-01-14 15:13, Akinobu Mita wrote:
> This adds support for the DMA Contiguous Memory Allocator for intel-iommu.
> This change enables dma_alloc_coherent() to allocate big contiguous
> memory.
>
> It is achieved in the same way as nommu_dma_ops currently does, i.e.
> trying to allocate memory by dma_alloc_from_contiguous() and alloc_pages()
> is used as a fallback.
>
> Cc: Marek Szyprowski <m.szyprowski@samsung.com>
> Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> Cc: David Woodhouse <dwmw2@infradead.org>
> Cc: Don Dutile <ddutile@redhat.com>
> Cc: Thomas Gleixner <tglx@linutronix.de>
> Cc: Ingo Molnar <mingo@redhat.com>
> Cc: "H. Peter Anvin" <hpa@zytor.com>
> Cc: Andi Kleen <andi@firstfloor.org>
> Cc: x86@kernel.org
> Cc: iommu@lists.linux-foundation.org
> Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
> ---
> No change from the previous version
>
> drivers/iommu/intel-iommu.c | 32 ++++++++++++++++++++++++--------
> 1 file changed, 24 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
> index fd426ca..172c2b0 100644
> --- a/drivers/iommu/intel-iommu.c
> +++ b/drivers/iommu/intel-iommu.c
> @@ -3004,7 +3004,7 @@ static void *intel_alloc_coherent(struct device *hwdev, size_t size,
> dma_addr_t *dma_handle, gfp_t flags,
> struct dma_attrs *attrs)
> {
> - void *vaddr;
> + struct page *page = NULL;
> int order;
>
> size = PAGE_ALIGN(size);
> @@ -3019,17 +3019,31 @@ static void *intel_alloc_coherent(struct device *hwdev, size_t size,
> flags |= GFP_DMA32;
> }
>
> - vaddr = (void *)__get_free_pages(flags, order);
> - if (!vaddr)
> + if (!(flags & GFP_ATOMIC)) {
GFP_ATOMIC is not a flag, so please change the above check to:
if (flags & __GFP_WAIT)
I will also fix the similar issue in arch/x86/kernel/pci-dma.c
> + unsigned int count = size >> PAGE_SHIFT;
> +
> + page = dma_alloc_from_contiguous(hwdev, count, order);
> + if (page && iommu_no_mapping(hwdev) &&
> + page_to_phys(page) + size > hwdev->coherent_dma_mask) {
> + dma_release_from_contiguous(hwdev, page, count);
> + page = NULL;
> + }
> + }
> +
> + if (!page)
> + page = alloc_pages(flags, order);
> + if (!page)
> return NULL;
> - memset(vaddr, 0, size);
> + memset(page_address(page), 0, size);
>
> - *dma_handle = __intel_map_single(hwdev, virt_to_bus(vaddr), size,
> + *dma_handle = __intel_map_single(hwdev, page_to_phys(page), size,
> DMA_BIDIRECTIONAL,
> hwdev->coherent_dma_mask);
> if (*dma_handle)
> - return vaddr;
> - free_pages((unsigned long)vaddr, order);
> + return page_address(page);
> + if (!dma_release_from_contiguous(hwdev, page, size >> PAGE_SHIFT))
> + __free_pages(page, order);
> +
> return NULL;
> }
>
> @@ -3037,12 +3051,14 @@ static void intel_free_coherent(struct device *hwdev, size_t size, void *vaddr,
> dma_addr_t dma_handle, struct dma_attrs *attrs)
> {
> int order;
> + struct page *page = virt_to_page(vaddr);
>
> size = PAGE_ALIGN(size);
> order = get_order(size);
>
> intel_unmap_page(hwdev, dma_handle, size, DMA_BIDIRECTIONAL, NULL);
> - free_pages((unsigned long)vaddr, order);
> + if (!dma_release_from_contiguous(hwdev, page, size >> PAGE_SHIFT))
> + __free_pages(page, order);
> }
>
> static void intel_unmap_sg(struct device *hwdev, struct scatterlist *sglist,
Best regards
--
Marek Szyprowski, PhD
Samsung R&D Institute Poland
next prev parent reply other threads:[~2014-01-16 14:28 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-01-14 14:13 [PATCH v2 0/5] enhance DMA CMA on x86 Akinobu Mita
2014-01-14 14:13 ` Akinobu Mita
[not found] ` <1389708830-5841-1-git-send-email-akinobu.mita-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2014-01-14 14:13 ` [PATCH v2 1/5] x86: make dma_alloc_coherent() return zeroed memory if CMA is enabled Akinobu Mita
2014-01-14 14:13 ` Akinobu Mita
[not found] ` <1389708830-5841-2-git-send-email-akinobu.mita-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2014-01-15 20:09 ` Konrad Rzeszutek Wilk
2014-01-15 20:09 ` Konrad Rzeszutek Wilk
[not found] ` <20140115200934.GC5201-6K5HmflnPlqSPmnEAIUT9EEOCMrvLtNR@public.gmane.org>
2014-01-16 23:34 ` Akinobu Mita
2014-01-16 23:34 ` Akinobu Mita
[not found] ` <CAC5umygcr0a_BfDJ9tB1EDry4UEwThG7WvkA8Dn27zO9RQab8Q-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2014-01-24 18:07 ` Konrad Rzeszutek Wilk
2014-01-24 18:07 ` Konrad Rzeszutek Wilk
2014-01-27 13:54 ` Marek Szyprowski
2014-01-27 13:54 ` Marek Szyprowski
[not found] ` <52E66527.8010000-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
2014-01-27 15:23 ` Konrad Rzeszutek Wilk
2014-01-27 15:23 ` Konrad Rzeszutek Wilk
[not found] ` <20140127152342.GC20968-6K5HmflnPlqSPmnEAIUT9EEOCMrvLtNR@public.gmane.org>
2014-01-28 23:20 ` Akinobu Mita
2014-01-28 23:20 ` Akinobu Mita
[not found] ` <CAC5umyjJfO9UyAkoG-bEX-vdO+X0fM_YD2dwj2AHT6T7hKgv0A-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2014-02-03 12:14 ` Akinobu Mita
2014-02-03 12:14 ` Akinobu Mita
2014-01-14 14:13 ` [PATCH v2 2/5] x86: enable DMA CMA with swiotlb Akinobu Mita
2014-01-14 14:13 ` Akinobu Mita
[not found] ` <1389708830-5841-3-git-send-email-akinobu.mita-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2014-01-15 20:12 ` Konrad Rzeszutek Wilk
2014-01-15 20:12 ` Konrad Rzeszutek Wilk
[not found] ` <20140115201224.GD5201-6K5HmflnPlqSPmnEAIUT9EEOCMrvLtNR@public.gmane.org>
2014-01-16 23:32 ` Akinobu Mita
2014-01-16 23:32 ` Akinobu Mita
[not found] ` <CAC5umyitWHvWiWn9B3wtTNBhbO7Rz_ghqmxhwu9caq40msnfAA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2014-01-24 18:06 ` Konrad Rzeszutek Wilk
2014-01-24 18:06 ` Konrad Rzeszutek Wilk
2014-01-14 14:13 ` [PATCH v2 3/5] intel-iommu: integrate DMA CMA Akinobu Mita
2014-01-14 14:13 ` Akinobu Mita
[not found] ` <1389708830-5841-4-git-send-email-akinobu.mita-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2014-01-16 14:28 ` Marek Szyprowski [this message]
2014-01-16 14:28 ` Marek Szyprowski
[not found] ` <52D7EC74.7030401-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
2014-01-16 23:28 ` Akinobu Mita
2014-01-16 23:28 ` Akinobu Mita
2014-01-14 14:13 ` [PATCH v2 4/5] memblock: introduce memblock_alloc_range() Akinobu Mita
2014-01-14 14:13 ` Akinobu Mita
2014-01-14 14:13 ` [PATCH v2 5/5] cma: add placement specifier for "cma=" kernel parameter Akinobu Mita
2014-01-14 14:13 ` Akinobu Mita
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=52D7EC74.7030401@samsung.com \
--to=m.szyprowski-sze3o3uu22jbdgjk7y7tuq@public.gmane.org \
--cc=akinobu.mita-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
--cc=akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org \
--cc=andi-Vw/NltI1exuRpAAqCnN02g@public.gmane.org \
--cc=dwmw2-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org \
--cc=hpa-YMNOUZJC4hwAvxtiuMwx3w@public.gmane.org \
--cc=iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org \
--cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=mingo-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org \
--cc=tglx-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org \
--cc=x86-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.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.