From mboxrd@z Thu Jan 1 00:00:00 1970 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: 8bit 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 = __populate_section_memmap(pfn, nr_pages, nid, altmap, + pgmap); + + memmap_pages_add(DIV_ROUND_UP(nr_pages * sizeof(struct page), PAGE_SIZE)); + + return page; } static void depopulate_section_memmap(unsigned long pfn, unsigned long nr_pages, @@ -665,13 +670,17 @@ static void depopulate_section_memmap(unsigned long pfn, unsigned long nr_pages, unsigned long start = (unsigned long) pfn_to_page(pfn); unsigned long end = start + nr_pages * sizeof(struct page); + 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 = (unsigned long)memmap; unsigned long end = (unsigned long)(memmap + PAGES_PER_SECTION); + memmap_boot_pages_add(-1L * (DIV_ROUND_UP(PAGES_PER_SECTION * sizeof(struct page), + PAGE_SIZE))); vmemmap_free(start, end, NULL); } @@ -774,14 +783,10 @@ static void section_deactivate(unsigned long pfn, unsigned 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), PAGE_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); - } if (empty) ms->section_mem_map = (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)); return memmap; } -- 2.20.1