Received: by 10.192.165.156 with SMTP id m28csp394878imm; Wed, 11 Apr 2018 00:27:30 -0700 (PDT) X-Google-Smtp-Source: AIpwx4863dX28yIhEkZbRkJBlg+Zh91pBhnoy/TjdmWVNBgVyxr/FdShiBX9tAi0zqpfAbFMEh6P X-Received: by 10.98.178.207 with SMTP id z76mr3070901pfl.37.1523431650634; Wed, 11 Apr 2018 00:27:30 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1523431650; cv=none; d=google.com; s=arc-20160816; b=hm6WUKI3jYheu1vUYLv4OM3lIbogiNGoTOzS6OVNiXqKRpwgFKN9onDDh+oF/UXRnL smbKGj0WeRhstofZawZhtNm8QXmf6FrON084twtGLex5VUX7q60JO+hWGkSo82jiEpDM erOl/Uf/dVBfa63eN3jDEuuzQ456t6qnoNlu3ULoumre0A4Ae2+f7TPMQM2Xt5/7feaz eWNRPCpJOo60L+kWWJuBGJlc+4OathoyOUq6PHX/bbfMeC4WiUE26koi2iGwqrswnw7f SErLaVVwbGz3/aUxlO7pzfzCRrXiPWLDTm2bnRvtfgIGacY5fhQ9L19j67eoMONzhVR0 BlKQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature:arc-authentication-results; bh=ogRuTsfZnIRImc30u26la2DpHvK5GzZ4RlD3ip5c8yA=; b=xYfYwc+wU4tZCkQzptSnIk4cb34SRx8cXQydaOsw/Dbt4axrOKYWYgxiWGfYRZ/ZmN GJuULmLPybhC7f4iRLBE0Qz7xeEzHnFQaNZilyzs9IewU/uQyOyTOb3H2SXGmhBWBeZ6 5nBcQppA70cge5R/Eqi47Cz9lRo+vqih4O3MRUiso02sc9DIbj/mCQdR/gqZVuLvLtvr 58P4Is6Za9PjvsBDXR2DNNH9mOYsGXTFLGSzMv5GRNv38S3o62eDPvgWHYSxbvem0S9t Fr2T4Eozy6RJVw6FwDtU9u57Prqwj6QKSkha8VyYJ/ABOdf+LX9OC6Ue2Qe4AqGObWRV JslA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=FLrxFUe3; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id p2si423682pff.253.2018.04.11.00.26.53; Wed, 11 Apr 2018 00:27:30 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=FLrxFUe3; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752621AbeDKHX2 (ORCPT + 99 others); Wed, 11 Apr 2018 03:23:28 -0400 Received: from mail-pf0-f194.google.com ([209.85.192.194]:42822 "EHLO mail-pf0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750727AbeDKHXZ (ORCPT ); Wed, 11 Apr 2018 03:23:25 -0400 Received: by mail-pf0-f194.google.com with SMTP id o16so509616pfk.9 for ; Wed, 11 Apr 2018 00:23:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=ogRuTsfZnIRImc30u26la2DpHvK5GzZ4RlD3ip5c8yA=; b=FLrxFUe3wMznTnTfsHfVRvpPRo0kufDa3WsFUUPUQhRNF129STglC2YELI2mK3PolL k/tTMfJsQ4y5gxRxfPp90JjYbQ/K/AiTZbRCofzUm6Yn8rcY8M/NdjwvyZzr5L9hAIwp 237gO0g4RhHBClPPhHxw85fC1vruCsZlzV3dgPOCCQ7fYD0zTzYjoiEI0oMCuF0NNdCP K7P3Me02vpNqKJczddvgLuhd2Xajr8pJ/AuiAn/tq4KaCl+f08L8M6PSld+MigxeAu5i Z3l+jxfVThkpScpNP+aGZmwf1YuJutzDi8pdMH95WgaxQvVwOK9QdowI7Q9saM+x4hn0 bpeQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=ogRuTsfZnIRImc30u26la2DpHvK5GzZ4RlD3ip5c8yA=; b=XM8WukS7EAxVKkDWuDJdZoSRtkInPUuPI9paLaiu9xeOMJoVFPAuZBUfCyD/QPgRyJ Vk/TV7sva+fu/nRNMatts05Hln6Ng2nTclcmuupumvXuXtlSDeJazE91hSK6GKHFrvmQ f0Df4vw7bNz+9t7X9S7eOO/QcrbxYmMg1rDJ+R5/T0P/SLTqwDgPpgGHbha+orDqltxy QgX2M8t5I98PNRs2ayX0sBnS4PPca2NubL6o8oRj3rCgt2F7QMW0S3LjRXIYdS0q9JVF imu0OWjtL/okYqUSvPGFphLqSxrzXX+xq6YQfvnVGNfjE/c9FpxKAMqKOxdTZJMV4zQs +wgw== X-Gm-Message-State: ALQs6tCgyuR+ttqDfQxAdjuzeLe14Kxd0PC5HCxAPL25lRffwuLBwj5F ZlVdAkrfw1cuR6fs1wentwk= X-Received: by 10.98.103.199 with SMTP id t68mr3050419pfj.24.1523431404884; Wed, 11 Apr 2018 00:23:24 -0700 (PDT) Received: from localhost.localdomain ([38.106.11.25]) by smtp.gmail.com with ESMTPSA id o90sm1561898pfj.102.2018.04.11.00.23.12 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 11 Apr 2018 00:23:24 -0700 (PDT) From: Jia He To: Russell King , Catalin Marinas , Will Deacon , Mark Rutland , Ard Biesheuvel , Andrew Morton , Michal Hocko Cc: Wei Yang , Kees Cook , Laura Abbott , Vladimir Murzin , Philip Derrin , AKASHI Takahiro , James Morse , Steve Capper , Pavel Tatashin , Gioh Kim , Vlastimil Babka , Mel Gorman , Johannes Weiner , Kemi Wang , Petr Tesarik , YASUAKI ISHIMATSU , Andrey Ryabinin , Nikolay Borisov , Daniel Jordan , Daniel Vacek , Eugeniu Rosca , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, Jia He , Jia He Subject: [PATCH v8 2/6] mm: page_alloc: remain memblock_next_valid_pfn() on arm/arm64 Date: Wed, 11 Apr 2018 00:21:53 -0700 Message-Id: <1523431317-30612-3-git-send-email-hejianet@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1523431317-30612-1-git-send-email-hejianet@gmail.com> References: <1523431317-30612-1-git-send-email-hejianet@gmail.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Commit b92df1de5d28 ("mm: page_alloc: skip over regions of invalid pfns where possible") optimized the loop in memmap_init_zone(). But it causes possible panic bug. So Daniel Vacek reverted it later. But as suggested by Daniel Vacek, it is fine to using memblock to skip gaps and finding next valid frame with CONFIG_HAVE_ARCH_PFN_VALID. On arm and arm64, memblock is used by default. But generic version of pfn_valid() is based on mem sections and memblock_next_valid_pfn() does not always return the next valid one but skips more resulting in some valid frames to be skipped (as if they were invalid). And that's why kernel was eventually crashing on some !arm machines. And as verified by Eugeniu Rosca, arm can benifit from commit b92df1de5d28. So remain the memblock_next_valid_pfn on arm/arm64 and move the related codes to one file include/linux/arm96_common.h Suggested-by: Daniel Vacek Signed-off-by: Jia He --- arch/arm/mm/init.c | 1 + arch/arm64/mm/init.c | 1 + include/linux/early_pfn.h | 34 ++++++++++++++++++++++++++++++++++ include/linux/mmzone.h | 11 +++++++++++ mm/page_alloc.c | 5 ++++- 5 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 include/linux/early_pfn.h diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c index a1f11a7..de225a2 100644 --- a/arch/arm/mm/init.c +++ b/arch/arm/mm/init.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #include diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c index 00e7b90..913c327 100644 --- a/arch/arm64/mm/init.c +++ b/arch/arm64/mm/init.c @@ -40,6 +40,7 @@ #include #include #include +#include #include #include diff --git a/include/linux/early_pfn.h b/include/linux/early_pfn.h new file mode 100644 index 0000000..1b001c7 --- /dev/null +++ b/include/linux/early_pfn.h @@ -0,0 +1,34 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* Copyright (C) 2018 HXT-semitech Corp. */ +#ifndef __EARLY_PFN_H +#define __EARLY_PFN_H +#ifdef CONFIG_HAVE_MEMBLOCK_PFN_VALID +ulong __init_memblock memblock_next_valid_pfn(ulong pfn) +{ + struct memblock_type *type = &memblock.memory; + unsigned int right = type->cnt; + unsigned int mid, left = 0; + phys_addr_t addr = PFN_PHYS(++pfn); + + do { + mid = (right + left) / 2; + + if (addr < type->regions[mid].base) + right = mid; + else if (addr >= (type->regions[mid].base + + type->regions[mid].size)) + left = mid + 1; + else { + /* addr is within the region, so pfn is valid */ + return pfn; + } + } while (left < right); + + if (right == type->cnt) + return -1UL; + else + return PHYS_PFN(type->regions[right].base); +} +EXPORT_SYMBOL(memblock_next_valid_pfn); +#endif /*CONFIG_HAVE_MEMBLOCK_PFN_VALID*/ +#endif /*__EARLY_PFN_H*/ diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index d797716..c40297d 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h @@ -1245,6 +1245,8 @@ static inline int pfn_valid(unsigned long pfn) return 0; return valid_section(__nr_to_section(pfn_to_section_nr(pfn))); } + +#define next_valid_pfn(pfn) (pfn + 1) #endif static inline int pfn_present(unsigned long pfn) @@ -1270,6 +1272,10 @@ static inline int pfn_present(unsigned long pfn) #endif #define early_pfn_valid(pfn) pfn_valid(pfn) +#ifdef CONFIG_HAVE_MEMBLOCK_PFN_VALID +extern ulong memblock_next_valid_pfn(ulong pfn); +#define next_valid_pfn(pfn) memblock_next_valid_pfn(pfn) +#endif void sparse_init(void); #else #define sparse_init() do {} while (0) @@ -1291,6 +1297,11 @@ struct mminit_pfnnid_cache { #define early_pfn_valid(pfn) (1) #endif +/* fallback to default defitions*/ +#ifndef next_valid_pfn +#define next_valid_pfn(pfn) (pfn + 1) +#endif + void memory_present(int nid, unsigned long start, unsigned long end); unsigned long __init node_memmap_size_bytes(int, unsigned long, unsigned long); diff --git a/mm/page_alloc.c b/mm/page_alloc.c index c19f5ac..bab8e1a 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -5483,8 +5483,11 @@ void __meminit memmap_init_zone(unsigned long size, int nid, unsigned long zone, if (context != MEMMAP_EARLY) goto not_early; - if (!early_pfn_valid(pfn)) + if (!early_pfn_valid(pfn)) { + pfn = next_valid_pfn(pfn) - 1; continue; + } + if (!early_pfn_in_nid(pfn, nid)) continue; if (!update_defer_init(pgdat, pfn, end_pfn, &nr_initialised)) -- 2.7.4