| From c091c71ad2218fc50a07b3d1dab85783f3b77efd Mon Sep 17 00:00:00 2001 |
| From: Marek Szyprowski <m.szyprowski@samsung.com> |
| Date: Fri, 24 Jan 2014 14:49:58 +0100 |
| Subject: x86: dma-mapping: fix GFP_ATOMIC macro usage |
| |
| From: Marek Szyprowski <m.szyprowski@samsung.com> |
| |
| commit c091c71ad2218fc50a07b3d1dab85783f3b77efd upstream. |
| |
| GFP_ATOMIC is not a single gfp flag, but a macro which expands to the other |
| flags, where meaningful is the LACK of __GFP_WAIT flag. To check if caller |
| wants to perform an atomic allocation, the code must test for a lack of the |
| __GFP_WAIT flag. This patch fixes the issue introduced in v3.5-rc1. |
| |
| Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/x86/kernel/pci-dma.c | 4 +++- |
| 1 file changed, 3 insertions(+), 1 deletion(-) |
| |
| --- a/arch/x86/kernel/pci-dma.c |
| +++ b/arch/x86/kernel/pci-dma.c |
| @@ -100,8 +100,10 @@ void *dma_generic_alloc_coherent(struct |
| flag |= __GFP_ZERO; |
| again: |
| page = NULL; |
| - if (!(flag & GFP_ATOMIC)) |
| + /* CMA can be used only in the context which permits sleeping */ |
| + if (flag & __GFP_WAIT) |
| page = dma_alloc_from_contiguous(dev, count, get_order(size)); |
| + /* fallback */ |
| if (!page) |
| page = alloc_pages_node(dev_to_node(dev), flag, get_order(size)); |
| if (!page) |