Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755600AbcCRJ3H (ORCPT ); Fri, 18 Mar 2016 05:29:07 -0400 Received: from hqemgate16.nvidia.com ([216.228.121.65]:11843 "EHLO hqemgate16.nvidia.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753094AbcCRJ3A (ORCPT ); Fri, 18 Mar 2016 05:29:00 -0400 X-PGP-Universal: processed; by hqnvupgp07.nvidia.com on Fri, 18 Mar 2016 02:27:28 -0700 From: Alexandre Courbot To: Russell King , Marek Szyprowski , Rabin Vincent , Thierry Reding CC: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, gnurou@gmail.com, Alexandre Courbot Subject: [PATCH v2] ARM: DMA: Fix kzalloc flags in __dma_alloc Date: Fri, 18 Mar 2016 18:28:49 +0900 Message-ID: <1458293329-5519-1-git-send-email-acourbot@nvidia.com> X-Mailer: git-send-email 2.7.3 X-NVConfidentiality: public MIME-Version: 1.0 Content-Type: text/plain Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1218 Lines: 38 Commit 19e6e5e5392b ("ARM: 8547/1: dma-mapping: store buffer information") allocates a structure meant for internal buffer management with the GFP flags of the buffer itself. This can trigger the following safeguard in the slab/slub allocator: if (unlikely(flags & GFP_SLAB_BUG_MASK)) { pr_emerg("gfp: %u\n", flags & GFP_SLAB_BUG_MASK); BUG(); } Fix this by filtering the flags that make the slab allocator unhappy. Signed-off-by: Alexandre Courbot Cc: Rabin Vincent --- Changes since v1: - Filter flags that may cause problem instead of forcing GFP_KERNEL (and risk sleeping in atomic context), as suggested by Rabin. arch/arm/mm/dma-mapping.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index deac58d5f1f7..c941e93048ad 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c @@ -762,7 +762,8 @@ static void *__dma_alloc(struct device *dev, size_t size, dma_addr_t *handle, if (!mask) return NULL; - buf = kzalloc(sizeof(*buf), gfp); + buf = kzalloc(sizeof(*buf), + gfp & ~(__GFP_DMA | __GFP_DMA32 | __GFP_HIGHMEM)); if (!buf) return NULL; -- 2.7.3