From patchwork Fri Jul 6 09:01:11 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jia He X-Patchwork-Id: 10511123 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 47F216024A for ; Fri, 6 Jul 2018 09:02:06 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 399801FFE6 for ; Fri, 6 Jul 2018 09:02:06 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 2D8AE283BF; Fri, 6 Jul 2018 09:02:06 +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 8DD931FFE6 for ; Fri, 6 Jul 2018 09:02:05 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id A479F6B000A; Fri, 6 Jul 2018 05:02:04 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id A1E926B000C; Fri, 6 Jul 2018 05:02:04 -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 90E9F6B000D; Fri, 6 Jul 2018 05:02:04 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-pf0-f197.google.com (mail-pf0-f197.google.com [209.85.192.197]) by kanga.kvack.org (Postfix) with ESMTP id 4D3816B000A for ; Fri, 6 Jul 2018 05:02:04 -0400 (EDT) Received: by mail-pf0-f197.google.com with SMTP id b17-v6so5295102pff.17 for ; Fri, 06 Jul 2018 02:02:04 -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=trsvvjFaWFlWzh35swbpOMT9m1U9ONSGAS9EfWi48fK9cjLicfWl8cAWed+VJ4piLg NHhswmAEuks8qOT9d6zL+8OczIMXQ6F1dCvRWQUZO2FJ3eic81IMmySELdXwcEyUaqC6 H4nVPLxgyD1qJcFdju964OTNKVFA341dy+EfL19GTb4DrTIypwCfQr4AM0dXP2N7lLQH eoT5I2yprbTLq/Wkbhh6PAzDSLMawO19dH3n3xLowihYrtfm6COxaN073Q2Zz0ZUjImN PJM7UtlrqLPEyY1GHujs/E0hTgOkMEgrrTY3c0khPIeIUIohL6yjb/NPCdwqTD25L5eq VPZA== X-Gm-Message-State: APt69E0BSz8HMp2umeO2/kvutu6f6Ufuiztudi+O3TvWIg4Ml1BSBq5M Yc23f+Q4ieeicTKhYz55aLrZYeJUUpRwtlIlKb/P1b/XJ7Y0gV64kjGfx+j4yM5MeTUYG91HBte /wDtGKNtDuvS6qkXIzHkUOrLOOZkA3IXu8vxKZAcgNUmkepvHMN1eU8uUj1BRjSKovYw8/Dd09s twJ5d9rArkBiuLMXx94kkOB1Oqe9uTeznUJ38aYc3HXwbu4lo23A1Z27di1eBpOfDAvywbgErXa MWFYTupym3DFmiHospFc0h36+YQAE12zgzoSLicPt1/8+QEHp+th6vfLgtYNID/+ltnlDaPTcT2 +GOoNxKjR8dXmAconYhlijEzvZrgVbeu/z73/x8gNO235Vb76bA8dAKWnkS5xyya5fVV+90zElJ + X-Received: by 2002:a65:46ca:: with SMTP id n10-v6mr2469975pgr.345.1530867723974; Fri, 06 Jul 2018 02:02:03 -0700 (PDT) X-Received: by 2002:a65:46ca:: with SMTP id n10-v6mr2469920pgr.345.1530867723160; Fri, 06 Jul 2018 02:02:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1530867723; cv=none; d=google.com; s=arc-20160816; b=l7qz+mwteDkST3joipGdbbsyqCeEvqhhXHr8NWfNnFmgeur6f9o7cSzwoVsU34gLix medCxHLvm5wGTeaO8C5U/eFteovcBODB0RbraN7ia/yDXQHrcABtsdailPnuauAfZJml PqOs7X2NWK0tKrnvJ3ziSVwPKBC0vfxCGN7k1QBbQr10rhLEPjip6rMrv2QBFJN7uMuH o9bB/kmnghU7/jbquxt1o8cYSCymvzcFZxaMB/RGtRPcHkgcV6zreJ1RXAyEeLDWCL76 RpCz2U4e+p9+oCPQAyKsOOX96VymHUZ0U38xlY2ZK7c3n6iokC8nDpMikwtvuiAYWQ71 zKRA== 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=gyH+wvaaHmEbkR09f4qhWmRWR32Smml3LurwW9akwkxkmKXM/gh+2lgBvi2wvY3gFZ dcOG4Es/FMkReIJs+cjzWTAvo7CgXnvUqKy3VyDonOipS/m7nKqQVt8i8CG+G/b1InM5 +vgbYPd2Ipru28AgtEWMx1bj1CheOmFYmTqrRAXjlPCQHQPy2SBbIwwALZxeZc6SV69S xkbDHRICHqCPMnt10RB2gb7CsLSsyWw9JmUG1HoxlhjWFTRKrR4CzV4uWeZCjPm4H7Ji 1D8VUh7Pxrs8pCH/B3tlkdEqg1yXK7iR/Me5g3M031Vxx0q2v87Fw8ej6cGC/eZFUQef br6g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=u0kItspC; 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 g36-v6sor2399123plb.4.2018.07.06.02.02.03 for (Google Transport Security); Fri, 06 Jul 2018 02:02:03 -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=u0kItspC; 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=u0kItspC61BqUab9sXL0VtDMPQpptLfkx2ZFWY3hkl8eL8rydpEm9z8v9Fr3Tk1zvK iHRGWEjjxKRAAHbCocvGZVddgegK63JSG+oZybOg9/XZVUUhimxwDeRfam0uPdPY59yN G6K1qxivYQYRu5K/Ymase7m2uvsn1lUKxEGjEWeL04QMGuBXyDNwo+mIoTydA5K2P1Sq YCxNbVCuZcdgTbN23dugG6OUhlz3m4IXMkDOqJTW+tCtKY7zV8VAnEo1FwOe4HQDIiQX XN5MHDK+p7OVEFvCFNEXWXw86KPGdHAjPXZzbRRSUfOR/A/jZSyCRELNryHJLWg7XDNT PD6A== X-Google-Smtp-Source: AAOMgpdnFhKiZyYODFPA+Y+6VkKTqqNXFjlCJ2zHRd6p2YCNiEUnUB/tF1ka7YwRAgjRJ+xYSgvDvA== X-Received: by 2002:a17:902:8347:: with SMTP id z7-v6mr9686011pln.290.1530867722888; Fri, 06 Jul 2018 02:02:02 -0700 (PDT) Received: from ct7host.localdomain ([38.106.11.25]) by smtp.gmail.com with ESMTPSA id e5-v6sm10837092pgs.59.2018.07.06.02.01.51 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 06 Jul 2018 02:02:02 -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 Subject: [RESEND PATCH v10 2/6] mm: page_alloc: remain memblock_next_valid_pfn() on arm/arm64 Date: Fri, 6 Jul 2018 17:01:11 +0800 Message-Id: <1530867675-9018-3-git-send-email-hejianet@gmail.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1530867675-9018-1-git-send-email-hejianet@gmail.com> References: <1530867675-9018-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 Reviewed-by: Pavel Tatashin --- 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))