Received: by 2002:ac0:a581:0:0:0:0:0 with SMTP id m1-v6csp427205imm; Thu, 28 Jun 2018 23:42:16 -0700 (PDT) X-Google-Smtp-Source: ADUXVKIm7W3j+pXhuE7E3pTZVS6Db7qT+m2mxfw3lfAjKwQTNWtam9D7bduU2y66aYJ0BIwl+0N+ X-Received: by 2002:a17:902:7b95:: with SMTP id w21-v6mr13634723pll.150.1530254536622; Thu, 28 Jun 2018 23:42:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1530254536; cv=none; d=google.com; s=arc-20160816; b=o0dEXwh1JxnTmd4rGl5SMSS2U0WwCNyDlHVVfHp20uqs7bKSiToGWyJQGXlTkDzLLs 7ruJggi2TOn63ktJd3QNJ6Me94JZ8GBO7Lxwm6ma9GC8ks3zCEg+GW3ICL9/G/vAJsjd sxCK5utANKmPoIRRsbHnQMIriojBR5wLvO5oeTzJtIoGRlACuMS645fOyvQZwWRR7toK idpeGVw72vYuz5f+zSBE3ZdIxmLmdv4QG7mEZdqp0A0rk+cz7Q5UgRWH82pCfyJJbs05 ts3zdK/008Lfaoz+J0MPq9N2FDBPkhpaBJMqA9NFb8A/7HgEKGo3entJN5zJ6Lqt8Moe Lk3g== 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=LNIVj8mcJRSFjcBxFmCRFF49bEt8xstenAEyW0ynDOk=; b=osqUZ4Q/ImB865zXRN3XbhwfgXsNGIAjplUBBAoLUCJRsTXdlO03tAH8unyVvqO6/d 34RN1crOWFHeuyf7OwKRrbm5zgVb+iZ7JG5Ry49BBRDlyR3+jTOlcAP4JkECyrX97n29 vGrXspyaa+3oKPbQTrPSqcWPV6X0b7+4/Hg25KFQh5dv5khbqOtxgxUKPEKXOblaBMN6 oUaeWyy8h4Ny977TuVmAKI0HbCD8xLsGnZRnx2Obl1gfvuN4PPkob+G81GxU42rD8ZJT Y3lmSAXrroLw7jPdgF7m57Ys98FrghETspRyyqotDp9MMEh2Wn9FX/7zARrjMAmc0sNb hwgQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=cJNuAMqY; 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 s64-v6si7761005pgs.499.2018.06.28.23.42.02; Thu, 28 Jun 2018 23:42:16 -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=cJNuAMqY; 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 S936527AbeF2Caa (ORCPT + 99 others); Thu, 28 Jun 2018 22:30:30 -0400 Received: from mail-qk0-f195.google.com ([209.85.220.195]:39338 "EHLO mail-qk0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S934863AbeF2Ca2 (ORCPT ); Thu, 28 Jun 2018 22:30:28 -0400 Received: by mail-qk0-f195.google.com with SMTP id f3-v6so4177303qkd.6 for ; Thu, 28 Jun 2018 19:30:27 -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=LNIVj8mcJRSFjcBxFmCRFF49bEt8xstenAEyW0ynDOk=; b=cJNuAMqYgKR6/ywwnfmcYs8TmmfnisDxpEtqVQvcMqxYjV8xnA4akS+ZZ6mm2XbCTm Mi691IRS30Ezbc3k+8ryL7i28Pj4Kbx6tflZisa//N6V5Pmgs3Tths9JgdO1/QavlFuM sG4bGizoS2gxT9S8Kll4g27oypwTBeG5avALJO9Lf/VQJxDnNVakvoVXkCl2TpBsuCmO U+8hytK8lnx88BaWFnr/Xai9wnQl+UgOdsLzr89a5eFJ5Kx4+K2M/lFSfiZcOqMUT4ES Q2msq0CCwi4Quypy/3gS50K8oT2rma4TwbIVbBfNw4p4wldd7bb82ZzHgrkAXax8S4/h E/0g== 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=LNIVj8mcJRSFjcBxFmCRFF49bEt8xstenAEyW0ynDOk=; b=sqB+ykvhzirhOSPe3vVBHv2D06XvqDrbxUAHGQ8szSCPP5GQil4HFI9xelmNmSrVzk msLp1HR6ajmOVcpHmB4z0MFPHISKX+Txg0TlU6DUcRAVqI2CrPubhDQkeyrA011CbKxY o92lW4dlqnmNlB8NqKOgMkEEcx7eVoA18B5RcVSWTo7rcu8ZUcmboK3TkwIg88jWl6sS fvwqaDgi9nk3HKX2V58Q3WnRRcc40fqjI2Q31lbnPqxxg1YnGD9ovJHTXaw2Zrord7dD CKwfw/qKAKZWGf8L3bwag4cVCGAlPg8Sspi7MyT6QxJxrNWXzi3XEqApfo/CSfLBFrr2 WGCg== X-Gm-Message-State: APt69E0zMeCZtwOGzBeEPzfNaj6xhbxlhLnfub/Gc9b0vvFu9Fomn6Wa gKLlD59/0qAwt24ZgSQdkq0= X-Received: by 2002:ae9:e848:: with SMTP id a69-v6mr11395716qkg.161.1530239427234; Thu, 28 Jun 2018 19:30:27 -0700 (PDT) Received: from ct7host.localdomain ([38.106.11.25]) by smtp.gmail.com with ESMTPSA id y25-v6sm6390186qtc.48.2018.06.28.19.30.16 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 28 Jun 2018 19:30:26 -0700 (PDT) From: Jia He To: Russell King , Andrew Morton , Michal Hocko , Catalin Marinas , Mel Gorman , Will Deacon , Mark Rutland , "H. Peter Anvin" Cc: Pavel Tatashin , Daniel Jordan , AKASHI Takahiro , Gioh Kim , Steven Sistare , Daniel Vacek , Eugeniu Rosca , Vlastimil Babka , linux-kernel@vger.kernel.org, linux-mm@kvack.org, James Morse , Ard Biesheuvel , Steve Capper , Thomas Gleixner , Ingo Molnar , Greg Kroah-Hartman , Kate Stewart , Philippe Ombredanne , Johannes Weiner , Kemi Wang , Petr Tesarik , YASUAKI ISHIMATSU , Andrey Ryabinin , Nikolay Borisov , richard.weiyang@gmail.com, Jia He , Jia He Subject: [PATCH v9 2/6] mm: page_alloc: remain memblock_next_valid_pfn() on arm/arm64 Date: Fri, 29 Jun 2018 10:29:19 +0800 Message-Id: <1530239363-2356-3-git-send-email-hejianet@gmail.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1530239363-2356-1-git-send-email-hejianet@gmail.com> References: <1530239363-2356-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 it would be better if we remain the memblock_next_valid_pfn on arm/arm64 and move the related codes to one file include/linux/early_pfn.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 c186474..aa99f4d 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 325cfb3..495e299 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 32699b2..57cdc42 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h @@ -1241,6 +1241,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) @@ -1266,6 +1268,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) @@ -1287,6 +1293,11 @@ struct mminit_pfnnid_cache { #define early_pfn_valid(pfn) (1) #endif +/* fallback to default definitions*/ +#ifndef next_valid_pfn +#define next_valid_pfn(pfn) (pfn + 1) +#endif + void memory_present(int nid, unsigned long start, unsigned long end); /* diff --git a/mm/page_alloc.c b/mm/page_alloc.c index cd3c7b9..607deff 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -5485,8 +5485,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)) -- 1.8.3.1