Received: by 10.213.65.68 with SMTP id h4csp245388imn; Tue, 3 Apr 2018 19:58:24 -0700 (PDT) X-Google-Smtp-Source: AIpwx49yxn24Ca3TVOhLFcTs0v4wQPJB6bmD9ZAQI8w+MyGjRsIXdtiI0tl4vYWrAKT6EtqnDpNA X-Received: by 2002:a17:902:341:: with SMTP id 59-v6mr16216578pld.407.1522810704908; Tue, 03 Apr 2018 19:58:24 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1522810704; cv=none; d=google.com; s=arc-20160816; b=KuuXmvcvKVUpGsqtzpWEGXYOzjTFaA8mXXazb4q1qkTAYBD9JbYEFqahrPylQGVXtO cB0+dSuUwUKAuNcThksYIMfXZxpiWmxf3hE975tYbRFzLznVhQ4SrwLJ8kYiMp4Tt+k1 z+EqMUE3WfiEmR+dkZSXrWp0KVS/o487lkB6lIk2nzFASSwq7Uk5ZZ/I39cqWcE7P2gA BQTii6aijjAxpWPXST5bAdFyZLpPSylDwHk/f7ndQyKYapJ6xjHr4Be3VBOc926HjdFx Mo6asFTLZsf+jxF+kzkvqRdQrOxgOnAJ1eaDeu6/fwOyv+3jpENoLUy7EHlmaMhWDRi6 YpdA== 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=lgBtQetLFaJReXa+C+mZ0Hn+a2TSixjgT+j7DvSd7Go=; b=MCTeTwzwG/LYqfq+n9cAhadaFuL2IMEFG0de0/EC01zgiuVqHKVyuFTy096/L8Pf/Y VpcnDPooZ0GlEw6hADQZBPL/8bMFreAxq3t+UHESmWLxKYvvOIdkbR+fEXdP3zhl2Keh vuDFG5VHW6Wi/0KbiWuBItRT+7HHZ/j1nBf3KoDdNiXqvCLfkCMPB60SMN2caU3/zrz0 OJetdjsUX5HOzGPc4MPxGjr337bu5BJ5v12jDpm3yZz8tLzhVOUuKnW15xiIWIl5+IKX x82nrYU3rbLojAl9GjuTFO/zCJhR0G3pGtNwrP3Q82O+UmcpjTHue6CoFyx8hrDGdlA/ WoKQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=CKgKCCX8; 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 q1si2983365pga.71.2018.04.03.19.58.11; Tue, 03 Apr 2018 19:58:24 -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=CKgKCCX8; 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 S1753263AbeDDC46 (ORCPT + 99 others); Tue, 3 Apr 2018 22:56:58 -0400 Received: from mail-pl0-f67.google.com ([209.85.160.67]:43490 "EHLO mail-pl0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753078AbeDDC44 (ORCPT ); Tue, 3 Apr 2018 22:56:56 -0400 Received: by mail-pl0-f67.google.com with SMTP id c21-v6so8397376plz.10 for ; Tue, 03 Apr 2018 19:56:55 -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=lgBtQetLFaJReXa+C+mZ0Hn+a2TSixjgT+j7DvSd7Go=; b=CKgKCCX81wd4XSxyqNgJ5d7JW4GFcP3rqJPG/nganCXyj95VZrx2DjLTAGjXiw9e9g 7imDZy43y5qecTCBEiHrtVOiBcaWsghIEIkVAkhANTumuoPVo2n1zOkM02ENxTJsk21Q c5ZXeiwaDEUlP64Va7mQ7VNRnKS3Pmh1Li2E+wP3PPz27+Ugub66FAoCYbtZhQzI9TNr rbsSZlnQ/TCBSmLOdg9B5NcBX/v0y8qjPnThYZJiPh0kmJFd8SRGqRGaDXmckz0+VK9X yrk130MUzFjnjncUW1HrkNOhx0UbMuLdhi5wCVqBJU37Frw1ZL6euFHRGRKCWV4nKN2H kX3A== 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=lgBtQetLFaJReXa+C+mZ0Hn+a2TSixjgT+j7DvSd7Go=; b=O3RyGkuPvR4gT1Dvp/TH1SBtmLcmW4ju/jtcL54zmRJaBlEbbYyEgQCyZJWqHL5ADN 5yPhgG+FwoJqKnKI2UYfIf+sctWHyA1zQQ9NoWK+lKAToZMzcgyUz4+puiFmqAnUY0wh AjUhMHPs+xMQQYW8gC9wlpC2xZ62wccaTcDtumXBgZKszRMhg6XK7zAw4lJCzArrJmif JrdlmLEAl8HfYUn8vQ9i52wqX6BSdeNH/JkTMIEQ0LLedXhUZVxZv96IBuGIIsfEF1pB PebDDHwGvWAN5B1CPjVQxpyVkHbHjIqMndrJMJA2qmF+JXI/qHLz+EfPWZb0jKuh3M0j vZ3Q== X-Gm-Message-State: AElRT7GHs0cSfbk73osFxDurs8PJcmSW0VAj9BgC0G8lpG5rc72+djyX 4hV8tVK4LlIABQzZSZup4Tk= X-Received: by 2002:a17:902:149:: with SMTP id 67-v6mr17015811plb.296.1522810615673; Tue, 03 Apr 2018 19:56:55 -0700 (PDT) Received: from localhost.localdomain ([38.106.11.25]) by smtp.gmail.com with ESMTPSA id a4sm8020701pfj.107.2018.04.03.19.56.43 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 03 Apr 2018 19:56:55 -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 v6 1/5] mm: page_alloc: remain memblock_next_valid_pfn() on arm and arm64 Date: Tue, 3 Apr 2018 19:56:15 -0700 Message-Id: <1522810579-7466-2-git-send-email-hejianet@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1522810579-7466-1-git-send-email-hejianet@gmail.com> References: <1522810579-7466-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{,64} and move the related codes to arm64 arch directory. Suggested-by: Daniel Vacek Signed-off-by: Jia He --- arch/arm/mm/init.c | 1 + arch/arm64/mm/init.c | 1 + include/linux/arm96_common.h | 37 +++++++++++++++++++++++++++++++++++++ include/linux/mmzone.h | 11 +++++++++++ mm/page_alloc.c | 2 +- 5 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 include/linux/arm96_common.h diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c index a1f11a7..296cc52 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..6efab80 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/arm96_common.h b/include/linux/arm96_common.h new file mode 100644 index 0000000..a6f68ea --- /dev/null +++ b/include/linux/arm96_common.h @@ -0,0 +1,37 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* Common definitions of arm and arm64 + * Copyright (C) 2018 HXT-semitech Corp. + */ +#ifndef __ARM96_COMMON_H +#define __ARM96_COMMON_H +#ifdef CONFIG_HAVE_ARCH_PFN_VALID +/* HAVE_MEMBLOCK is always enabled on arm and arm64 */ +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_ARCH_PFN_VALID*/ +#endif /*__ARM96_COMMON_H*/ diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index d797716..a517d43 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++) #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_ARCH_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++) +#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..9d05f29 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -5475,7 +5475,7 @@ void __meminit memmap_init_zone(unsigned long size, int nid, unsigned long zone, if (altmap && start_pfn == altmap->base_pfn) start_pfn += altmap->reserve; - for (pfn = start_pfn; pfn < end_pfn; pfn++) { + for (pfn = start_pfn; pfn < end_pfn; next_valid_pfn(pfn)) { /* * There can be holes in boot-time mem_map[]s handed to this * function. They do not exist on hotplugged memory. -- 2.7.4