From patchwork Wed Aug 22 03:07:16 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jia He X-Patchwork-Id: 10572567 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id AED6F1579 for ; Wed, 22 Aug 2018 03:08:05 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id A60602B113 for ; Wed, 22 Aug 2018 03:08:05 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 991FA2B179; Wed, 22 Aug 2018 03:08:05 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-3.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 631662B113 for ; Wed, 22 Aug 2018 03:08:04 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 74A3C6B2223; Tue, 21 Aug 2018 23:08:03 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 6D0066B2224; Tue, 21 Aug 2018 23:08:03 -0400 (EDT) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 598616B2225; Tue, 21 Aug 2018 23:08:03 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-pg1-f200.google.com (mail-pg1-f200.google.com [209.85.215.200]) by kanga.kvack.org (Postfix) with ESMTP id 162B26B2223 for ; Tue, 21 Aug 2018 23:08:03 -0400 (EDT) Received: by mail-pg1-f200.google.com with SMTP id 186-v6so357437pgc.12 for ; Tue, 21 Aug 2018 20:08:03 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:dkim-signature:from:to:cc:subject:date :message-id:in-reply-to:references; bh=FZQVcSjva4KqT1QnxQl07tGVuHDUFsqtAvdlpz1t47Q=; b=uKRS9xzvcsZ1nYF2GA1XTOT3T9O8Zky0nYsAYziLabtGFtkigGL0/WZEPouZ1pM7y1 MfcuOj+OIJhEPgtr8kesQIREsOkHXMx+GcdKvi2y3UAoubU39PGpi94STWkOoG2CLa/r e1MQCrR3E3OFV2VLlhwKm8GzKCYNFlm9fx1ZJOBdAFnuJO/SrTE1iSXMi5B3AGgB5bGq ju+ZEWHe9RLQ2xJpKVDL8OagyZX6Uu9zYKiyg1+qM6tLqPUjU+Uo/juc9Ze/wKDx4vQ4 h8ZzNhZhOjxJ5j/eCtXmNmvXah3Joc60YE2qKzCLxyBAErTSZnK9jfIO8PPUzNneIw4r rEzA== X-Gm-Message-State: AOUpUlE/Sbx9aCShYKvO/nY04KJWD6VEBG1SZ4G7nPoi0RUwCynI8wCk zqI7ydzIwSLKKnlXaZL25oFcVMEmORhwktFoe3QVJb5HG/KhZkM2kNTToTeeZyxoCBhZ2AYwcLB AcQqgxxldN2/fd/1g/fpiivF7jRp5kroUC7mXGxAvK6uo32RFH6DS9KrIf5Qd4Qfs4fkxYjtvh9 OXEKxnWeLU2a5iislsUgacVEngkNIK0xVd4lRFXXsZ/JZaGVxd6cl8xsYM355opdxdVXY3sEDJ/ GrFefOOvf9xEMCJtaZLB6q2whHYwB32YuqBeOq//guTrDdffrS4uTwkwZ8aHm9Gt3F69T5b7kHi S/gtPdNv+eE/PmNGMGn7Z+XssIr0noRh5NKYadtyRRXtSf5KHKJiBqlwDEwsg93dqtYw/qwNvTd 4 X-Received: by 2002:a63:d80f:: with SMTP id b15-v6mr49743049pgh.347.1534907282680; Tue, 21 Aug 2018 20:08:02 -0700 (PDT) X-Received: by 2002:a63:d80f:: with SMTP id b15-v6mr49743003pgh.347.1534907281483; Tue, 21 Aug 2018 20:08:01 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1534907281; cv=none; d=google.com; s=arc-20160816; b=AcMQlLIkiI/6m9QTb9eYlHRwgmFTsx2Y5ytDq+NLOXs/Y8HvTPoJbelAMJh0hFS/FZ eGdIhl5AG2iywkgA3s9x8y2pQS8Y7j3zEoVDGj9bBloC+9vrYdAn2ARlaOyAqBIxA/lr kPdhOJXJizJCQEKe66cXLHy1iOojm5OtCC/xkdMgi51x9sfFePNZ3H2pqnxJ/8auNlvr qf4nu3cqs2bFg7PikmHViqUvaoH1w1xDZHkofFZffEf3at2JJsOUdOfv+vfw0ALNpGMA zPa0pFUbSvS4SZY3UODrCOK33PEwTqDoR/UMfpjbeMf6l0rG6A2b0F+ucD9np64ER4em OTBg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature:arc-authentication-results; bh=FZQVcSjva4KqT1QnxQl07tGVuHDUFsqtAvdlpz1t47Q=; b=ysPm+LEtDOohDMTs5Yp5l9lbRPgdsuGSrnrRzpZd9RZUv7QYYlD5SQaFFa9omXCnVr ewR+Mx+Wl7NMFqUltuexba33Gwd5Uvr94a201N4Nxtq93w7a2Yvyp9vHgb5dSkLxxkHy gTgDeV+WbRHGqIsf+qkclwgYG7QUbbnoibi/lExpGqJaiWoApt98TVBMDGJk/am0Ox+T AfoIhwBPcAdFgYeEjFuobrwztM5koTj3GQ4DdxgZSba7sHavp41KMnrzJpG8avaf9jXW LeO1KTNYezBMNjpHDhi1WIzuZ59SW67CRvSVJdQ4qbalhrOXP7UjkBEOoGp7zLsa81+c dMwA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=dUBGkRw4; spf=pass (google.com: domain of hejianet@gmail.com designates 209.85.220.65 as permitted sender) smtp.mailfrom=hejianet@gmail.com; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from mail-sor-f65.google.com (mail-sor-f65.google.com. [209.85.220.65]) by mx.google.com with SMTPS id c41-v6sor170008plj.24.2018.08.21.20.08.01 for (Google Transport Security); Tue, 21 Aug 2018 20:08:01 -0700 (PDT) Received-SPF: pass (google.com: domain of hejianet@gmail.com designates 209.85.220.65 as permitted sender) client-ip=209.85.220.65; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=dUBGkRw4; spf=pass (google.com: domain of hejianet@gmail.com designates 209.85.220.65 as permitted sender) smtp.mailfrom=hejianet@gmail.com; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com 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=FZQVcSjva4KqT1QnxQl07tGVuHDUFsqtAvdlpz1t47Q=; b=dUBGkRw4fQaiMecEzf8cFWCp6lhVcwMzGzSJuhJ/kDZkOS/u/pcLbU9y5Xf1q1j77r dtL/gCMhC9eqDMKxzYrXtYRlA5a94kZIwjuX+W8VHjreqVs9v6Dscjei2XBBlnncnM4p n73u1ktG72mHDkQonOkyTO1/t4u/t1qqLjVMvDj7/lvdikAWO7X+SCQYDPl7U2GSVlfJ M2ft/3Qfgwnj4P1+9mUHj4676Eku6rYRBV32xYXzPBdGb0x3G/XnuydXMwFf72akSOpp 7Krekn3z/4ghm2DDp1SZzdN5QUHqpfUvUf0gya3hnJ/6JYU5XPlrKy0IN3wXa46RWS/6 MJeA== X-Google-Smtp-Source: AA+uWPx7O8adWCfcvaXiGqLDUgNNylojl01bhH+g/Gjqes6HLwaxhGQ5ncYX6Lz40i2yhizGHITgng== X-Received: by 2002:a17:902:42e2:: with SMTP id h89-v6mr51827967pld.69.1534907281175; Tue, 21 Aug 2018 20:08:01 -0700 (PDT) Received: from ct7host.localdomain ([38.106.11.25]) by smtp.gmail.com with ESMTPSA id q7-v6sm440165pfq.43.2018.08.21.20.07.49 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 21 Aug 2018 20:08:00 -0700 (PDT) From: Jia He X-Google-Original-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 , 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 Subject: [PATCH v11 2/3] mm: page_alloc: remain memblock_next_valid_pfn() on arm/arm64 Date: Wed, 22 Aug 2018 11:07:16 +0800 Message-Id: <1534907237-2982-3-git-send-email-jia.he@hxt-semitech.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1534907237-2982-1-git-send-email-jia.he@hxt-semitech.com> References: <1534907237-2982-1-git-send-email-jia.he@hxt-semitech.com> X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: X-Virus-Scanned: ClamAV using ClamSMTP 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. Daniel said: "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." About the performance consideration: As said by James in b92df1de5, "I have tested this patch on a virtual model of a Samurai CPU with a sparse memory map. The kernel boot time drops from 109 to 62 seconds." Thus it would be better if we remain memblock_next_valid_pfn on arm/arm64. Suggested-by: Daniel Vacek Signed-off-by: Jia He --- include/linux/mmzone.h | 9 +++++++++ mm/memblock.c | 30 ++++++++++++++++++++++++++++++ mm/page_alloc.c | 5 ++++- 3 files changed, 43 insertions(+), 1 deletion(-) diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index 32699b2..8e5e20b 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h @@ -1266,6 +1266,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 unsigned long memblock_next_valid_pfn(unsigned long 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 +1291,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/memblock.c b/mm/memblock.c index 3d03866..077ca62 100644 --- a/mm/memblock.c +++ b/mm/memblock.c @@ -1140,6 +1140,36 @@ int __init_memblock memblock_set_node(phys_addr_t base, phys_addr_t size, } #endif /* CONFIG_HAVE_MEMBLOCK_NODE_MAP */ +#ifdef CONFIG_HAVE_MEMBLOCK_PFN_VALID +unsigned long __init_memblock memblock_next_valid_pfn(unsigned long 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*/ + static phys_addr_t __init memblock_alloc_range_nid(phys_addr_t size, phys_addr_t align, phys_addr_t start, phys_addr_t end, int nid, ulong flags) 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))