From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752459AbbCXJCl (ORCPT ); Tue, 24 Mar 2015 05:02:41 -0400 Received: from mailout1.w1.samsung.com ([210.118.77.11]:50235 "EHLO mailout1.w1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752144AbbCXJCg (ORCPT ); Tue, 24 Mar 2015 05:02:36 -0400 X-AuditID: cbfec7f5-b7fc86d0000066b7-a0-55112829e972 Message-id: <55112828.3010806@samsung.com> Date: Tue, 24 Mar 2015 10:02:32 +0100 From: Marek Szyprowski User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Thunderbird/31.5.0 MIME-version: 1.0 To: Tomasz Figa , linux-arm-kernel@lists.infradead.org Cc: linux-kernel@vger.kernel.org, Russell King , Will Deacon , Andrew Morton , Laura Abbott , Ritesh Harjani , Carlo Caione , Laurent Pinchart , Douglas Anderson , Sonny Rao , David Rientjes Subject: Re: [PATCH v2] ARM: mm: Do not invoke OOM for higher order IOMMU DMA allocations References: <1427095620-20994-1-git-send-email-tfiga@chromium.org> In-reply-to: <1427095620-20994-1-git-send-email-tfiga@chromium.org> Content-type: text/plain; charset=utf-8; format=flowed Content-transfer-encoding: 7bit X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrGLMWRmVeSWpSXmKPExsVy+t/xa7qaGoKhBjuXKVjMWb+GzeLBmvXM FmeXHWSz2N45g91iYtMdFotNj6+xWlzeNYfN4vZlXou2JRuZLJ5f7Ga3eHJmJqPF59Z/bBYv P55gceD1WDNvDaNHS3MPm0fXyT4mj9kNF1k8Lvf1MnnsnHWX3WPBplKP2R0zWT1OzPjN4rF5 Sb3H501yAdxRXDYpqTmZZalF+nYJXBm7dh1jKjgvWPFw1iOmBsYDvF2MnBwSAiYSlz/cZ4Ow xSQu3FsPZHNxCAksZZR4srqDCcL5xCjR1fuBsYuRg4NXQEvi2jYmkAYWAVWJj0/2MYLYbAKG El1vu9hASkQFYiRePowECfMKCEr8mHyPBcQWEfCS2N7+ihFkJLPAEWaJixfXg80RFoiWWN7U zw5iCwk4SRw5cQHM5hRwlvi1YToziM0sYCbx5eVhVghbXmLzmrfMExgFZiHZMQtJ2SwkZQsY mVcxiqaWJhcUJ6XnGukVJ+YWl+al6yXn525ihMTV1x2MS49ZHWIU4GBU4uGNqOcPFWJNLCuu zD3EKMHBrCTCK6wiGCrEm5JYWZValB9fVJqTWnyIkYmDU6qBMfnctt3HlkplqT6cd/5G7ZRm Y50pB26wOPBMl3Q7xPqJccODv5tFc2Y4v3XarH37Y7XEJ8uv4iG86RJmwr/tPTkmOvFdXuyV 2LXCrOT6V0dVlfz3tueaXiy+zC7i0ZbnkJv1TzBEdqq2yNN5V0Nvnl7pwB4m0K7j8HlFRP25 3x5K13K5srb0KLEUZyQaajEXFScCABKOnsmJAgAA Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hello, On 2015-03-23 08:27, Tomasz Figa wrote: > IOMMU should be able to use single pages as well as bigger blocks, so if > higher order allocations fail, we should not affect state of the system, > with events such as OOM killer, but rather fall back to order 0 > allocations. > > This patch changes the behavior of ARM IOMMU DMA allocator to use > __GFP_NORETRY, which bypasses OOM invocation, for orders higher than > zero and, only if that fails, fall back to normal order 0 allocation > which might invoke OOM killer. > > Signed-off-by: Tomasz Figa Acked-by: Marek Szyprowski > --- > arch/arm/mm/dma-mapping.c | 27 +++++++++++++++++++++------ > 1 file changed, 21 insertions(+), 6 deletions(-) > > Changes since v1: > (https://patchwork.kernel.org/patch/6015921/) > - do not clear __GFP_NORETRY, as it might come from the caller, > - s/positive order/order higher than 0/. > > diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c > index 83cd5ac..3f1ac51 100644 > --- a/arch/arm/mm/dma-mapping.c > +++ b/arch/arm/mm/dma-mapping.c > @@ -1150,13 +1150,28 @@ static struct page **__iommu_alloc_buffer(struct device *dev, size_t size, > gfp |= __GFP_NOWARN | __GFP_HIGHMEM; > > while (count) { > - int j, order = __fls(count); > + int j, order; > + > + for (order = __fls(count); order > 0; --order) { > + /* > + * We do not want OOM killer to be invoked as long > + * as we can fall back to single pages, so we force > + * __GFP_NORETRY for orders higher than zero. > + */ > + pages[i] = alloc_pages(gfp | __GFP_NORETRY, order); > + if (pages[i]) > + break; > + } > > - pages[i] = alloc_pages(gfp, order); > - while (!pages[i] && order) > - pages[i] = alloc_pages(gfp, --order); > - if (!pages[i]) > - goto error; > + if (!pages[i]) { > + /* > + * Fall back to single page allocation. > + * Might invoke OOM killer as last resort. > + */ > + pages[i] = alloc_pages(gfp, 0); > + if (!pages[i]) > + goto error; > + } > > if (order) { > split_page(pages[i], order); Best regards -- Marek Szyprowski, PhD Samsung R&D Institute Poland From mboxrd@z Thu Jan 1 00:00:00 1970 From: m.szyprowski@samsung.com (Marek Szyprowski) Date: Tue, 24 Mar 2015 10:02:32 +0100 Subject: [PATCH v2] ARM: mm: Do not invoke OOM for higher order IOMMU DMA allocations In-Reply-To: <1427095620-20994-1-git-send-email-tfiga@chromium.org> References: <1427095620-20994-1-git-send-email-tfiga@chromium.org> Message-ID: <55112828.3010806@samsung.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Hello, On 2015-03-23 08:27, Tomasz Figa wrote: > IOMMU should be able to use single pages as well as bigger blocks, so if > higher order allocations fail, we should not affect state of the system, > with events such as OOM killer, but rather fall back to order 0 > allocations. > > This patch changes the behavior of ARM IOMMU DMA allocator to use > __GFP_NORETRY, which bypasses OOM invocation, for orders higher than > zero and, only if that fails, fall back to normal order 0 allocation > which might invoke OOM killer. > > Signed-off-by: Tomasz Figa Acked-by: Marek Szyprowski > --- > arch/arm/mm/dma-mapping.c | 27 +++++++++++++++++++++------ > 1 file changed, 21 insertions(+), 6 deletions(-) > > Changes since v1: > (https://patchwork.kernel.org/patch/6015921/) > - do not clear __GFP_NORETRY, as it might come from the caller, > - s/positive order/order higher than 0/. > > diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c > index 83cd5ac..3f1ac51 100644 > --- a/arch/arm/mm/dma-mapping.c > +++ b/arch/arm/mm/dma-mapping.c > @@ -1150,13 +1150,28 @@ static struct page **__iommu_alloc_buffer(struct device *dev, size_t size, > gfp |= __GFP_NOWARN | __GFP_HIGHMEM; > > while (count) { > - int j, order = __fls(count); > + int j, order; > + > + for (order = __fls(count); order > 0; --order) { > + /* > + * We do not want OOM killer to be invoked as long > + * as we can fall back to single pages, so we force > + * __GFP_NORETRY for orders higher than zero. > + */ > + pages[i] = alloc_pages(gfp | __GFP_NORETRY, order); > + if (pages[i]) > + break; > + } > > - pages[i] = alloc_pages(gfp, order); > - while (!pages[i] && order) > - pages[i] = alloc_pages(gfp, --order); > - if (!pages[i]) > - goto error; > + if (!pages[i]) { > + /* > + * Fall back to single page allocation. > + * Might invoke OOM killer as last resort. > + */ > + pages[i] = alloc_pages(gfp, 0); > + if (!pages[i]) > + goto error; > + } > > if (order) { > split_page(pages[i], order); Best regards -- Marek Szyprowski, PhD Samsung R&D Institute Poland