From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9B41EC433EF for ; Sat, 19 Feb 2022 10:27:29 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 080F76B0074; Sat, 19 Feb 2022 05:27:29 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 009B26B0075; Sat, 19 Feb 2022 05:27:28 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id E139E6B0078; Sat, 19 Feb 2022 05:27:28 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0200.hostedemail.com [216.40.44.200]) by kanga.kvack.org (Postfix) with ESMTP id CE5526B0074 for ; Sat, 19 Feb 2022 05:27:28 -0500 (EST) Received: from smtpin14.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay05.hostedemail.com (Postfix) with ESMTP id 8060F181C442E for ; Sat, 19 Feb 2022 10:27:28 +0000 (UTC) X-FDA: 79159152576.14.0B22985 Received: from mail.marcansoft.com (marcansoft.com [212.63.210.85]) by imf05.hostedemail.com (Postfix) with ESMTP id 5E42F100006 for ; Sat, 19 Feb 2022 10:27:27 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: marcan@marcan.st) by mail.marcansoft.com (Postfix) with ESMTPSA id DB013420CF; Sat, 19 Feb 2022 10:27:22 +0000 (UTC) To: Waiman Long , Andrew Morton , "Kirill A. Shutemov" , Ingo Molnar , Stephen Rothwell Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, Justin Forbes , Rafael Aquini References: <20220201192924.672675-1-longman@redhat.com> From: Hector Martin Subject: Re: [PATCH] mm/sparsemem: Fix 'mem_section' will never be NULL gcc 12 warning Message-ID: Date: Sat, 19 Feb 2022 19:27:20 +0900 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.13.0 MIME-Version: 1.0 In-Reply-To: <20220201192924.672675-1-longman@redhat.com> Content-Type: text/plain; charset=utf-8 Content-Language: es-ES Authentication-Results: imf05.hostedemail.com; dkim=none; dmarc=pass (policy=none) header.from=marcan.st; spf=pass (imf05.hostedemail.com: domain of marcan@marcan.st designates 212.63.210.85 as permitted sender) smtp.mailfrom=marcan@marcan.st X-Rspam-User: X-Rspamd-Server: rspam07 X-Rspamd-Queue-Id: 5E42F100006 X-Stat-Signature: mq93ikoog3ih3hg4dyktttsgshg8z49m X-HE-Tag: 1645266447-363533 Content-Transfer-Encoding: quoted-printable 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: On 02/02/2022 04.29, Waiman Long wrote: > The gcc 12 compiler reports a warning on the following code: >=20 > static inline struct mem_section *__nr_to_section(unsigned long nr) > { > #ifdef CONFIG_SPARSEMEM_EXTREME > if (!mem_section) > return NULL; > #endif > : >=20 > With CONFIG_SPARSEMEM_EXTREME on, the mem_section definition is >=20 > extern struct mem_section **mem_section; >=20 > Obviously, mem_section cannot be NULL, but *mem_section can be if memor= y > hasn't been allocated for the dynamic mem_section[] array yet. Fix this > warning by checking for "!*mem_section" instead. >=20 > Fixes: 83e3c48729d9 ("mm/sparsemem: Allocate mem_section at runtime for= CONFIG_SPARSEMEM_EXTREME=3Dy") > Signed-off-by: Waiman Long > --- > include/linux/mmzone.h | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) >=20 > diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h > index aed44e9b5d89..bd1b19925f3b 100644 > --- a/include/linux/mmzone.h > +++ b/include/linux/mmzone.h > @@ -1390,7 +1390,7 @@ static inline unsigned long *section_to_usemap(st= ruct mem_section *ms) > static inline struct mem_section *__nr_to_section(unsigned long nr) > { > #ifdef CONFIG_SPARSEMEM_EXTREME > - if (!mem_section) > + if (!*mem_section) > return NULL; > #endif > if (!mem_section[SECTION_NR_TO_ROOT(nr)]) >=20 This broke booting on Apple T6000 (M1 Pro; support not yet mainlined) and it is obviously incorrect. !*mem_section is the same thing as !mem_section[0], which is always checking element 0 for NULL instead of the element we're interested in. These machines don't have memory at 0, fail the spurious check, and crash on early boot. [ 0.000000] Booting Linux on physical CPU 0x0000000000 [0x612f0240] [ 0.000000] Linux version 5.17.0-rc4-asahi-next-20220217-00141-g3eb6fdba1573 (marcan@raider) (aarch64-linux-gnu-gcc (Gentoo 11.2.0 p1) 11.2.0, GNU ld (Gentoo 2.36.1 p1) 2.36.1) #1112 SMP PREEMPT Sat Feb 19 18:01:31 JST 2022 [ 0.000000] random: fast init done [ 0.000000] Machine model: Apple MacBook Pro (14-inch, M1 Pro, 2021) [ 0.000000] efi: UEFI not found. [ 0.000000] earlycon: s5l0 at MMIO32 0x000000039b200000 (options '') [ 0.000000] printk: bootconsole [s5l0] enabled [ 0.000000] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000000 [ 0.000000] pc : sparse_init+0x150/0x268 Please revert fff3b2a167db5 and edecc06b4d34e. --=20 Hector Martin (marcan@marcan.st) Public Key: https://mrcn.st/pub