From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753368AbbDCBHX (ORCPT ); Thu, 2 Apr 2015 21:07:23 -0400 Received: from mail-ie0-f170.google.com ([209.85.223.170]:36331 "EHLO mail-ie0-f170.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752646AbbDCBHT (ORCPT ); Thu, 2 Apr 2015 21:07:19 -0400 Date: Thu, 2 Apr 2015 18:07:16 -0700 (PDT) From: David Rientjes X-X-Sender: rientjes@chino.kir.corp.google.com To: Andrew Morton cc: Andrey Ryabinin , Dave Kleikamp , Christoph Hellwig , Sebastian Ott , Mikulas Patocka , Catalin Marinas , LKML , "linux-mm@kvack.org" , jfs-discussion@lists.sourceforge.net Subject: [patch -mm] mm, mempool: poison elements backed by page allocator fix fix In-Reply-To: Message-ID: References: <551A861B.7020701@samsung.com> User-Agent: Alpine 2.10 (DEB 1266 2009-07-14) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Elements backed by the page allocator might not be directly mapped into lowmem, so do k{,un}map_atomic() before poisoning and verifying contents to map into lowmem and return the virtual adddress. Reported-by: Andrey Ryabinin Signed-off-by: David Rientjes --- mm/mempool.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mm/mempool.c b/mm/mempool.c --- a/mm/mempool.c +++ b/mm/mempool.c @@ -61,9 +61,10 @@ static void check_element(mempool_t *pool, void *element) /* Mempools backed by page allocator */ if (pool->free == mempool_free_pages) { int order = (int)(long)pool->pool_data; - void *addr = page_address(element); + void *addr = kmap_atomic((struct page *)element); __check_element(pool, addr, 1UL << (PAGE_SHIFT + order)); + kunmap_atomic(addr); } } @@ -84,9 +85,10 @@ static void poison_element(mempool_t *pool, void *element) /* Mempools backed by page allocator */ if (pool->alloc == mempool_alloc_pages) { int order = (int)(long)pool->pool_data; - void *addr = page_address(element); + void *addr = kmap_atomic((struct page *)element); __poison_element(addr, 1UL << (PAGE_SHIFT + order)); + kunmap_atomic(addr); } } #else /* CONFIG_DEBUG_SLAB || CONFIG_SLUB_DEBUG_ON */