From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pj1-f42.google.com (mail-pj1-f42.google.com [209.85.216.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6D8DA43B3CC for ; Sat, 10 Oct 2026 11:26:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.42 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791631568; cv=none; b=TBhol7o6K38iW6rkG9bkeYqZvQDucObWft9mR8AVC7lpWWuZVhNZ7nqt8a0pwUX7Fi/5VGhn0zg6I6i3jjwaMXBy0RNXiAV9sfAiym0HuE54Wrm4q1SKKtUIOmR0/ApjYX5jmYFzIcJ01OvKdYNa1gIdFFJTcRRo5k72HMEECSE= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791631568; c=relaxed/simple; bh=nWybq7yQxC8+/T552eckpJODLWJQdYPcXh43xqRBaU0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=bwI1GpUipZ+vKXFelJYZmc9lHenAmkOipz0oOVyfvdBO+hcw+7fNX/dQRYozHHzehv9GaJ92acnvUb5hfS//f+/oP0dtXMgIreEdyJABzdhHn1nTmMk3OhusPLmqmt5h33J6haAYWiqZMv/3Km9YMKfB2BAQ3r0dLKNOkteBFdc= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=bytedance.com; spf=pass smtp.mailfrom=bytedance.com; dkim=pass (2048-bit key) header.d=bytedance.com header.i=@bytedance.com header.b=Fe2slg+s; arc=none smtp.client-ip=209.85.216.42 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=bytedance.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bytedance.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bytedance.com header.i=@bytedance.com header.b="Fe2slg+s" Received: by mail-pj1-f42.google.com with SMTP id 98e67ed59e1d1-3ab450c0873so517881a91.3 for ; Sat, 10 Oct 2026 04:26:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bytedance.com; s=google; t=1791631567; x=1792236367; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=cPrbN6fNnAjfl8a6kAKqWueJEJ1qRXmGBrgomj1Gs8U=; b=Fe2slg+snRFvEJcb9Gtuz/v+bbxljiJ1KcA9kD09yO4j8TW0X5M41lmVGTDukEGr2F urGM6UWnKjHRE5wyrURxIu5tYNHuPsLJ7/SJblWb1Ij2fx64K0wQpoQbSvIBQ84nMcaw 71OPOf4RaqrPdA3YW3unPGCDpUalAEfOZpHqu6UgLd+VQt6zm5GrV/tdILqQQiJnNYM9 1KeXwyc5RgL/Y94XSeLsPp5LMkr2IXhJsJYpq0S8XHa8hAr2wm2Tl1Jy5+OttvL+vIw1 1tUPfaWYjJdJ9zGyY+9Mpbo6FOkNW6K3nVc9YZgJTiuEZJtJ0J1soMWEyyH3kwr0uhu4 DyRg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1791631567; x=1792236367; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=cPrbN6fNnAjfl8a6kAKqWueJEJ1qRXmGBrgomj1Gs8U=; b=JnWJqipF4WF8KoY6NrTyIAm76dYwXU68GKuvDd3aLdlUM8dYw1RxxqfRqsT/W0ArYa j0/lDrvY+8lksIjmPw1MMVgOGg+fWOXHv5maqYXZGr3gOFf9l1KowL4fb4mIlPa/YBZM f7loYFD6Ngp1VsN2B8FtLp0xnDGT6d1pekMUzeEb7Xh6ekAmPFHZvlGSLJfya7Diahsj X9jGVMmAlSux0UvjhIkceMIJflyPu8n/g+osjEhHzMbE8RT18moQNzA3XljLTB7sDeqH 89gc/i83y0lhG42CkbdskFPzV9J6TRHu1XMw7bj01O0O6XhqrPDRhUcTyLwcXGMlvBNN sMmw== X-Forwarded-Encrypted: i=1; AKwUvBzkpFNzbeIWitV6dl1J/mbJLzVJ+AV1yY9xIX71RL7rutuRHJCmWjRp0TjlZ2Kg5K+4mJCy/ARH2m9+UVg=@vger.kernel.org X-Gm-Message-State: AFq9FYJ9tbdY/MHj6padHF2FxeLzrZJ083MVi2jY/A/15BU7vMGAUIvY HzCKnrV/6SIODkiYB1KKeL2fpXAHm3HHKLxnCMPLK9UKU+6dSnFcYehZYNYGViMcB3Q= X-Gm-Gg: AYBFou1CHkSoVIOPLsrgz0hqshu6JntkXnp27Ozsy65Pj2m6U4fi+P8IrV5iiTeX0yq hrMRCeox4+3PQIKv0U4q2IGrtYUAFseyExjJNW9JP0SExhe2rp9hCUt3cGL9CQoBiOaMtSX6jao F8GFgw607hN10zInoSjRdbRy08pNFez4xgiJiRNxmXnaxdShNS9sm2Go9mT9lelwTuqksqoj1WX KL373tSK2J5W2HLxrlajCqzitRLzjIu7pvpNyBv78lxQiCF0H8tJfPIbk6QHMyb27Evtv/hAZMQ KKuj4XN6CObi9oA28GIk6/Hr4cpJVZzLwwLpJYhy+o/3Xx3U3tMsa4aVMUhTdq5Qc4M/P0ND7Ww tVx9E9aBQYr2pDN81SFw5NUYrXc9c8mckKHWJy1jFHlDIDVj09KFBZUFSyd1NtK8ngcHdwcGD+8 2pc2jntpDMWzO75ZjesgvCGCPkLCsIsjEmNMCv0ebu+1F6zlZUrLOqKCaH3npOuiE/UO6mNHFdE sByT4HeWLoHyDYYcTUZmz+EzwOnAblF3056iA== X-Received: by 2002:a17:90b:384a:b0:3a8:c0cd:57f7 with SMTP id 98e67ed59e1d1-3ab3a735f76mr3813182a91.23.1791631566480; Sat, 10 Oct 2026 04:26:06 -0700 (PDT) Received: from G6L4RL2QG9.bytedance.net ([139.177.225.249]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3ab3690474esm7900233a91.0.2026.10.10.04.25.57 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sat, 10 Oct 2026 04:26:05 -0700 (PDT) From: Muchun Song To: Andrew Morton Cc: David Hildenbrand , Oscar Salvador , Dave Hansen , Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti , =?UTF-8?q?Bj=C3=B6rn=20T=C3=B6pel?= , Catalin Marinas , Will Deacon , Mark Rutland , Kevin Brodsky , Alexander Gordeev , Alistair Popple , linux-mm@kvack.org, linux-riscv@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org, Muchun Song , Muchun Song Subject: [PATCH v2 2/4] riscv/mm: fix hotplug page-table destructor handling Date: Sat, 10 Oct 2026 19:24:55 +0800 Message-ID: <20261010112457.49485-3-songmuchun@bytedance.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20261010112457.49485-1-songmuchun@bytedance.com> References: <20261010112457.49485-1-songmuchun@bytedance.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit RISC-V uses the same memory-hotplug teardown code for linear-map and vmemmap page tables. Late linear-map allocations run page-table constructors, while vmemmap and early allocations may not. free_pte_table() unconditionally calls pagetable_dtor(), corrupting NR_PAGETABLE accounting for constructor-free tables. free_pmd_table() avoids that for vmemmap using is_vmemmap, but mapping type is not a reliable proxy for constructor state. In particular, it becomes invalid once runtime vmemmap tables use the normal pgalloc helpers. Introduce free_pgtable_page() to select free_reserved_page() for reserved pages and pagetable_free() otherwise. The latter runs the destructor only when PageTable() is set, handling both constructor-backed and constructor-free tables. Fixes: c75a74f4ba19 ("riscv: mm: Add memory hotplugging support") Cc: stable@vger.kernel.org Assisted-by: LLM Signed-off-by: Muchun Song --- v2: - Use pagetable_free() for non-reserved tables (suggested by David Hildenbrand) - Simplify reserved-page handling --- arch/riscv/mm/init.c | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c index 857f9a55039c..151eb197cb09 100644 --- a/arch/riscv/mm/init.c +++ b/arch/riscv/mm/init.c @@ -1486,10 +1486,17 @@ struct execmem_info __init *execmem_arch_setup(void) #endif /* CONFIG_EXECMEM */ #ifdef CONFIG_MEMORY_HOTPLUG +static void __meminit free_pgtable_page(struct page *page) +{ + if (PageReserved(page)) + free_reserved_page(page); + else + pagetable_free(page_ptdesc(page)); +} + static void __meminit free_pte_table(pte_t *pte_start, pmd_t *pmd) { struct page *page = pmd_page(*pmd); - struct ptdesc *ptdesc = page_ptdesc(page); pte_t *pte; int i; @@ -1499,18 +1506,13 @@ static void __meminit free_pte_table(pte_t *pte_start, pmd_t *pmd) return; } - pagetable_dtor(ptdesc); - if (PageReserved(page)) - free_reserved_page(page); - else - pagetable_free(ptdesc); + free_pgtable_page(page); pmd_clear(pmd); } -static void __meminit free_pmd_table(pmd_t *pmd_start, pud_t *pud, bool is_vmemmap) +static void __meminit free_pmd_table(pmd_t *pmd_start, pud_t *pud) { struct page *page = pud_page(*pud); - struct ptdesc *ptdesc = page_ptdesc(page); pmd_t *pmd; int i; @@ -1520,12 +1522,7 @@ static void __meminit free_pmd_table(pmd_t *pmd_start, pud_t *pud, bool is_vmemm return; } - if (!is_vmemmap) - pagetable_dtor(ptdesc); - if (PageReserved(page)) - free_reserved_page(page); - else - pagetable_free(ptdesc); + free_pgtable_page(page); pud_clear(pud); } @@ -1645,7 +1642,7 @@ static void __meminit remove_pud_mapping(pud_t *pud_base, unsigned long addr, un remove_pmd_mapping(pmd_base, addr, next, is_vmemmap, altmap); if (pgtable_l4_enabled) - free_pmd_table(pmd_base, pudp, is_vmemmap); + free_pmd_table(pmd_base, pudp); } } -- 2.54.0