From patchwork Thu Apr 5 08:04:34 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jia He X-Patchwork-Id: 10323843 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 6428C600CB for ; Thu, 5 Apr 2018 08:05:51 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 55C29290A4 for ; Thu, 5 Apr 2018 08:05:51 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 4A11A290B4; Thu, 5 Apr 2018 08:05:51 +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=-1.9 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, DKIM_VALID, FREEMAIL_FROM autolearn=unavailable version=3.3.1 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id C266B290A4 for ; Thu, 5 Apr 2018 08:05:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:MIME-Version:Cc:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:References: In-Reply-To:Message-Id:Date:Subject:To:From:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=+2VPqzEgpPuG7KRpMzDzEYgxv09hBbZEZ8baRKIW5jE=; b=URrV6zd+LExEEQASc2l6lnd18f qN1TT+BClSgfCmekk1mVvdaW7bfVXgtPxa1gzO7F9ywWG98DcSN0hbUBmvEkzi+CXZmyO4NbbDPtn BWbS9z14UkSXsChXhdSkYvo6oHjTePxLbt5mKbFNHHAs88Mu21SoQFilh74pOGid7aH/VhLLtL0/M HtujvPvJRIke2IoUwMdMQOjB8VU3GSfJvAZSTv5EPmkpmPX80O2n1+uNhVMYO9l59o0/3vtzXg7RS KvPL7z4mrzIvXV9JCneGxkFeFwmFRzFYd44xKBWOhwrzK0ecMOEzlMwN5IrToV2Tw5uevbHEFgR1O lfdctmEA==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1f3ztr-0003eP-8A; Thu, 05 Apr 2018 08:05:39 +0000 Received: from mail-pl0-x244.google.com ([2607:f8b0:400e:c01::244]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1f3ztb-0003NF-LO for linux-arm-kernel@lists.infradead.org; Thu, 05 Apr 2018 08:05:28 +0000 Received: by mail-pl0-x244.google.com with SMTP id 59-v6so15363750plc.13 for ; Thu, 05 Apr 2018 01:05:13 -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=cbkps0E4Uj8hjeJYIslDwEKVqraBu9Yd02GLBMIAU+k=; b=NeyX0+aZa6Wklkxgyq8epCuk02OjybR6YTYRjWhpU86fXEk6VmcyNEu+j0actrukSf LlGo0K7KHfe5LI8rnBnrwyJ2NLeJ7PyPu+77FPM/kRKXH8RplohfMe07tIFdkaB8Rr9B zDK68UioYdPBaUM61bJjcTC0obks/ObtzuyLfWoIO8VwZm0YZSQguhQsfNTJSuEade0h je1IcBoDeMEmsw0d/9J+ONN4wOaVzSNGnfQeZ2ThCFm8/bbML6AuzOp8m2ua7i/6Npt/ uW0pPnUlIOSuiY8I6cyKyKjI8pZdMwfaWeeZAv7fYhUw0Dp5Xqi1UcDNar0iWGB9HqBp D27g== 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=cbkps0E4Uj8hjeJYIslDwEKVqraBu9Yd02GLBMIAU+k=; b=qLr2C1b2LLobkFi0dip0KQJBnMplnmH1wH2J6+NMm/nydKmoc0lEkZRQRdfEcablsW LWDurD4nrhGL+vrj/2WNKKHAW2Ot6dRleubwWrfKprSm6yw+rhbp9GxL1LOHK2GwRVzr XIuCwxo7fq52AtiCbXN0qtZltVHXxBlTDS+uE8p672vRvjAaSoEU3Zc8xzIJxcKf1WyZ m/Om9lTV9ex8kgpB86nkXtzj3O5bpHBusJsAnz9EJAy+nI0sHtO0zrYIzC8Q09gE9a9s 5Q70J5YnqsQhP6Ayj6WJOifhnEgS9NlnY/kSMozGDMZmwDdTfmF4H3FQFcYKU+q0IcK0 fzFA== X-Gm-Message-State: AElRT7GEV7/GYOJlAqgUUJWz0gOnwdLl2x6P41uipCp7N/zXE9qUlZWW 1tuzXgUvnMnPfWTlDaoivps= X-Google-Smtp-Source: AIpwx4+KMR2F86Bzm38bztvAQY8/O/5aT++i+hTX+XxdF2ZI0M50ukI4zdyTjmsViqmtrFFgCaTv4A== X-Received: by 2002:a17:902:8a93:: with SMTP id p19-v6mr22531885plo.256.1522915512970; Thu, 05 Apr 2018 01:05:12 -0700 (PDT) Received: from localhost.localdomain ([38.106.11.25]) by smtp.gmail.com with ESMTPSA id 2sm14983690pft.33.2018.04.05.01.05.00 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 05 Apr 2018 01:05:12 -0700 (PDT) From: Jia He To: Russell King , Catalin Marinas , Will Deacon , Mark Rutland , Ard Biesheuvel , Andrew Morton , Michal Hocko Subject: [PATCH v7 1/5] mm: page_alloc: remain memblock_next_valid_pfn() on arm and arm64 Date: Thu, 5 Apr 2018 01:04:34 -0700 Message-Id: <1522915478-5044-2-git-send-email-hejianet@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1522915478-5044-1-git-send-email-hejianet@gmail.com> References: <1522915478-5044-1-git-send-email-hejianet@gmail.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20180405_010523_736474_2B2C4379 X-CRM114-Status: GOOD ( 25.15 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Gioh Kim , Wei Yang , linux-mm@kvack.org, Eugeniu Rosca , Petr Tesarik , Nikolay Borisov , Jia He , Pavel Tatashin , Daniel Jordan , AKASHI Takahiro , Vlastimil Babka , Andrey Ryabinin , Laura Abbott , Daniel Vacek , Mel Gorman , Vladimir Murzin , Kees Cook , Philip Derrin , YASUAKI ISHIMATSU , Jia He , Kemi Wang , linux-arm-kernel@lists.infradead.org, Steve Capper , linux-kernel@vger.kernel.org, James Morse , Johannes Weiner MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org 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. 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/arm64 and move the related codes to one file include/linux/arm96_common.h 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..eb56071 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) (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.