From nobody Wed Jun 17 05:14:12 2026 Received: from mail-pl1-f178.google.com (mail-pl1-f178.google.com [209.85.214.178]) (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 808963009EE for ; Fri, 24 Apr 2026 02:56:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.178 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776999367; cv=none; b=EzdmRU8Ttr9sNNrxfTLf3kdJ+wsX0s4Pc1eub7tcx1HZOQW9GwJTB+vsvBrbW7lc0YbLafnAzs/PAE/wDXI99gZj/8bMrOhAJsQxsjWW2hvyi+tyV63NiRCAO6sjcX8CqNozau/QU9K5kNn22WFtXcUfgwdne8H4Ut5vaEOO00Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776999367; c=relaxed/simple; bh=0PLb5zFObm442FFPCMDt2iC8dud5KQqM0ijr0fGCJws=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=b6SNEVnutsPtXtnXCwnAR85F1VNzzsw1VdDy4+apQ6NTp3Uuw+0SPKZtt7t9CY8uE88L7qkdH/4vVVWgl9xHYScfJXgnu5vpTs9MftNgQBE16DUcUEPZdul+E/NV9X55uTl63EyusmnRnEsFxDBRkUPRbcwIh9dqXtUEUNA65pw= 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=ZUrANlLM; arc=none smtp.client-ip=209.85.214.178 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="ZUrANlLM" Received: by mail-pl1-f178.google.com with SMTP id d9443c01a7336-2b4583f0a1aso46454945ad.3 for ; Thu, 23 Apr 2026 19:56:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bytedance.com; s=google; t=1776999361; x=1777604161; 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; bh=Odp+99JHCbpwHHM6ds3EE8rv22wzvZDnJ+uzSMS+VHA=; b=ZUrANlLMBT/AyRnVQ48+VdkEbwpMv/2u4poJ+38nBrbesIY81ENYJXinPXy2OLgL30 PIgJSAFeJnKAUsTxB/LZj5uwHdM2Q9BR0/vPhXCLGZUWFSJ6STw5dAhqkscwjdHm6IrY I7FfaqSfkESuJQsXEiewzQT+VPgpYTO8Wz6shajYfw/BqKHLloG3lyTs8+deS5S67ddZ M0Yj1Fpy4w02CuBx1IisanUt7LLEDMhVDgOgDuCQulQtmKnflIYN0YBmBB9ao2bDQ5yg jaIOXbloVdi7wE177wMBJA5PgsSu45uch9HSn0xBAaZsIIn3xptoNvsT4fHshq7qXIsV DaUA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776999361; x=1777604161; 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; bh=Odp+99JHCbpwHHM6ds3EE8rv22wzvZDnJ+uzSMS+VHA=; b=QOqny7GNTy+CwAgqhIxmDkMRvdibZJqvc7yVSBWao0F5OEZ6dXevCNIGEjaltd6dc+ YlhrSmAEnkdnZmFSpxsbBTmLFhHYz3Q37Y7Vy1H5Nb/bw9AM0M7jCusleQQOLn30jGtK 66+gI60cQQV8OvnSZfpXnaxfv34KJTmmZNKuhv7YHtfC1ap6ZO8X6O6FK9jI1MX9zrJ5 iqYaquET8dpV5EBObqbJC/xT/Qtstor9qmDu9eTUvuduqGu6erzclxNetyHarvqn+mRs ug7bg1/uUtdo8STogbGc33kcVC3bXrI2QYkZYfA4lr3KHiG8Rze43su7HPi2PfxHRJYe xqYQ== X-Forwarded-Encrypted: i=1; AFNElJ95SF08YEhKkJzgI/rjS6tzQalapuiyb6dIM9k6h5Yb4iVeYuw05DgwP6i13oTBy1SwGm1S0azfmyHmqeA=@vger.kernel.org X-Gm-Message-State: AOJu0Yybs9/KheZ8ld7fkGUEbzOw5Swvsyu/t/18Hf8aXSdT5qVKIGIS i5MJMljNrew756UpIwicjH2WEfgdq5hRpzjN7vf5K/TFySsEGimw4RfOggWvU7XU2F4= X-Gm-Gg: AeBDiesC0zc83D8q9SOp3y3DqZGgxyp5t5TI6DcOUtZJS7mHReX9SMRm73nIgbFk1Ct BBPFd4eQduhLmkoHzYrfVGmZrGjPtahJb+en9+Ox5/sgA6PkNQA/2rMbzAtA9h6Suuh38dkietZ U7be+5GMe6M3kwzX1cIuAveKNtcNlXOOmWVud7U26dI+kqlwAUspbjRux8lVvm01d/ZaO3izSI9 59AbLV9iGxU2cipYxfyx6XuCQAjyNR9dy5nWYVnwsVTb7gk5WPZoaIzTXZ78okHU5+6733WvQDM nGfYGRVWKzvBQj6rMMmrrAKDcbAg8288MXXf0wMz43y0L/rbv6f/slgSYmg+acDKECTIwwUs9sl RVhRMHyJuhg++BpLqagmRZGZammBcfb1ICfc6DVc1hxTJQwqeYT5kf2HMQgO6bpkZhx0rnY/xU4 Ys6/DWi3zCoV/0VNDbOCjlMbzYXvDi26c6SxA9oXG3veCd1TKyIJMC4eY= X-Received: by 2002:a17:903:1b03:b0:2ae:ac0c:5a2a with SMTP id d9443c01a7336-2b5f9e7a9a0mr309495685ad.6.1776999361448; Thu, 23 Apr 2026 19:56:01 -0700 (PDT) Received: from n232-176-004.byted.org ([36.110.163.102]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b5fab20d33sm221668325ad.63.2026.04.23.19.55.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 23 Apr 2026 19:56:01 -0700 (PDT) From: Muchun Song To: Andrew Morton , David Hildenbrand , Muchun Song , Oscar Salvador , Michael Ellerman , Madhavan Srinivasan Cc: Lorenzo Stoakes , "Liam R . Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Nicholas Piggin , Christophe Leroy , aneesh.kumar@linux.ibm.com, joao.m.martins@oracle.com, linux-mm@kvack.org, linuxppc-dev@lists.ozlabs.org, linux-kernel@vger.kernel.org, Muchun Song , stable@vger.kernel.org Subject: [PATCH v6 1/7] mm/sparse-vmemmap: Fix vmemmap accounting underflow Date: Fri, 24 Apr 2026 10:55:41 +0800 Message-Id: <20260424025547.3806072-2-songmuchun@bytedance.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20260424025547.3806072-1-songmuchun@bytedance.com> References: <20260424025547.3806072-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: quoted-printable Content-Type: text/plain; charset="utf-8" In section_activate(), if populate_section_memmap() fails, the error handling path calls section_deactivate() to roll back the state. This causes a vmemmap accounting imbalance. Since commit c3576889d87b ("mm: fix accounting of memmap pages"), memmap pages are accounted for only after populate_section_memmap() succeeds. However, the failure path unconditionally calls section_deactivate(), which decreases the vmemmap count. Consequently, a failure in populate_section_memmap() leads to an accounting underflow, incorrectly reducing the system's tracked vmemmap usage. Fix this more thoroughly by moving all accounting calls into the lower level functions that actually perform the vmemmap allocation and freeing: - populate_section_memmap() accounts for newly allocated vmemmap pages - depopulate_section_memmap() unaccounts when vmemmap is freed This ensures proper accounting in all code paths, including error handling and early section cases. Fixes: c3576889d87b ("mm: fix accounting of memmap pages") Cc: stable@vger.kernel.org Signed-off-by: Muchun Song Acked-by: Mike Rapoport (Microsoft) Acked-by: Oscar Salvador Acked-by: David Hildenbrand (Arm) --- mm/sparse-vmemmap.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/mm/sparse-vmemmap.c b/mm/sparse-vmemmap.c index 6eadb9d116e4..a7b11248b989 100644 --- a/mm/sparse-vmemmap.c +++ b/mm/sparse-vmemmap.c @@ -656,7 +656,12 @@ static struct page * __meminit populate_section_memmap= (unsigned long pfn, unsigned long nr_pages, int nid, struct vmem_altmap *altmap, struct dev_pagemap *pgmap) { - return __populate_section_memmap(pfn, nr_pages, nid, altmap, pgmap); + struct page *page =3D __populate_section_memmap(pfn, nr_pages, nid, altma= p, + pgmap); + + memmap_pages_add(DIV_ROUND_UP(nr_pages * sizeof(struct page), PAGE_SIZE)); + + return page; } =20 static void depopulate_section_memmap(unsigned long pfn, unsigned long nr_= pages, @@ -665,13 +670,17 @@ static void depopulate_section_memmap(unsigned long p= fn, unsigned long nr_pages, unsigned long start =3D (unsigned long) pfn_to_page(pfn); unsigned long end =3D start + nr_pages * sizeof(struct page); =20 + memmap_pages_add(-1L * (DIV_ROUND_UP(nr_pages * sizeof(struct page), PAGE= _SIZE))); vmemmap_free(start, end, altmap); } + static void free_map_bootmem(struct page *memmap) { unsigned long start =3D (unsigned long)memmap; unsigned long end =3D (unsigned long)(memmap + PAGES_PER_SECTION); =20 + memmap_boot_pages_add(-1L * (DIV_ROUND_UP(PAGES_PER_SECTION * sizeof(stru= ct page), + PAGE_SIZE))); vmemmap_free(start, end, NULL); } =20 @@ -774,14 +783,10 @@ static void section_deactivate(unsigned long pfn, uns= igned long nr_pages, * The memmap of early sections is always fully populated. See * section_activate() and pfn_valid() . */ - if (!section_is_early) { - memmap_pages_add(-1L * (DIV_ROUND_UP(nr_pages * sizeof(struct page), PAG= E_SIZE))); + if (!section_is_early) depopulate_section_memmap(pfn, nr_pages, altmap); - } else if (memmap) { - memmap_boot_pages_add(-1L * (DIV_ROUND_UP(nr_pages * sizeof(struct page), - PAGE_SIZE))); + else if (memmap) free_map_bootmem(memmap); - } =20 if (empty) ms->section_mem_map =3D (unsigned long)NULL; @@ -826,7 +831,6 @@ static struct page * __meminit section_activate(int nid= , unsigned long pfn, section_deactivate(pfn, nr_pages, altmap); return ERR_PTR(-ENOMEM); } - memmap_pages_add(DIV_ROUND_UP(nr_pages * sizeof(struct page), PAGE_SIZE)); =20 return memmap; } --=20 2.20.1 From nobody Wed Jun 17 05:14:12 2026 Received: from mail-pl1-f175.google.com (mail-pl1-f175.google.com [209.85.214.175]) (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 D0ADE30E82D for ; Fri, 24 Apr 2026 02:56:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776999373; cv=none; b=MDBlgV6TvsRu6SI4Ws5/Oq8gBzygQmzb4J54JXYBBC1GaWOgklN7rH6672q3Jo+xWmvMblJQL7NJ21lZSvGcE3vzGtyVzXCBLC/WNM0+l3fADnppnO11vongstI8DO03dfi4lbisYGT6ZqfniIXsT4XGzYD4/knb/npfL8Vjv8A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776999373; c=relaxed/simple; bh=9/CO8vx+V21oREl0OLJTEhDPgpJAF4/FGvx8E6oUzqk=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=FI+PxQG57ynor2k5J/vOKZLTlqSbqFXA8qCK1KLypnAJ2PeXLjQ4eTnMtwElIr/7ql6xsYmzs3LlAYEugJqqIjmHF6s4oqQ2eTvKS/LXMgqECpLCVF3zXG27soqdFY2nSWTLxBv00cHhEXY3AXUi9IZu3+1QvQQSSveONk4jwsQ= 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=YajlZVeG; arc=none smtp.client-ip=209.85.214.175 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="YajlZVeG" Received: by mail-pl1-f175.google.com with SMTP id d9443c01a7336-2aaf59c4f7cso34587045ad.1 for ; Thu, 23 Apr 2026 19:56:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bytedance.com; s=google; t=1776999367; x=1777604167; 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; bh=A4lJZQuHOoBwkCuOEzBR659IeprHDGyqMQmHH4+zCQA=; b=YajlZVeGPbLCqOu7hK93QpTyZSoew7cPPZGJfWl7a64Xb574NRIPwRSnStqUaju0Dd 0jsz7wlhHYY5NP4kO9SjHW0TcXJgNZ+UVzKLwI/eGC5C+MECd5CaBXZHkZwDR7R4tqt0 0ybRCavX/4k7Nu3NKGzy2YjqU0GfB2Hd7r5YG3gRGaCvO826MHyTa4NtmphhQaQZFiJU ElfcDRNsoPVt3bIERTF8CEzqNEFMxUIEWfr/Fh/syNz3nJpTNBNwDInFv/yP2x72l5+a XZe2eiEuk2M6wa22c8boqtumYs0pJPyeJXjcjx660PPNvXulAREtHQsC1DRdh5M1/aIU L4oQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776999367; x=1777604167; 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; bh=A4lJZQuHOoBwkCuOEzBR659IeprHDGyqMQmHH4+zCQA=; b=eYPBik26lC72LowViCi5skHkSCweKmNJXpdZRPP6C4BLQhdYQrrNy3YqgPOn21+517 3fPqA1COLYto79xV3xvDVQjOcyRGJMtok8tTjBnxfoos+8iAZFGq16v7hUb9U1OclVcJ Tcb664UqzaVE8y3oMxkUZZ+ZhPpMJQXz95OJYgpPa7tQR384OyelmcNMKrjNLzASaFxK /cHqSfCDkbqeDC+thwzyRFj5KxxhYBaAfFc4aE8oZjwoH8PnOIbLHaurwdli3gottOXx ADHavpUuI4JmQVS/oxRHNSQ552RtZ6xIJACz0OGNplYADjPpmqfWPGx4O8u/udK+QF6G CMFw== X-Forwarded-Encrypted: i=1; AFNElJ+1NTSZOjZe0LTQRYPqMEgP4kLzjVug6H4BFzlD7bOcFLcohy/mJ3Yd0nFwT7+/4NNWIJxWNHdXf7tR5OQ=@vger.kernel.org X-Gm-Message-State: AOJu0Yw5KlfTULJBMx4YUfQRkud1dw9ARfnKk/X27mUP+8xNVNI+sLxh WXfp6wK+TNkuOKG4rQYBHbxnbiGBEh5QmLqatdfaFjUwD2lD9BXWjyw40PyqMlg/y0Q= X-Gm-Gg: AeBDiesL3o2Rda2iC+ZmqBX2/Ve2FX04haP0Wz0n3a3/WN7f6ziC0hOGe8XOmwSEIo5 QsBgf/MOeCJkIbQE4F9vQH9yhHRcLoIzuy6W4y3AafRa+kP0Y5y7JszqfSZShRVSYBigmVEFGvm 9p5SbR9J22woHmDgo2O8SdiitQtcmq/qoMMNNUEYSIJQZfDFLvH2zTsnsvyZnbDBpxxWQKRy7rG iE90uSU5GkSoiWfNKfox5cRMedz6zMA2jeCOhrAMJovTrUxIV08pqbiqW4N8cWbPHjh6n2lkvR6 LPYWCkXtuyqjJF1/LS0hIF8ijN3pcle8TQugn3vZwwjQDOCWGXbF7sIsm3ChD4G7M9hMlXl0CnF mX7aowz7gaABaiuOuEEGDf/Q/VzIv45ADrF5/Zs7PukvBDFRhIl2gLEIkl9VHW5hYOp7H0zeCOx ZXfuOb5rXWeQLrzQ9qVNJJ2jqd8jf4jSk+7GRYzxyrrSx1LDq0WtOUknA= X-Received: by 2002:a17:903:2412:b0:2b2:42f8:1a4b with SMTP id d9443c01a7336-2b5f9f3a987mr327922445ad.27.1776999366531; Thu, 23 Apr 2026 19:56:06 -0700 (PDT) Received: from n232-176-004.byted.org ([36.110.163.102]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b5fab20d33sm221668325ad.63.2026.04.23.19.56.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 23 Apr 2026 19:56:06 -0700 (PDT) From: Muchun Song To: Andrew Morton , David Hildenbrand , Muchun Song , Oscar Salvador , Michael Ellerman , Madhavan Srinivasan Cc: Lorenzo Stoakes , "Liam R . Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Nicholas Piggin , Christophe Leroy , aneesh.kumar@linux.ibm.com, joao.m.martins@oracle.com, linux-mm@kvack.org, linuxppc-dev@lists.ozlabs.org, linux-kernel@vger.kernel.org, Muchun Song , stable@vger.kernel.org Subject: [PATCH v6 2/7] mm/memory_hotplug: Fix incorrect altmap passing in error path Date: Fri, 24 Apr 2026 10:55:42 +0800 Message-Id: <20260424025547.3806072-3-songmuchun@bytedance.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20260424025547.3806072-1-songmuchun@bytedance.com> References: <20260424025547.3806072-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: quoted-printable Content-Type: text/plain; charset="utf-8" In create_altmaps_and_memory_blocks(), when arch_add_memory() succeeds with memmap_on_memory enabled, the vmemmap pages are allocated from params.altmap. If create_memory_block_devices() subsequently fails, the error path calls arch_remove_memory() with a NULL altmap instead of params.altmap. This is a bug that could lead to memory corruption. Since altmap is NULL, vmemmap_free() falls back to freeing the vmemmap pages into the system buddy allocator via free_pages() instead of the altmap. arch_remove_memory() then immediately destroys the physical linear mapping for this memory. This injects unowned pages into the buddy allocator, causing machine checks or memory corruption if the system later attempts to allocate and use those freed pages. Fix this by passing params.altmap to arch_remove_memory() in the error path. Fixes: 6b8f0798b85a ("mm/memory_hotplug: split memmap_on_memory requests ac= ross memblocks") Cc: stable@vger.kernel.org Signed-off-by: Muchun Song Acked-by: David Hildenbrand (Arm) --- mm/memory_hotplug.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c index 2a943ec57c85..0bad2aed2bde 100644 --- a/mm/memory_hotplug.c +++ b/mm/memory_hotplug.c @@ -1468,7 +1468,7 @@ static int create_altmaps_and_memory_blocks(int nid, = struct memory_group *group, ret =3D create_memory_block_devices(cur_start, memblock_size, nid, params.altmap, group); if (ret) { - arch_remove_memory(cur_start, memblock_size, NULL); + arch_remove_memory(cur_start, memblock_size, params.altmap); kfree(params.altmap); goto out; } --=20 2.20.1 From nobody Wed Jun 17 05:14:12 2026 Received: from mail-pl1-f173.google.com (mail-pl1-f173.google.com [209.85.214.173]) (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 37D9B309EE6 for ; Fri, 24 Apr 2026 02:56:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776999384; cv=none; b=OWtu6GOJ7NIrBw19kWr5BVbS7zS9qZ+TR/QBSQCBayTDD2RuWRf+xjzBgYGEuTmblMT2Al2BrOo229ZO4UGOBBEMuKaHXBD63eOQwi9IAvXEWrFl/9VgtuuVC48G7BIqPkwmdC4oEqoWiqZfbLdyWMcprEYsAWpjmgGtyGrq3lE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776999384; c=relaxed/simple; bh=sDA9tg5KnuPIw4R0NQAaAviIVzNYRfvOuY4bGkMoGbk=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=IVXuy0JfeXvQKBHvxCH/ESIGHoyUK3hhyiSxpxbGecsxyErgOl9vSosa6DU9vJEE/+AkSGo80rxUkiV7nnJ1ZCJRsGjIytXVP22r1cqbADwWWgoS3Fy0XBuxewVRd8zJi0FSlToY7oN4ENcbzSXBtLoG+FPj3SpdlRWhI9FUGeQ= 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=PYMyJ0rC; arc=none smtp.client-ip=209.85.214.173 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="PYMyJ0rC" Received: by mail-pl1-f173.google.com with SMTP id d9443c01a7336-2a8fba3f769so33145345ad.2 for ; Thu, 23 Apr 2026 19:56:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bytedance.com; s=google; t=1776999372; x=1777604172; 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; bh=4tVvEy0n8Q8boUwkyPz7NIWKrGY6MN5PZ12u/TRimec=; b=PYMyJ0rCfrc21a+naQHP+1SPxAiendvOFEWfmKktj+BWo3zbbibO6ATc5ZK9wJJxJx kqNvqzCVv+gRo3q1kBI6nRR7OMXeOJwDLIr35lUQV2oPGrgYJpUj3d5SUylRzdCWYaXV urQHeN068mRUljaphYTen47057I46Eg2lMisyNaEtbup4r0rkpUk22Jtr8haF2IPAHUC iGXecNN3Z4PIxlYgbvW3t28vcTpHkUv+ntCRddeGMnnIHzQrF7JKbRd6V+PgD0tSEXaM PxbhMRelu2h3UHr3GI4mvrY5RFR9UPD9Wu2JwNpl1kU3hMOWTVJgFd7kMcaRYw7i1IIb ND6w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776999372; x=1777604172; 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; bh=4tVvEy0n8Q8boUwkyPz7NIWKrGY6MN5PZ12u/TRimec=; b=DPyzmpmdlu+CD8v4TXj8EK+ncastsp63VwqAoVPYCpIFbPaU5YVu7YJjZWA+aGABmk wvX2E1ePjPVy2pr90ZeNZ84gK2LSK//a9El15/i1IPn1WakncxFmtPFVfv7hGseAU8tT hAugZXxK2ShIoqOltQPIE1VMuu2hBllFRW+CtnjQeymZLLYU84vt14QbXCkWCQzzMf0o Uy6EIHMS0ezVRB3ARiolAyv51TyuOMV3HYRREYyYIIj/F5CPq4tvF3O1ZgmUcPZdhFWz UUktPhIdpBApWHhcDQObnMGKJbbDh9aeqv440vmvehR6tUwdpd4OrlWRiZuk8c3rx296 Kh1w== X-Forwarded-Encrypted: i=1; AFNElJ/Wzl3jCUaEw3UCxStghKe25FXWns5XSx3uYXvarB/NtS+MO9vAbem3Uy1s+NWVCyKbbS/C3CzE467jIFE=@vger.kernel.org X-Gm-Message-State: AOJu0YzJCzrhV57/Bxnn07Nx+4Io9wo/GTnacKCaN0frKnNgtFcRi+fz jtZ6Z5Ydf6EprLFxsebsT+tRiqUFN92EPslKaJb8Uf/wkT7IPw0oWAbdu1vcEZzzdG8= X-Gm-Gg: AeBDievL5qnNIQ4sXadfW8x1EcH/eGWSX0U5YCEdKj2DPNg06oxwyq3Ih6VSMyPq3nH mVu9l58iyFXQAbuYUQiv+bfht9m102bMQ0REIhh0CcOhDaoXrfEZZjPtNEsbSsnWY4OMDpgBap7 xUkee3pahdRZ6d/bCZ8au14mpE125EHLnks30msM7fuskcVjgSNQO1EjE+zRMfLvMDqXrTnyHYp Io5lzQYZLhzNkjx7ByJVOfUtH5laRn/bZhMDIwjt7D/Nd0Uxa2sjGB5I38lAbp2wqGxYTtu+mG4 CF4sKpr/J6IWHHKI0QLHi6QHEO2xSM9ojS7m0/qwGy/jkw/SmRaR/iL+tAbLvrFqmJAHhjjNT2f Zrko4P2ptN2PHUBp6pFTw81XhxPw/ZThfpPYP/NULMpLYtuz7vRjNBDW7SNrN9DuFBpBjHaRubo B6N+YsHrW5TN2lHbTYpg6aVs5FWA/7Uu4lCVftYsLAEsWY95FtuH/vbRA= X-Received: by 2002:a17:902:f645:b0:2ae:5163:c2aa with SMTP id d9443c01a7336-2b5f9f519e5mr295526205ad.20.1776999371428; Thu, 23 Apr 2026 19:56:11 -0700 (PDT) Received: from n232-176-004.byted.org ([36.110.163.102]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b5fab20d33sm221668325ad.63.2026.04.23.19.56.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 23 Apr 2026 19:56:11 -0700 (PDT) From: Muchun Song To: Andrew Morton , David Hildenbrand , Muchun Song , Oscar Salvador , Michael Ellerman , Madhavan Srinivasan Cc: Lorenzo Stoakes , "Liam R . Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Nicholas Piggin , Christophe Leroy , aneesh.kumar@linux.ibm.com, joao.m.martins@oracle.com, linux-mm@kvack.org, linuxppc-dev@lists.ozlabs.org, linux-kernel@vger.kernel.org, Muchun Song Subject: [PATCH v6 3/7] mm/sparse-vmemmap: Pass @pgmap argument to memory deactivation paths Date: Fri, 24 Apr 2026 10:55:43 +0800 Message-Id: <20260424025547.3806072-4-songmuchun@bytedance.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20260424025547.3806072-1-songmuchun@bytedance.com> References: <20260424025547.3806072-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: quoted-printable Content-Type: text/plain; charset="utf-8" Currently, the memory hot-remove call chain -- arch_remove_memory(), __remove_pages(), sparse_remove_section() and section_deactivate() -- does not carry the struct dev_pagemap pointer. This prevents the lower levels from knowing whether the section was originally populated with vmemmap optimizations (e.g., DAX with vmemmap optimization enabled). Without this information, we cannot call vmemmap_can_optimize() to determine if the vmemmap pages were optimized. As a result, the vmemmap page accounting during teardown will mistakenly assume a non-optimized allocation, leading to incorrect memmap statistics. To lay the groundwork for fixing the vmemmap page accounting, we need to pass the @pgmap pointer down to the deactivation location. Plumb the @pgmap argument through the APIs of arch_remove_memory(), __remove_pages() and sparse_remove_section(), mirroring the corresponding *_activate() paths. Signed-off-by: Muchun Song Acked-by: Mike Rapoport (Microsoft) Reviewed-by: Oscar Salvador Acked-by: David Hildenbrand (Arm) --- arch/arm64/mm/mmu.c | 5 +++-- arch/loongarch/mm/init.c | 5 +++-- arch/powerpc/mm/mem.c | 5 +++-- arch/riscv/mm/init.c | 5 +++-- arch/s390/mm/init.c | 5 +++-- arch/x86/mm/init_64.c | 5 +++-- include/linux/memory_hotplug.h | 8 +++++--- mm/memory_hotplug.c | 13 +++++++------ mm/memremap.c | 4 ++-- mm/sparse-vmemmap.c | 12 ++++++------ 10 files changed, 38 insertions(+), 29 deletions(-) diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c index dd85e093ffdb..e5a42b7a0160 100644 --- a/arch/arm64/mm/mmu.c +++ b/arch/arm64/mm/mmu.c @@ -2024,12 +2024,13 @@ int arch_add_memory(int nid, u64 start, u64 size, return ret; } =20 -void arch_remove_memory(u64 start, u64 size, struct vmem_altmap *altmap) +void arch_remove_memory(u64 start, u64 size, struct vmem_altmap *altmap, + struct dev_pagemap *pgmap) { unsigned long start_pfn =3D start >> PAGE_SHIFT; unsigned long nr_pages =3D size >> PAGE_SHIFT; =20 - __remove_pages(start_pfn, nr_pages, altmap); + __remove_pages(start_pfn, nr_pages, altmap, pgmap); __remove_pgd_mapping(swapper_pg_dir, __phys_to_virt(start), size); } =20 diff --git a/arch/loongarch/mm/init.c b/arch/loongarch/mm/init.c index 00f3822b6e47..c9c57f08fa2c 100644 --- a/arch/loongarch/mm/init.c +++ b/arch/loongarch/mm/init.c @@ -86,7 +86,8 @@ int arch_add_memory(int nid, u64 start, u64 size, struct = mhp_params *params) return ret; } =20 -void arch_remove_memory(u64 start, u64 size, struct vmem_altmap *altmap) +void arch_remove_memory(u64 start, u64 size, struct vmem_altmap *altmap, + struct dev_pagemap *pgmap) { unsigned long start_pfn =3D start >> PAGE_SHIFT; unsigned long nr_pages =3D size >> PAGE_SHIFT; @@ -95,7 +96,7 @@ void arch_remove_memory(u64 start, u64 size, struct vmem_= altmap *altmap) /* With altmap the first mapped page is offset from @start */ if (altmap) page +=3D vmem_altmap_offset(altmap); - __remove_pages(start_pfn, nr_pages, altmap); + __remove_pages(start_pfn, nr_pages, altmap, pgmap); } #endif =20 diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c index 648d0c5602ec..4c1afab91996 100644 --- a/arch/powerpc/mm/mem.c +++ b/arch/powerpc/mm/mem.c @@ -158,12 +158,13 @@ int __ref arch_add_memory(int nid, u64 start, u64 siz= e, return rc; } =20 -void __ref arch_remove_memory(u64 start, u64 size, struct vmem_altmap *alt= map) +void __ref arch_remove_memory(u64 start, u64 size, struct vmem_altmap *alt= map, + struct dev_pagemap *pgmap) { unsigned long start_pfn =3D start >> PAGE_SHIFT; unsigned long nr_pages =3D size >> PAGE_SHIFT; =20 - __remove_pages(start_pfn, nr_pages, altmap); + __remove_pages(start_pfn, nr_pages, altmap, pgmap); arch_remove_linear_mapping(start, size); } #endif diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c index decd7df40fa4..b0092fb842a3 100644 --- a/arch/riscv/mm/init.c +++ b/arch/riscv/mm/init.c @@ -1717,9 +1717,10 @@ int __ref arch_add_memory(int nid, u64 start, u64 si= ze, struct mhp_params *param return ret; } =20 -void __ref arch_remove_memory(u64 start, u64 size, struct vmem_altmap *alt= map) +void __ref arch_remove_memory(u64 start, u64 size, struct vmem_altmap *alt= map, + struct dev_pagemap *pgmap) { - __remove_pages(start >> PAGE_SHIFT, size >> PAGE_SHIFT, altmap); + __remove_pages(start >> PAGE_SHIFT, size >> PAGE_SHIFT, altmap, pgmap); remove_linear_mapping(start, size); flush_tlb_all(); } diff --git a/arch/s390/mm/init.c b/arch/s390/mm/init.c index 1f72efc2a579..11a689423440 100644 --- a/arch/s390/mm/init.c +++ b/arch/s390/mm/init.c @@ -276,12 +276,13 @@ int arch_add_memory(int nid, u64 start, u64 size, return rc; } =20 -void arch_remove_memory(u64 start, u64 size, struct vmem_altmap *altmap) +void arch_remove_memory(u64 start, u64 size, struct vmem_altmap *altmap, + struct dev_pagemap *pgmap) { unsigned long start_pfn =3D start >> PAGE_SHIFT; unsigned long nr_pages =3D size >> PAGE_SHIFT; =20 - __remove_pages(start_pfn, nr_pages, altmap); + __remove_pages(start_pfn, nr_pages, altmap, pgmap); vmem_remove_mapping(start, size); } #endif /* CONFIG_MEMORY_HOTPLUG */ diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c index df2261fa4f98..77b889b71cf3 100644 --- a/arch/x86/mm/init_64.c +++ b/arch/x86/mm/init_64.c @@ -1288,12 +1288,13 @@ kernel_physical_mapping_remove(unsigned long start,= unsigned long end) remove_pagetable(start, end, true, NULL); } =20 -void __ref arch_remove_memory(u64 start, u64 size, struct vmem_altmap *alt= map) +void __ref arch_remove_memory(u64 start, u64 size, struct vmem_altmap *alt= map, + struct dev_pagemap *pgmap) { unsigned long start_pfn =3D start >> PAGE_SHIFT; unsigned long nr_pages =3D size >> PAGE_SHIFT; =20 - __remove_pages(start_pfn, nr_pages, altmap); + __remove_pages(start_pfn, nr_pages, altmap, pgmap); kernel_physical_mapping_remove(start, start + size); } #endif /* CONFIG_MEMORY_HOTPLUG */ diff --git a/include/linux/memory_hotplug.h b/include/linux/memory_hotplug.h index 815e908c4135..7c9d66729c60 100644 --- a/include/linux/memory_hotplug.h +++ b/include/linux/memory_hotplug.h @@ -135,9 +135,10 @@ static inline bool movable_node_is_enabled(void) return movable_node_enabled; } =20 -extern void arch_remove_memory(u64 start, u64 size, struct vmem_altmap *al= tmap); +extern void arch_remove_memory(u64 start, u64 size, struct vmem_altmap *al= tmap, + struct dev_pagemap *pgmap); extern void __remove_pages(unsigned long start_pfn, unsigned long nr_pages, - struct vmem_altmap *altmap); + struct vmem_altmap *altmap, struct dev_pagemap *pgmap); =20 /* reasonably generic interface to expand the physical pages */ extern int __add_pages(int nid, unsigned long start_pfn, unsigned long nr_= pages, @@ -307,7 +308,8 @@ extern int sparse_add_section(int nid, unsigned long pf= n, unsigned long nr_pages, struct vmem_altmap *altmap, struct dev_pagemap *pgmap); extern void sparse_remove_section(unsigned long pfn, unsigned long nr_page= s, - struct vmem_altmap *altmap); + struct vmem_altmap *altmap, + struct dev_pagemap *pgmap); extern struct zone *zone_for_pfn_range(enum mmop online_type, int nid, struct memory_group *group, unsigned long start_pfn, unsigned long nr_pages); diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c index 0bad2aed2bde..7bfdc3a99688 100644 --- a/mm/memory_hotplug.c +++ b/mm/memory_hotplug.c @@ -576,6 +576,7 @@ void remove_pfn_range_from_zone(struct zone *zone, * @pfn: starting pageframe (must be aligned to start of a section) * @nr_pages: number of pages to remove (must be multiple of section size) * @altmap: alternative device page map or %NULL if default memmap is used + * @pgmap: device page map or %NULL if not ZONE_DEVICE * * Generic helper function to remove section mappings and sysfs entries * for the section of the memory we are removing. Caller needs to make @@ -583,7 +584,7 @@ void remove_pfn_range_from_zone(struct zone *zone, * calling offline_pages(). */ void __remove_pages(unsigned long pfn, unsigned long nr_pages, - struct vmem_altmap *altmap) + struct vmem_altmap *altmap, struct dev_pagemap *pgmap) { const unsigned long end_pfn =3D pfn + nr_pages; unsigned long cur_nr_pages; @@ -598,7 +599,7 @@ void __remove_pages(unsigned long pfn, unsigned long nr= _pages, /* Select all remaining pages up to the next section boundary */ cur_nr_pages =3D min(end_pfn - pfn, SECTION_ALIGN_UP(pfn + 1) - pfn); - sparse_remove_section(pfn, cur_nr_pages, altmap); + sparse_remove_section(pfn, cur_nr_pages, altmap, pgmap); } } =20 @@ -1425,7 +1426,7 @@ static void remove_memory_blocks_and_altmaps(u64 star= t, u64 size) =20 remove_memory_block_devices(cur_start, memblock_size); =20 - arch_remove_memory(cur_start, memblock_size, altmap); + arch_remove_memory(cur_start, memblock_size, altmap, NULL); =20 /* Verify that all vmemmap pages have actually been freed. */ WARN(altmap->alloc, "Altmap not fully unmapped"); @@ -1468,7 +1469,7 @@ static int create_altmaps_and_memory_blocks(int nid, = struct memory_group *group, ret =3D create_memory_block_devices(cur_start, memblock_size, nid, params.altmap, group); if (ret) { - arch_remove_memory(cur_start, memblock_size, params.altmap); + arch_remove_memory(cur_start, memblock_size, params.altmap, NULL); kfree(params.altmap); goto out; } @@ -1554,7 +1555,7 @@ int add_memory_resource(int nid, struct resource *res= , mhp_t mhp_flags) /* create memory block devices after memory was added */ ret =3D create_memory_block_devices(start, size, nid, NULL, group); if (ret) { - arch_remove_memory(start, size, params.altmap); + arch_remove_memory(start, size, params.altmap, NULL); goto error; } } @@ -2266,7 +2267,7 @@ static int try_remove_memory(u64 start, u64 size) * No altmaps present, do the removal directly */ remove_memory_block_devices(start, size); - arch_remove_memory(start, size, NULL); + arch_remove_memory(start, size, NULL, NULL); } else { /* all memblocks in the range have altmaps */ remove_memory_blocks_and_altmaps(start, size); diff --git a/mm/memremap.c b/mm/memremap.c index 053842d45cb1..81766d822400 100644 --- a/mm/memremap.c +++ b/mm/memremap.c @@ -97,10 +97,10 @@ static void pageunmap_range(struct dev_pagemap *pgmap, = int range_id) PHYS_PFN(range_len(range))); if (pgmap->type =3D=3D MEMORY_DEVICE_PRIVATE) { __remove_pages(PHYS_PFN(range->start), - PHYS_PFN(range_len(range)), NULL); + PHYS_PFN(range_len(range)), NULL, pgmap); } else { arch_remove_memory(range->start, range_len(range), - pgmap_altmap(pgmap)); + pgmap_altmap(pgmap), pgmap); kasan_remove_zero_shadow(__va(range->start), range_len(range)); } mem_hotplug_done(); diff --git a/mm/sparse-vmemmap.c b/mm/sparse-vmemmap.c index a7b11248b989..3340f6d30b01 100644 --- a/mm/sparse-vmemmap.c +++ b/mm/sparse-vmemmap.c @@ -665,7 +665,7 @@ static struct page * __meminit populate_section_memmap(= unsigned long pfn, } =20 static void depopulate_section_memmap(unsigned long pfn, unsigned long nr_= pages, - struct vmem_altmap *altmap) + struct vmem_altmap *altmap, struct dev_pagemap *pgmap) { unsigned long start =3D (unsigned long) pfn_to_page(pfn); unsigned long end =3D start + nr_pages * sizeof(struct page); @@ -746,7 +746,7 @@ static int fill_subsection_map(unsigned long pfn, unsig= ned long nr_pages) * usage map, but still need to free the vmemmap range. */ static void section_deactivate(unsigned long pfn, unsigned long nr_pages, - struct vmem_altmap *altmap) + struct vmem_altmap *altmap, struct dev_pagemap *pgmap) { struct mem_section *ms =3D __pfn_to_section(pfn); bool section_is_early =3D early_section(ms); @@ -784,7 +784,7 @@ static void section_deactivate(unsigned long pfn, unsig= ned long nr_pages, * section_activate() and pfn_valid() . */ if (!section_is_early) - depopulate_section_memmap(pfn, nr_pages, altmap); + depopulate_section_memmap(pfn, nr_pages, altmap, pgmap); else if (memmap) free_map_bootmem(memmap); =20 @@ -828,7 +828,7 @@ static struct page * __meminit section_activate(int nid= , unsigned long pfn, =20 memmap =3D populate_section_memmap(pfn, nr_pages, nid, altmap, pgmap); if (!memmap) { - section_deactivate(pfn, nr_pages, altmap); + section_deactivate(pfn, nr_pages, altmap, pgmap); return ERR_PTR(-ENOMEM); } =20 @@ -889,13 +889,13 @@ int __meminit sparse_add_section(int nid, unsigned lo= ng start_pfn, } =20 void sparse_remove_section(unsigned long pfn, unsigned long nr_pages, - struct vmem_altmap *altmap) + struct vmem_altmap *altmap, struct dev_pagemap *pgmap) { struct mem_section *ms =3D __pfn_to_section(pfn); =20 if (WARN_ON_ONCE(!valid_section(ms))) return; =20 - section_deactivate(pfn, nr_pages, altmap); + section_deactivate(pfn, nr_pages, altmap, pgmap); } #endif /* CONFIG_MEMORY_HOTPLUG */ --=20 2.20.1 From nobody Wed Jun 17 05:14:12 2026 Received: from mail-pg1-f181.google.com (mail-pg1-f181.google.com [209.85.215.181]) (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 3F60F313E15 for ; Fri, 24 Apr 2026 02:56:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776999388; cv=none; b=MmlO4nJ6CHh2HAJaS/OTgoLc8gez5GlJBl1P+bVdj2ABXAcfqZlaPXvE9xVKBY+VEFWwouklFhpZzjwKTRR7DrMV5mLOJkmnjaZvy9SkpabBjw97PnCiroN2KQ/NZ/gF6nGuKoRMr+7OUcfTIXkUMpJ66mH/3uAivg+1iMm56Ig= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776999388; c=relaxed/simple; bh=HT5HO5ge7v5LFgL/4ymoxiP5/EbwXc4rA7DseyRJ/CM=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=d4pXergl1ZKElQoTJBZ1+qT08ctAvub+mQKBKM97h6mzbE3rA2mlWMm21qK6cPJLV3RTcR8uBs7FTuI+L+TGRSD+1KDTe2DnSGqb2IIVSaDsZypQTBd6W9fUMKrLYdglkOZ5vOno1T/+hRJhKC42KCmt/jnce5gesFVY08piQEE= 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=LEMnwZbK; arc=none smtp.client-ip=209.85.215.181 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="LEMnwZbK" Received: by mail-pg1-f181.google.com with SMTP id 41be03b00d2f7-c6e2355739dso2972344a12.2 for ; Thu, 23 Apr 2026 19:56:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bytedance.com; s=google; t=1776999377; x=1777604177; 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; bh=C94hv/3Q9yeZJL9WguueLZ0Nxmqh1CO+hZjQa23mqmc=; b=LEMnwZbKF9H0RwaBZjEXXUIdLpODVMTtXBAYvYMQK4Tt1OkjfWonlOyJZqcQzz+Lhz 8ufwYEOpNGnBcoUfcYZs+vnEkCFPDacgyexHFo3g3QIhn2krglQP74PECC+3nv/40X+4 K1ZUwj13CRPBYNKkuIJbDkXlluWePeEGpWZyhWcXybNUX2rTm8PROlrzM3QYwdaEPyLf MSk0DSU/x7mqTG39aUVJrkhHxF7vuzZu6rhCBvLMrwDsJE7gol2E1NDMurSynQgXRkgw nsZQ3Koz8fZPu7BCrZY3Lu6NPIWwAqGY/ZR5qc2giVT+WZPgfE2ZguUydDgpqWyYFlLQ jJ0w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776999377; x=1777604177; 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; bh=C94hv/3Q9yeZJL9WguueLZ0Nxmqh1CO+hZjQa23mqmc=; b=idIB/zrWtbd1STeZYRwLxU6TRGbkK9fAQvQN+gpAtuUmSskzbqkVsFc3aavlnDAVfJ LlaarGz8uT1IZaTEBes/Qdl4Lz/AYTeAAMamkpzwSGoI7pGCBF+zsaI5PQ6dbBXBZg2X CETB4Y1vVUcXuxk4mbEvjBeeYg1flNGvVFeCYuiwFxEq/cKiwRS2G2ckqVAJt6Bl7aAk tr6zZSMkRFbmkNvJSMPmQkih2YYpxZtM3wjKItKCUdOa56L5oO38fV061flyDv4dQgZ4 cdw0qA6vCi5kGrTJgjc6FdQqRLZRxtIALs3arwmjksjxeKFXdgF373hJbqaBOidLLw0U p8AQ== X-Forwarded-Encrypted: i=1; AFNElJ9GExuKbOF/dGqMD6sCTNWZ8uHjWw2MFUTXxpLYiw2ogqb+CI7KJ4K6unDF1re9xnYtzTEQDlXjjuzpYyY=@vger.kernel.org X-Gm-Message-State: AOJu0YzQtzaXFR1wN6GOhLaTNKU4Q0rSViLsFVmTPxrLajSN4W8Vx2q4 pKBoLsGpoRzcPnv/0eJTyrRSb9i/onryi8T82gseDjIokbSjnaOg6tgcgZhkoFYLpTH/4bPL92F uCY4Arws= X-Gm-Gg: AeBDies1ncnv1TCK0uOxrVXfCYfFbV/+cX7oNXNID0qbGnkhog2tMgqhHUNzp0Qzt0d CoYCIIlawfSN22q9b8gvR0GNW6pX5HJEA0yPuQR3n+auWLnvPwonNgeQxPd3b3kMoPCtxZ1jiW/ ESNCG38INobjMoEG6ZegsDm6urIJ+hA3JDsc3kRNz45/Jwjc2B8YWD0Z3MdPV9Fi1ZkqPJYHn+N xFqSoR3ezyqek7dBd5kXakhqy+uUKE0ClnkDHh4Hncz13vJ+AFpM37l7Ip2F3ExpdDgNvx4cp4D ozwq9rfwEXc5JKluN/CMQqhqu2R5N4BXTGwm4X7K/lwvVWLIyE3dBVhMZy2hmtcwT8lhzDnBn9f EWAnqWq7Y91oxP0lxQVNWrU6SRU/57LG0k9oRwvYrtAYGxwZpkxvZ02Sg78oPWBDPu1hVTJsLIb OX0J9vmePU7aV+Qp6kRtxIC9pdzILDY1TYxCLl69fCS7tsyrHgaS5+7P0= X-Received: by 2002:a17:903:28f:b0:2b4:5309:2c14 with SMTP id d9443c01a7336-2b5f9f3ad64mr324239485ad.31.1776999376914; Thu, 23 Apr 2026 19:56:16 -0700 (PDT) Received: from n232-176-004.byted.org ([36.110.163.102]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b5fab20d33sm221668325ad.63.2026.04.23.19.56.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 23 Apr 2026 19:56:16 -0700 (PDT) From: Muchun Song To: Andrew Morton , David Hildenbrand , Muchun Song , Oscar Salvador , Michael Ellerman , Madhavan Srinivasan Cc: Lorenzo Stoakes , "Liam R . Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Nicholas Piggin , Christophe Leroy , aneesh.kumar@linux.ibm.com, joao.m.martins@oracle.com, linux-mm@kvack.org, linuxppc-dev@lists.ozlabs.org, linux-kernel@vger.kernel.org, Muchun Song , stable@vger.kernel.org Subject: [PATCH v6 4/7] mm/sparse-vmemmap: Fix DAX vmemmap accounting with optimization Date: Fri, 24 Apr 2026 10:55:44 +0800 Message-Id: <20260424025547.3806072-5-songmuchun@bytedance.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20260424025547.3806072-1-songmuchun@bytedance.com> References: <20260424025547.3806072-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: quoted-printable Content-Type: text/plain; charset="utf-8" When vmemmap optimization is enabled for DAX, the nr_memmap_pages counter in /proc/vmstat is incorrect. The current code always accounts for the full, non-optimized vmemmap size, but vmemmap optimization reduces the actual number of vmemmap pages by reusing tail pages. This causes the system to overcount vmemmap usage, leading to inaccurate page statistics in /proc/vmstat. Fix this by introducing section_vmemmap_pages(), which returns the exact vmemmap page count for a given pfn range based on whether optimization is in effect. Fixes: 15995a352474 ("mm: report per-page metadata information") Cc: stable@vger.kernel.org Signed-off-by: Muchun Song Acked-by: Mike Rapoport (Microsoft) Acked-by: Oscar Salvador --- mm/sparse-vmemmap.c | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/mm/sparse-vmemmap.c b/mm/sparse-vmemmap.c index 3340f6d30b01..2e642c5ff3f2 100644 --- a/mm/sparse-vmemmap.c +++ b/mm/sparse-vmemmap.c @@ -652,6 +652,28 @@ void offline_mem_sections(unsigned long start_pfn, uns= igned long end_pfn) } } =20 +static int __meminit section_nr_vmemmap_pages(unsigned long pfn, unsigned = long nr_pages, + struct vmem_altmap *altmap, struct dev_pagemap *pgmap) +{ + const unsigned int order =3D pgmap ? pgmap->vmemmap_shift : 0; + const unsigned long pages_per_compound =3D 1UL << order; + + VM_WARN_ON_ONCE(!IS_ALIGNED(pfn | nr_pages, + min(pages_per_compound, PAGES_PER_SECTION))); + VM_WARN_ON_ONCE(pfn_to_section_nr(pfn) !=3D pfn_to_section_nr(pfn + nr_pa= ges - 1)); + + if (!vmemmap_can_optimize(altmap, pgmap)) + return DIV_ROUND_UP(nr_pages * sizeof(struct page), PAGE_SIZE); + + if (order < PFN_SECTION_SHIFT) + return VMEMMAP_RESERVE_NR * nr_pages / pages_per_compound; + + if (IS_ALIGNED(pfn, pages_per_compound)) + return VMEMMAP_RESERVE_NR; + + return 0; +} + static struct page * __meminit populate_section_memmap(unsigned long pfn, unsigned long nr_pages, int nid, struct vmem_altmap *altmap, struct dev_pagemap *pgmap) @@ -659,7 +681,7 @@ static struct page * __meminit populate_section_memmap(= unsigned long pfn, struct page *page =3D __populate_section_memmap(pfn, nr_pages, nid, altma= p, pgmap); =20 - memmap_pages_add(DIV_ROUND_UP(nr_pages * sizeof(struct page), PAGE_SIZE)); + memmap_pages_add(section_nr_vmemmap_pages(pfn, nr_pages, altmap, pgmap)); =20 return page; } @@ -670,7 +692,7 @@ static void depopulate_section_memmap(unsigned long pfn= , unsigned long nr_pages, unsigned long start =3D (unsigned long) pfn_to_page(pfn); unsigned long end =3D start + nr_pages * sizeof(struct page); =20 - memmap_pages_add(-1L * (DIV_ROUND_UP(nr_pages * sizeof(struct page), PAGE= _SIZE))); + memmap_pages_add(-section_nr_vmemmap_pages(pfn, nr_pages, altmap, pgmap)); vmemmap_free(start, end, altmap); } =20 @@ -678,9 +700,10 @@ static void free_map_bootmem(struct page *memmap) { unsigned long start =3D (unsigned long)memmap; unsigned long end =3D (unsigned long)(memmap + PAGES_PER_SECTION); + unsigned long pfn =3D page_to_pfn(memmap); =20 - memmap_boot_pages_add(-1L * (DIV_ROUND_UP(PAGES_PER_SECTION * sizeof(stru= ct page), - PAGE_SIZE))); + memmap_boot_pages_add(-section_nr_vmemmap_pages(pfn, PAGES_PER_SECTION, + NULL, NULL)); vmemmap_free(start, end, NULL); } =20 --=20 2.20.1 From nobody Wed Jun 17 05:14:12 2026 Received: from mail-pl1-f174.google.com (mail-pl1-f174.google.com [209.85.214.174]) (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 B675730BF52 for ; Fri, 24 Apr 2026 02:56:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776999388; cv=none; b=lj1u57ZptGKExxLXg8O7ML5/LQ+DMu36pLmPv74ZIfBBmW64s+lx8e1ZypEXBhXg/kIxkQRrGAsprt/KFnuxNM8VBR2MeVIhrin5oLvDLWTBSj+IO/NU9wdFmaQ5c1sljUUMQwtjCn9ufC8fy8Cj6avUbBiyMrkHnaAwHRS9Ss4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776999388; c=relaxed/simple; bh=I09DVnwUmT2FgjMlL1sbr+fqXGO2fhcK42PNEcwA7S4=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=lU3650cBrdtpWhQwxxPh77oX60BHoNmZ6uHIzkkRtg7UiN3FOGNkk3IIkH7qEtjB0RAmZoVG0PuEB7WOIwRNh4idYMEevMq1fmzQJj0ex+oQpaz4c44T/iq9X55xxB+6EfZSzJPU/PrBSXXuNaF+O/dkZyrIIiIkCM0fnPjNDeE= 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=Jhf7yVAj; arc=none smtp.client-ip=209.85.214.174 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="Jhf7yVAj" Received: by mail-pl1-f174.google.com with SMTP id d9443c01a7336-2ab077e3f32so31666905ad.3 for ; Thu, 23 Apr 2026 19:56:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bytedance.com; s=google; t=1776999382; x=1777604182; 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; bh=X8jAPi1Ug7YtuxDodtBim0VZYTDek6DS5vd5ro+n0/g=; b=Jhf7yVAjomFeis3Y4Y1DJDax2tSMaVzho7OV9kb5c1jHTDaoJY9tXLxobHDq71j699 7pETj8yJ98rTmuxLJpUKYrON4ZE7JYevAgfNYwbKnF4iPp3KC1kd50I5hDTWpZ288y72 i90N8MNO/32dgL3esQhzCbFFutWENPVXA/ShOUCF1UuYC40GiPXZSIbJx54wDXggX8sN 4qcuGvlpclTgY+Sxdzb2AlgLA6JZieF3PBYkIdHnA7AwnzpDz4GtR7U84tSh5KNE/Ypm exu5wVV6CU+wlmvWjkx6fNaZr05mvL/aagRqqJOVOO6yEYVnaRNg0Dz0XvKk3va90RX1 jShQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776999382; x=1777604182; 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; bh=X8jAPi1Ug7YtuxDodtBim0VZYTDek6DS5vd5ro+n0/g=; b=ffbak3OFX1dgb6TO2YAo2XM/HwgbsPW7dzWgkcIB2T3ojjPFmdkSIRSz0sRL69HVM1 Oks8yaJk790AwCfJ7k2jZozrdiqHtmbkiAgUcjYlsKSRGL7VVw4Wbsv12nErr3q4C0wa lzaQRpXhOox0Hr0f3bkZl6waEmd45NJym+ABDDSWzPrgeYYP6CUdJm8KtZYoe2AV50oS JEnCtdK/begYg1id6Rmk6fQ2TN3j/dAmVUxvE8h/p5MAHQaMebzY0UQiWQ3sek6sAk/H V+NTEWjKPg0kWxQDQu8KfkCvpydCNN5KL24bgBTgWWvUVTHW4ER31Sqrb7/CIMPqel79 2wtA== X-Forwarded-Encrypted: i=1; AFNElJ8+fGpUTkbAL0OS2j2T53iJ+pYebvz00jka8ZV48330NigKKwNwpLYOez4Ns97ja3xzihiDbEcyCbshn60=@vger.kernel.org X-Gm-Message-State: AOJu0YyJg3G+w6jFV0/3i9fwyFbZSmi61X9qrgGmt4PgftQ4mWkpBrzW 0CVs+7c997BGcaKNpRQ8kCUQMGf6ogVcb8DD+oua5O1lo/WNxK5VaxTEhjcdPy5it8o= X-Gm-Gg: AeBDievcqZhse/3LX8DouJ2NiucsptqwkiwratNT2Ms57OBvnu4NXZ7fA7cTRHrZahP yDSSTllFs1Ph45E8sNHdd9a98zmqKbgQ4Yhdou+DyIiSvcPlSBXJYy0p0jcq4SMRcHlL3UPM9SA s2SKJ/e8tAqLToH/SDtHYVV2h0+sKapgljPynrogzHagZO+XuScBCu+GE6s06uOG9tFy2KiqCDZ eFzZCzGxbVHTQZx1XXRiQOMrlaEKVMWcxAK//nPsOaZxCLxJpaJQUYfT+pTPCFRC2Lg9lBl6FAE iysjEsTdiJcb9HkfqL3K2i1aI3a7D6aKJD168m56eg6B4/6fz6ZLvoewE3oYuJf/E2o04OvbJfA XLLSfmryP0r08s6vcFFa9N8vWdf8fA4VEG4GTzsPSHV0q3lCohbl3DEjlJAH7NHkIkW2Ze0PYN+ Su74IkYzQKpvV1ZQ+zicJ4Nd5/06X5ItNxielE+lg+WhQEgE09h2HJDrg= X-Received: by 2002:a17:903:1a83:b0:2b0:61c2:8e83 with SMTP id d9443c01a7336-2b5f9f36f53mr299091855ad.20.1776999381981; Thu, 23 Apr 2026 19:56:21 -0700 (PDT) Received: from n232-176-004.byted.org ([36.110.163.102]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b5fab20d33sm221668325ad.63.2026.04.23.19.56.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 23 Apr 2026 19:56:21 -0700 (PDT) From: Muchun Song To: Andrew Morton , David Hildenbrand , Muchun Song , Oscar Salvador , Michael Ellerman , Madhavan Srinivasan Cc: Lorenzo Stoakes , "Liam R . Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Nicholas Piggin , Christophe Leroy , aneesh.kumar@linux.ibm.com, joao.m.martins@oracle.com, linux-mm@kvack.org, linuxppc-dev@lists.ozlabs.org, linux-kernel@vger.kernel.org, Muchun Song , stable@vger.kernel.org Subject: [PATCH v6 5/7] mm/mm_init: Fix pageblock migratetype for ZONE_DEVICE compound pages Date: Fri, 24 Apr 2026 10:55:45 +0800 Message-Id: <20260424025547.3806072-6-songmuchun@bytedance.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20260424025547.3806072-1-songmuchun@bytedance.com> References: <20260424025547.3806072-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: quoted-printable Content-Type: text/plain; charset="utf-8" The memmap_init_zone_device() function only initializes the migratetype of the first pageblock of a compound page. If the compound page size exceeds pageblock_nr_pages (e.g., 1GB hugepages with 2MB pageblocks), subsequent pageblocks in the compound page remain uninitialized. Move the migratetype initialization out of __init_zone_device_page() and into a separate pageblock_migratetype_init_range() function. This iterates over the entire PFN range of the memory, ensuring that all pageblocks are correctly initialized. Also remove the stale confusing comment about MEMINIT_HOTPLUG above the migratetype setting since it is an obsolete relic from commit 966cf44f637e ("mm: defer ZONE_DEVICE page initialization to the point where we init pgmap") and no longer makes sense here. Fixes: c4386bd8ee3a ("mm/memremap: add ZONE_DEVICE support for compound pag= es") Cc: stable@vger.kernel.org Signed-off-by: Muchun Song Reviewed-by: Mike Rapoport (Microsoft) Reviewed-by: Oscar Salvador Acked-by: David Hildenbrand (Arm) --- mm/mm_init.c | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/mm/mm_init.c b/mm/mm_init.c index f9f8e1af921c..cfc76953e249 100644 --- a/mm/mm_init.c +++ b/mm/mm_init.c @@ -674,6 +674,20 @@ static inline void fixup_hashdist(void) static inline void fixup_hashdist(void) {} #endif /* CONFIG_NUMA */ =20 +#ifdef CONFIG_ZONE_DEVICE +static __meminit void pageblock_migratetype_init_range(unsigned long pfn, + unsigned long nr_pages, int migratetype) +{ + const unsigned long end =3D pfn + nr_pages; + + for (pfn =3D pageblock_align(pfn); pfn < end; pfn +=3D pageblock_nr_pages= ) { + init_pageblock_migratetype(pfn_to_page(pfn), migratetype, false); + if (IS_ALIGNED(pfn, PAGES_PER_SECTION)) + cond_resched(); + } +} +#endif + /* * Initialize a reserved page unconditionally, finding its zone first. */ @@ -1011,21 +1025,6 @@ static void __ref __init_zone_device_page(struct pag= e *page, unsigned long pfn, page_folio(page)->pgmap =3D pgmap; page->zone_device_data =3D NULL; =20 - /* - * Mark the block movable so that blocks are reserved for - * movable at startup. This will force kernel allocations - * to reserve their blocks rather than leaking throughout - * the address space during boot when many long-lived - * kernel allocations are made. - * - * Please note that MEMINIT_HOTPLUG path doesn't clear memmap - * because this is done early in section_activate() - */ - if (pageblock_aligned(pfn)) { - init_pageblock_migratetype(page, MIGRATE_MOVABLE, false); - cond_resched(); - } - /* * ZONE_DEVICE pages other than MEMORY_TYPE_GENERIC are released * directly to the driver page allocator which will set the page count @@ -1122,6 +1121,9 @@ void __ref memmap_init_zone_device(struct zone *zone, =20 __init_zone_device_page(page, pfn, zone_idx, nid, pgmap); =20 + if (IS_ALIGNED(pfn, PAGES_PER_SECTION)) + cond_resched(); + if (pfns_per_compound =3D=3D 1) continue; =20 @@ -1129,6 +1131,8 @@ void __ref memmap_init_zone_device(struct zone *zone, compound_nr_pages(altmap, pgmap)); } =20 + pageblock_migratetype_init_range(start_pfn, nr_pages, MIGRATE_MOVABLE); + pr_debug("%s initialised %lu pages in %ums\n", __func__, nr_pages, jiffies_to_msecs(jiffies - start)); } --=20 2.20.1 From nobody Wed Jun 17 05:14:12 2026 Received: from mail-pl1-f176.google.com (mail-pl1-f176.google.com [209.85.214.176]) (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 DA7BD314B73 for ; Fri, 24 Apr 2026 02:56:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776999394; cv=none; b=BH331sRcvRpPXR83G/q+xIEmvoTLVcKBAkuLa66sxTeBaLCNNrU/Ko8Jh9bx1bPZxANUQNZa/qMa8UKYZtLb03+IZ/6i6L+U2OyWOCfqicf07mSao6i6KGV0nrxScHN/sjzPMNX0dHogF3S2xYtwq5ThaOJ12tY1fvXZHInSih0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776999394; c=relaxed/simple; bh=yaDJsF6niQhRHztNmySVX7QcIen1LwiglGYRWBKHNss=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=XnCAYdUnxh8yGlGDYLrEhVuYDLZ4SMA7YzZ2I9IyW02Rv/3aqyiW4TkktzamiSyfK7tlct2+4GRPytkgp19Lvhun4N8GD6UQHgQrmZ9bYuhRZNHrO7WT39JmKdtMljA/XsaKaPxHScyInBhlnBIfx4vL9HzrLQqYnul+e0gb3os= 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=ga8y5FCN; arc=none smtp.client-ip=209.85.214.176 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="ga8y5FCN" Received: by mail-pl1-f176.google.com with SMTP id d9443c01a7336-2b2d3a9e149so39417675ad.1 for ; Thu, 23 Apr 2026 19:56:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bytedance.com; s=google; t=1776999387; x=1777604187; 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; bh=gorQ8nwUKwQQqSP5JrI9Qb+od9YHCs59YbEIcdvGJzM=; b=ga8y5FCNuRCGn8QRo7KBGR5G6SZ4Y8zbMbdtXzKuYpSJUHfdTZYOBmy0ZitUOg2fRC nb5nR9o5kqCHNRaIS7GSQNYtTikgogtoRfbVdUsAegQVIBokiQNsp6ddjLpx5pjeeO2Q JO76EiQ0JG3ZR86fFZE3cdoVd+S6sfHtDF49PfMiADoyPFhwfUknVFmoGHtdnUZMONBO wwU84iuY8wt9zcR4yWxxBF+nvfMWi/2FuNehnNwNR09rZWVVHKNs8UlgYO1mG0RR5HXV 5NIsCPUK+6gsHNGFeAz4fDOMi2tNBt97sBR383VTNbuyHWfjE5F1sbKTn6qKy7QB4qsh Ds5Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776999387; x=1777604187; 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; bh=gorQ8nwUKwQQqSP5JrI9Qb+od9YHCs59YbEIcdvGJzM=; b=nH8ZLsOfEX42ZlNRgLRZeYK5R3qMfMLoK3FhKt9IHjVFxEI2pyU62zh2OdMy+y469n tyZnp9PwFw41bIM3CTPrOtJ9HkdSP7ScuaWyYM2aBVyWHiZiKzv0dZv5f5pUgUBhts9j WIx549RzD2xMuNuSFhQVajtAj/ebsEyrkbxOnV767rm0o+s9w/+D97/uIwNW9xhngK09 5f3KgGDT5qmidgXdMCma/VmRDgGdhoLuiieYTNfRUHhZzgL/ZuAgSZWmqaohJGlHODFV 0/1pndyH8njeQWyPTLqvyBFcPijIdT6S2c8a6HTPMCr612boIQMZWhA/mS0oQ48ahUiC BaeQ== X-Forwarded-Encrypted: i=1; AFNElJ+NpzO3N5ze9JDvN5Ty4FTqtD3mpTtMnt8u0np6SNvkwbUN1VicYO2yeETn8w6donJlwbrNb0MhZ3Zqtm8=@vger.kernel.org X-Gm-Message-State: AOJu0YzI9LGPKqFbr+uakaMa1rasZKViguZDcuIhsViwc8TNm0IslUc0 QTpO8LbhlshqkuVkvrWfnqWLdlGFWWcMjd/Z6Jwb68SYrexupHJkwtQ/atcS5qFzUsY= X-Gm-Gg: AeBDiesiwnRiEfefqvnUy+eEHAkyQ0BzzIzqHDhtY7r6ZcgOnXCO/QGT1Kbh6wkVpHI OVAcuvjAecNs9A6hxwRrOS2z95aTYwZNbDbTeKlss9jq4Bu/DkBIJDloX5S2Q76tNM01+a55XEu 20+7nPrcMGTXqzz/eso36kkgYa6d1qswAM4V2yfb7ydQEW8QTISBaNOVor9IHYJuIQDjYnrvCmA 5g5a3gieMP504LSYs/AsUEeY+eRoYDkHfw5EGksD0ui/UySS6VanQrO3G0pg0Nn6PDtQO+Sh5+C w/fvZoppY75/OmJkMiMkH7TQFrFxMz5e36Jc/bM9l0S5maOStUoSsy1WT0U5EwS7WlkD3VpxvDi BV4X7URcE6UlgGFpn0VXkQNumdfO0ZftKv0HOrDAo/vQjGb/UnYLOAbGjVndF8R8j+yx/3rEnvz RF1nIP3qhNZk6s+3/Wz/RvJe29373gjEMv2gtOK3/i8QeHA8KKyUCWYDrQnsOefEyDag== X-Received: by 2002:a17:902:e748:b0:2b4:5d0c:7a85 with SMTP id d9443c01a7336-2b5f9dbcd42mr277705665ad.3.1776999387049; Thu, 23 Apr 2026 19:56:27 -0700 (PDT) Received: from n232-176-004.byted.org ([36.110.163.102]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b5fab20d33sm221668325ad.63.2026.04.23.19.56.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 23 Apr 2026 19:56:26 -0700 (PDT) From: Muchun Song To: Andrew Morton , David Hildenbrand , Muchun Song , Oscar Salvador , Michael Ellerman , Madhavan Srinivasan Cc: Lorenzo Stoakes , "Liam R . Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Nicholas Piggin , Christophe Leroy , aneesh.kumar@linux.ibm.com, joao.m.martins@oracle.com, linux-mm@kvack.org, linuxppc-dev@lists.ozlabs.org, linux-kernel@vger.kernel.org, Muchun Song , stable@vger.kernel.org Subject: [PATCH v6 6/7] mm/mm_init: Fix uninitialized struct pages for ZONE_DEVICE Date: Fri, 24 Apr 2026 10:55:46 +0800 Message-Id: <20260424025547.3806072-7-songmuchun@bytedance.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20260424025547.3806072-1-songmuchun@bytedance.com> References: <20260424025547.3806072-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: quoted-printable Content-Type: text/plain; charset="utf-8" If DAX memory is hotplugged into an unoccupied subsection of an early section, section_activate() reuses the unoptimized boot memmap. However, compound_nr_pages() still assumes that vmemmap optimization is in effect and initializes only the reduced number of struct pages. As a result, the remaining tail struct pages are left uninitialized, which can later lead to unexpected behavior or crashes. Fix this by treating early sections as unoptimized when calculating how many struct pages to initialize. Fixes: 6fd3620b3428 ("mm/page_alloc: reuse tail struct pages for compound d= evmaps") Cc: stable@vger.kernel.org Signed-off-by: Muchun Song Acked-by: David Hildenbrand (Arm) Acked-by: Mike Rapoport (Microsoft) --- mm/mm_init.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/mm/mm_init.c b/mm/mm_init.c index cfc76953e249..bd466a3c10c8 100644 --- a/mm/mm_init.c +++ b/mm/mm_init.c @@ -1055,10 +1055,17 @@ static void __ref __init_zone_device_page(struct pa= ge *page, unsigned long pfn, * of how the sparse_vmemmap internals handle compound pages in the lack * of an altmap. See vmemmap_populate_compound_pages(). */ -static inline unsigned long compound_nr_pages(struct vmem_altmap *altmap, +static inline unsigned long compound_nr_pages(unsigned long pfn, + struct vmem_altmap *altmap, struct dev_pagemap *pgmap) { - if (!vmemmap_can_optimize(altmap, pgmap)) + /* + * If DAX memory is hot-plugged into an unoccupied subsection + * of an early section, the unoptimized boot memmap is reused. + * See section_activate(). + */ + if (early_section(__pfn_to_section(pfn)) || + !vmemmap_can_optimize(altmap, pgmap)) return pgmap_vmemmap_nr(pgmap); =20 return VMEMMAP_RESERVE_NR * (PAGE_SIZE / sizeof(struct page)); @@ -1128,7 +1135,7 @@ void __ref memmap_init_zone_device(struct zone *zone, continue; =20 memmap_init_compound(page, pfn, zone_idx, nid, pgmap, - compound_nr_pages(altmap, pgmap)); + compound_nr_pages(pfn, altmap, pgmap)); } =20 pageblock_migratetype_init_range(start_pfn, nr_pages, MIGRATE_MOVABLE); --=20 2.20.1 From nobody Wed Jun 17 05:14:12 2026 Received: from mail-pl1-f180.google.com (mail-pl1-f180.google.com [209.85.214.180]) (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 818CA318EE7 for ; Fri, 24 Apr 2026 02:56:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776999399; cv=none; b=FaOAyKiShlrQgmrrG7lAONir+PNPm+Ccx4OIVkvOn6NyTycanYaZiciyotk3yNQ9bK/K9A8JEBapqtkbCsI7HtlBR2K1DtAg9UjWfFWBq2+QBqKx4rZccUj5ZL8ii6Nplx5rqE6vf7ndCzgWgM/xauriJcE3bTG7dV6uZFH0OBo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776999399; c=relaxed/simple; bh=r35P7VtdnoMm5CPZyedfG2y5OKFJTV7Ok/2IPFA7IVo=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=lvxtCP7xb6w0/0i9ojC65cxPnARKNE/EI0bf1lXDhY56j1WChoiWwh/iuB54+fIS2qRfBuFxlSsEPQe6aW3xvRi4nQg7VFfFJ2ZU/TZlVY7bGMSU57s1+TiA9CtOAssKnajdxi795gK++oKmLR0f2VND929Bo7h2AzsFiJremAQ= 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=aEWXrsnf; arc=none smtp.client-ip=209.85.214.180 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="aEWXrsnf" Received: by mail-pl1-f180.google.com with SMTP id d9443c01a7336-2ad9f316d68so33166765ad.2 for ; Thu, 23 Apr 2026 19:56:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bytedance.com; s=google; t=1776999392; x=1777604192; 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; bh=ETx/tSKnTC+n/nV2wgCSbp2pIhIkVNUTkv0q633meJ0=; b=aEWXrsnfZZRGZugtsOuXvA8OsdJCIueaxpVSW9zWxtmJX0NrNBVxJzpVa8w1akSyj2 Qg3PDwx2XsXeGa3Owo9BEAaLdhH7V+2STs4IYj79Z2JOsAx785OmnHmbcPkshN2dxUzG t3+ZAeMiCMhvZAs+IxXLXb1l+7G1GPy1hWxCbiyL6In5a7F9L4gwpdaza1OOwu6ZAMab v59V0Jz17IdO4spUhspS4bpggsrEX4hzPYxoUi4QGURtuYC1N5yxjQdQ2x6uGSc0dqjq W7VF40G36VrpjJU0jIzRh2p7PiYSj/Vx14wCtjV6w+imB41MVuovp4D3GTaMlNpio8yd iHfw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776999392; x=1777604192; 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; bh=ETx/tSKnTC+n/nV2wgCSbp2pIhIkVNUTkv0q633meJ0=; b=gpbbdSHFeLGu1o87Fnmwodoi51DFgpSd8fOagTgrXphw5hZQO2c+5Vdu/BpJ1b5AYh lMhLCpG3MCytwRdHzswIeEOlp79x4EylXApAqbeB6xcvm+nuL7IVQbY1F3H6o6snmSgM u6nbq2c8+gaMsiZUdaea8Jf2qwgZLI3RC7hb+XpXvXKfd0EXD0KTd/FAS27Z10iuHzf/ 8AIlkDwHC4HUHTA0ZjeVTe09Tr83pY4wrej5vBfCOdDByQz3QKdGcDwoVrcm+gn7UNlB uOPq/iPsFaf7j423v89hSKANV9guZ8aVCZuCfmyWUYF0qFaV876KIHyFWGw6UhoYq4HL FZng== X-Forwarded-Encrypted: i=1; AFNElJ8Yrvszt/6nSnEpnFfyDCEuMJPEGl6cgF2MdObQfSTDjVJJ7uc6NUtTcxyJzLZVDyDaU9p3E7FrpCNYjBw=@vger.kernel.org X-Gm-Message-State: AOJu0YyQQdDPOMOKbbB7RbCB46iZVGanpreRvCLt0daZGRFTfAl7mw2g xIE3u3TK55NZ/r8Hyg0iIRav6/p/rP66cKgMbupvHS8ULyvSWUzb74WXTdUaGVYo9xE= X-Gm-Gg: AeBDietgObyjwgZMWTy9m1YoUlYsTaX27/R7vWF5vp2H/1OdsDdUPXjtz4UhjKuwNd0 l2rniKdDE/apcfLPPpOZkRsZt56RtvKioQOh2uSWW+3hD4XbBv6cxVOkoT/v1ySZKB3+CT0zeJw CBF4fZ9JijiMIWWnGUP5H4pS72wFWvgkEuWQa8YSBm1IETHWcE04LoWEVXwCVowQLx2BoRsXByp dKgbwjwV2ByN9/vCki91SvyQDjnGvP+Y/hqPpP4ytt6TitoK7MNRy64xYOsXUh4lc8jZytj2jz/ XP01Nu+AVmuSyWYurLgbKJd8aV7cb1BLwAN7WVJxjLBLZYbaAb6V+fW14ECqO8mA61j7qpXKBbP d793US1blGQzDfQ70tdWNzB4XXEI8HNlHFuMl2WhuOAB0PkOAa5HKfx8+muCwuKWlQVAnep1dva rshFS9rIeooyt2V1yR2nhp+IiWDlWaw39TFpZyaVpOdWcTlbUm7N6bf7wZGPG3pXRn6w== X-Received: by 2002:a17:902:6bc2:b0:2b0:9101:1b77 with SMTP id d9443c01a7336-2b5f9eaf6a6mr216777385ad.17.1776999392104; Thu, 23 Apr 2026 19:56:32 -0700 (PDT) Received: from n232-176-004.byted.org ([36.110.163.102]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b5fab20d33sm221668325ad.63.2026.04.23.19.56.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 23 Apr 2026 19:56:31 -0700 (PDT) From: Muchun Song To: Andrew Morton , David Hildenbrand , Muchun Song , Oscar Salvador , Michael Ellerman , Madhavan Srinivasan Cc: Lorenzo Stoakes , "Liam R . Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Nicholas Piggin , Christophe Leroy , aneesh.kumar@linux.ibm.com, joao.m.martins@oracle.com, linux-mm@kvack.org, linuxppc-dev@lists.ozlabs.org, linux-kernel@vger.kernel.org, Muchun Song Subject: [PATCH v6 7/7] mm/memory_hotplug: Factor out altmap freeing checks Date: Fri, 24 Apr 2026 10:55:47 +0800 Message-Id: <20260424025547.3806072-8-songmuchun@bytedance.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20260424025547.3806072-1-songmuchun@bytedance.com> References: <20260424025547.3806072-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: quoted-printable Content-Type: text/plain; charset="utf-8" Use a small helper to centralize altmap freeing after verifying that all vmemmap pages were released. This keeps the check consistent between the normal teardown path and the memory hotplug error paths. Suggested-by: David Hildenbrand (Arm) Signed-off-by: Muchun Song Acked-by: David Hildenbrand (Arm) --- mm/memory_hotplug.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c index 7bfdc3a99688..ee150d312bd9 100644 --- a/mm/memory_hotplug.c +++ b/mm/memory_hotplug.c @@ -1403,6 +1403,12 @@ bool mhp_supports_memmap_on_memory(void) } EXPORT_SYMBOL_GPL(mhp_supports_memmap_on_memory); =20 +static void altmap_free(struct vmem_altmap *altmap) +{ + WARN_ONCE(altmap->alloc, "Altmap not fully unmapped"); + kfree(altmap); +} + static void remove_memory_blocks_and_altmaps(u64 start, u64 size) { unsigned long memblock_size =3D memory_block_size_bytes(); @@ -1425,12 +1431,8 @@ static void remove_memory_blocks_and_altmaps(u64 sta= rt, u64 size) mem->altmap =3D NULL; =20 remove_memory_block_devices(cur_start, memblock_size); - arch_remove_memory(cur_start, memblock_size, altmap, NULL); - - /* Verify that all vmemmap pages have actually been freed. */ - WARN(altmap->alloc, "Altmap not fully unmapped"); - kfree(altmap); + altmap_free(altmap); } } =20 @@ -1461,7 +1463,7 @@ static int create_altmaps_and_memory_blocks(int nid, = struct memory_group *group, /* call arch's memory hotadd */ ret =3D arch_add_memory(nid, cur_start, memblock_size, ¶ms); if (ret < 0) { - kfree(params.altmap); + altmap_free(params.altmap); goto out; } =20 @@ -1470,7 +1472,7 @@ static int create_altmaps_and_memory_blocks(int nid, = struct memory_group *group, params.altmap, group); if (ret) { arch_remove_memory(cur_start, memblock_size, params.altmap, NULL); - kfree(params.altmap); + altmap_free(params.altmap); goto out; } } --=20 2.20.1