From patchwork Fri Jul 6 08:14: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: 10511007 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 6EC086024A for ; Fri, 6 Jul 2018 08:15:16 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 5EFE428161 for ; Fri, 6 Jul 2018 08:15:16 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 51A1E284E9; Fri, 6 Jul 2018 08:15:16 +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 B10FB28161 for ; Fri, 6 Jul 2018 08:15:15 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id C66F76B000D; Fri, 6 Jul 2018 04:15:14 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id BF17F6B000E; Fri, 6 Jul 2018 04:15:14 -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 A42E86B0010; Fri, 6 Jul 2018 04:15:14 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-pf0-f200.google.com (mail-pf0-f200.google.com [209.85.192.200]) by kanga.kvack.org (Postfix) with ESMTP id 614D26B000D for ; Fri, 6 Jul 2018 04:15:14 -0400 (EDT) Received: by mail-pf0-f200.google.com with SMTP id l21-v6so2300372pff.3 for ; Fri, 06 Jul 2018 01:15:14 -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=rBt92G0faVb+l4LzkWBVpJgQsD4xrw1+OJsW6IjcYy8=; b=Fg4VHwh9mXYMRIcEQogRH3EycydWfrxpZWVyvbMDFr37ieDindJ4wapwifL9Xk+A+C t1hEM4c+0LuJWFJg7ZhnlJjeP/bA4VXcQAFyM55mS6Auss2DsMR1bnPlJYYXL1niqXg4 ETmzYoIAW2LNxOyvsfNF4oiCt0K8T3Fylc8XTWy/6zuLCx3GUKjyNVReX71FaE3NkEKD zha0rMrhVre4P2uvREIr3IBd0L+gOVAct6V2nodxItEngQGVhfVG3YMCHohLv8KfkLcQ nok37oe+TKMj1l3i2FCXbZdZzr4jX59cOqYHdXZnSPv55CuPAYgw9eGJDlqJ/PexhLL+ NBDw== X-Gm-Message-State: APt69E3eAfps5OJSA8DmJhgomTn9UUrW1lP4qrQ3/ZIlcoj5Dd9Ktw88 BBrfY5XTHBzDu+gB6MppJrIjQGdq5cWMSb+9YZkObtxLyWZyIROSwOxDggjycZgVnbz94oys7Ii wUP5Ti8z3ip54PsZijkMG/G+0svtprYnqP/9OPPS+JcAfeaFgEgvdIR8cEBq/Al6O1r1YwsLjAp H92fqinCCVlOA8nfbLB+Swzb4zGp5Ui2Q+Hp76Bptb6XpfK8XeehsABBw3QDqlN9VAQDvs3jbAw oqlikPVm1UXLEMJDfYUvQujIsUkt8DV8SEWzoiTFqkMuWoVN5qpMW+8nSPpylWy3GceFBFujJe1 oXEszwqz7PE5N9thejRXY4YE5bHg3eSw7EWSwqoYibGIkdGID06sXZqMMXcJ/l1iKFS23cAUBmx 8 X-Received: by 2002:a63:c252:: with SMTP id l18-v6mr8541750pgg.76.1530864914065; Fri, 06 Jul 2018 01:15:14 -0700 (PDT) X-Received: by 2002:a63:c252:: with SMTP id l18-v6mr8541718pgg.76.1530864913327; Fri, 06 Jul 2018 01:15:13 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1530864913; cv=none; d=google.com; s=arc-20160816; b=Ieh9ziBeK4Ax2cWG3wl4NbH1gmz2QWnZGNuc5Htvg+eHT1TEZ92xvQ0qsx9VOjINQT 8yNBKVLPsxA1f6oekEbMHQp0LbKyLKkCpgtMBgcDAUDA0KgTROJcWrxnDW385x8OPr+6 ugg0AMkrK8lZLkD256kS+aU8fFuDnnA22vpzmw6BOz8x6nN56HKnJyUCYjW/h3i/lzNo XbiwWNG3SSfEOg8Z5t6phwsDDowKKZcEa2VM0FsV+btB7/Db3yD4FTASu2uX2Jn2upir M8PFVP81NGeQoX4x2ZB+fyV4T0H5HjZVJMbocUsvpSqGloQi+DGjJ0HNCSYFETUSyvUJ I6rA== 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=rBt92G0faVb+l4LzkWBVpJgQsD4xrw1+OJsW6IjcYy8=; b=juaDROvXEYBe47XJaADEygtk1bLiLCqn8veTTc3+EiGsrn9I07a4UPeq6SYj5N9Q4P guKPsfipBZfSxvPYDturptq9DCTLNsRmrW5qG9LFa+n0q17cd2ttrCjnh4IUjPP/LjRf CwN8xM/4K/i5/k0r9IHxyoh+m1FurENE6XRMtUTQMIXQoZXPzkwNs4w84gG4RTqrNF5T kSehiHoxew8NAbfb/H2WvHKsWaGpBcrIwhMuULzw2V+vxYiALy/mXLy1ZCAp+/FHVc3D X/BVIAWI+b13xdoa5TpR1HgfA5cNXG+I9OYQSlgMFUnA8Wd3S7gmd9DCsSNg3ocd9Qim Cyjw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=p9GAMPcM; 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 n4-v6sor2004556pga.70.2018.07.06.01.15.13 for (Google Transport Security); Fri, 06 Jul 2018 01:15:13 -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=p9GAMPcM; 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=rBt92G0faVb+l4LzkWBVpJgQsD4xrw1+OJsW6IjcYy8=; b=p9GAMPcMJ1/KGfcZ9ULSFU1uurbb9Xh4TPGNVcVHLmEE5CEwPWb1+XbTtcmYRp+eeH TllUdRzP7dpHRSs2r4f0jxf5y3M5IPdPFtmrLmqGsOkiMKEDYqSpsK0darnALRSSgDr+ 32HJsGFMHKhyEcxmMzTkLqBetQGysQuNKjP8z+RZXM0Hl/ry7rbIpgJmY0gZKGJ3phM2 I4jiNLtFSbxAFY19opvGPQxhw/VYE4juMSn3grTnWfpDOHLMS0n5Mvo2d+GdjiEJ2a+L pk71+ZU6Ljgtyf7+m7CTcyRFqxsunbSuwLpITGuSX/hq0roclK5oZOnMK7Ek1robjO7r 4mtg== X-Google-Smtp-Source: AAOMgpeS4VY7yFiOn8jWTX63Qcc0tacptHOccY0y748dsmgvVcpm6AvISdIifp17xdOr5TwAklTOyg== X-Received: by 2002:a65:57c9:: with SMTP id q9-v6mr8700904pgr.128.1530864913069; Fri, 06 Jul 2018 01:15:13 -0700 (PDT) Received: from ct7host.localdomain ([38.106.11.25]) by smtp.gmail.com with ESMTPSA id c141-v6sm4673049pfc.25.2018.07.06.01.15.00 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 06 Jul 2018 01:15:12 -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 Subject: [PATCH v10 2/6] mm: page_alloc: remain memblock_next_valid_pfn() on arm/arm64 Date: Fri, 6 Jul 2018 16:14:16 +0800 Message-Id: <1530864860-7671-3-git-send-email-hejianet@gmail.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1530864860-7671-1-git-send-email-hejianet@gmail.com> References: <1530864860-7671-1-git-send-email-hejianet@gmail.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 From: Jia He 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 | 11 +++++++++++ mm/memblock.c | 30 ++++++++++++++++++++++++++++++ mm/page_alloc.c | 5 ++++- 3 files changed, 45 insertions(+), 1 deletion(-) 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/memblock.c b/mm/memblock.c index b9cdfa0..ccad225 100644 --- a/mm/memblock.c +++ b/mm/memblock.c @@ -1139,6 +1139,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 +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*/ + 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))