From nobody Tue Jun 9 01:18:32 2026 Received: from cstnet.cn (smtp25.cstnet.cn [159.226.251.25]) (using TLSv1.2 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 845BF42048 for ; Mon, 25 May 2026 04:23:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=159.226.251.25 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779683032; cv=none; b=fNB0vcXUhkYJLuakqtznBjeGkGs7249foAR4L1Z3TjuEyZI6xRSh1c2Wl9siMDVJqBXRDvrntMzj6muw5j5atSPC5EZIbcB+BHVPDkJ0UjreUjWSIZ1s2u5ch8CkeQBa/ydgOurIoNY3gF/Gm+MG7MWx+0Brxyh1NM/BAJjA+es= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779683032; c=relaxed/simple; bh=w3VB+9vCZHW4xwjlu3PJfUoRzok8u2A2TJxj1zc4u3I=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:To:Cc; b=kFEStFtUSSMkyyxaC88b21sI8JJsFlzKOuTr5FeCiNe+6IU4BtBFna8n6h17EKxFH/iYihz8b1OIChybfRANkR+fgCJ+ZS+BUS8xpe7WiNsv6g5rIDDPmsWmQALtEn9O3Ip2YmvrsmrFofC/IJe8TWOJ2/rhD4wTnxqXJeb6M5o= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iscas.ac.cn; spf=pass smtp.mailfrom=iscas.ac.cn; arc=none smtp.client-ip=159.226.251.25 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iscas.ac.cn Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=iscas.ac.cn Received: from [127.0.0.2] (unknown [123.118.218.47]) by APP-05 (Coremail) with SMTP id zQCowABHk8bDzhNqWZZiEQ--.4758S2; Mon, 25 May 2026 12:23:32 +0800 (CST) From: Vivian Wang Date: Mon, 25 May 2026 12:23:29 +0800 Subject: [PATCH] riscv: mm: Call mark_new_valid_map() after hotplugging vmemmap Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260525-mark-after-vmemmap-populate-v1-1-e698d859ba16@iscas.ac.cn> X-B4-Tracking: v=1; b=H4sIAMLOE2oC/y2O0WqEMBBFf0Xy3JGodVellP2PZQtjnLTpGpNmE imI/96s28cDh3vPJpiCIRZDsYlAq2HjlgzVSyHUFy6fBGbKLGpZn2Rbt2Ax3AF1pACrJWvRg3c +zRgJTt04nXvZNb3qRV7wgbT5PdavtydzGr9JxcfkvxHoJ+Xb+NTEiEygnLUmDsV6LisIqvrY9 odtiRmPpKF4O4oa2UDOnGaCu6ZFEfjgYj4A9ikYlxg0pjnCWoME3cmpa9rXHDldDCvkElWplnd x2/c/GqTYygsBAAA= X-Change-ID: 20260525-mark-after-vmemmap-populate-68bd790839c9 To: Paul Walmsley , Palmer Dabbelt , Alexandre Ghiti , Andrew Morton , David Hildenbrand , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko Cc: linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, Vivian Wang X-Mailer: b4 0.15.2 X-CM-TRANSID: zQCowABHk8bDzhNqWZZiEQ--.4758S2 X-Coremail-Antispam: 1UD129KBjvJXoWxXrWkAF13Xr13AFW8Cw45KFg_yoWrXFy7pF 9Fgws7KrW5X3429397Zw429rW2q3ZY9FW7Ka17K34rZr1aqFy7Zwn5Ka1Yyry5JrZ5Gay8 Z39Ik3s8Cw1DAa7anT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUU9014x267AKxVW8JVW5JwAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2ocxC64kIII0Yj41l84x0c7CEw4AK67xGY2AK02 1l84ACjcxK6xIIjxv20xvE14v26r4j6ryUM28EF7xvwVC0I7IYx2IY6xkF7I0E14v26r4j 6F4UM28EF7xvwVC2z280aVAFwI0_Cr1j6rxdM28EF7xvwVC2z280aVCY1x0267AKxVW0oV Cq3wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0 I7IYx2IY67AKxVWUGVWUXwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r 4UM4x0Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwACI402YVCY1x02628v n2kIc2xKxwCY1x0262kKe7AKxVWUtVW8ZwCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7x kEbVWUJVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E 67AF67kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVWUJVWUCw CI42IY6xIIjxv20xvEc7CjxVAFwI0_Gr0_Cr1lIxAIcVCF04k26cxKx2IYs7xG6r1j6r1x MIIF0xvEx4A2jsIE14v26r1j6r4UMIIF0xvEx4A2jsIEc7CjxVAFwI0_Gr0_Gr1UYxBIda VFxhVjvjDU0xZFpf9x0JUZYFZUUUUU= X-CM-SenderInfo: pzdqw2pxlnt03j6l2u1dvotugofq/ section_activate() creates new mappings in the vmemmap range without flushing TLB, which may cause faults on some RISC-V implementations that cache non-present PTEs and crashes. This seems to be most easily reproduced with DEBUG_VM=3Dy and PAGE_POISONING=3Dy, which causes these newly mapped struct pages to be poisoned i.e. written to immediately after mapping. Add a hook vmemmap_populate_finalize() in __populate_section_memmap(), and implement it as calling mark_new_valid_map() on RISC-V, which arranges for the exception handler to deal with these faults if they happen. Signed-off-by: Vivian Wang --- I'm not sure if this is the right place to add this hook. I didn't add it to vmemmap_populate because it doesn't seem to be called in all cases. Please advise. Depends on my earlier kfence fixes for mark_new_valid_map() [1]. Found while testing AMD_HSA/ZONE_DEVICE on SpacemiT K3. Using ZONE_DEVICE requires another fix [2]. [1]: https://lore.kernel.org/linux-riscv/20260303-handle-kfence-protect-spu= rious-fault-v2-0-f80d8354d79d@iscas.ac.cn [2]: https://lore.kernel.org/linux-riscv/20260309-riscv-sparsemem-vmemmap-l= imits-v1-2-f40efe18e3cd@iscas.ac.cn --- arch/riscv/mm/init.c | 6 ++++++ include/linux/mm.h | 1 + mm/sparse-vmemmap.c | 6 ++++++ 3 files changed, 13 insertions(+) diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c index 706f43523935..cf9ae4099f82 100644 --- a/arch/riscv/mm/init.c +++ b/arch/riscv/mm/init.c @@ -1360,6 +1360,12 @@ int __meminit vmemmap_populate(unsigned long start, = unsigned long end, int node, */ return vmemmap_populate_hugepages(start, end, node, altmap); } + +void __meminit vmemmap_populate_finalize(void) +{ + /* Avoid faults on cached non-present TLB entries. */ + mark_new_valid_map(); +} #endif =20 #if defined(CONFIG_MMU) && defined(CONFIG_64BIT) diff --git a/include/linux/mm.h b/include/linux/mm.h index 0b776907152e..65deccbd7e31 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -4882,6 +4882,7 @@ int vmemmap_populate_hugepages(unsigned long start, u= nsigned long end, int node, struct vmem_altmap *altmap); int vmemmap_populate(unsigned long start, unsigned long end, int node, struct vmem_altmap *altmap); +void vmemmap_populate_finalize(void); int vmemmap_populate_hvo(unsigned long start, unsigned long end, unsigned int order, struct zone *zone, unsigned long headsize); diff --git a/mm/sparse-vmemmap.c b/mm/sparse-vmemmap.c index 6eadb9d116e4..2b860d2b1703 100644 --- a/mm/sparse-vmemmap.c +++ b/mm/sparse-vmemmap.c @@ -544,6 +544,10 @@ static int __meminit vmemmap_populate_compound_pages(u= nsigned long start_pfn, =20 #endif =20 +void __weak __meminit vmemmap_populate_finalize(void) +{ +} + struct page * __meminit __populate_section_memmap(unsigned long pfn, unsigned long nr_pages, int nid, struct vmem_altmap *altmap, struct dev_pagemap *pgmap) @@ -561,6 +565,8 @@ struct page * __meminit __populate_section_memmap(unsig= ned long pfn, else r =3D vmemmap_populate(start, end, nid, altmap); =20 + vmemmap_populate_finalize(); + if (r < 0) return NULL; =20 --- base-commit: 254f49634ee16a731174d2ae34bc50bd5f45e731 change-id: 20260525-mark-after-vmemmap-populate-68bd790839c9 prerequisite-message-id: <20260303-handle-kfence-protect-spurious-fault-v2-= 0-f80d8354d79d@iscas.ac.cn> prerequisite-patch-id: fdc42f2647e21d111f44a6532887a6705cd470a9 prerequisite-patch-id: 096fa339c84c36643ae4311fd8362dc63e23d950 prerequisite-patch-id: 305c876a5f4a23a840a8142aea79b796ed297545 prerequisite-patch-id: d78cb55d6a616b1170f06a401c8fd44acd11e5d5 prerequisite-patch-id: b02b4a76e94f3e2821291d4c23b46f6e5ecf5203 Best regards, -- =20 Vivian Wang