From nobody Wed Feb 11 02:26:58 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 D9EC53FE4 for ; Thu, 2 Jan 2025 06:57:38 +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=1735801060; cv=none; b=Z/DKsICSpxfu1ELSZLoWw+FYZqtTjhFF/jgmqq0i834/5ZvscMbL+P8vUxLVRkstqgtPPwBUrm9kMoEvJcheY8ddbIGXt5+h/f5RjDXNiCCY+QSxtiBPfBQAkKAA51Vgv4PpW68f4Y2r0uHRDkS5UfGNveUx0N1oLe8+3RGZ4tM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735801060; c=relaxed/simple; bh=xlduhaHT4Y9I1UMr0P5rIxzb+P1p5gsCJojBa+HlZKY=; h=From:To:Cc:Subject:Date:Message-Id:MIME-Version; b=o6gUMg2GHq+JPQarmD6QEmO0cFFIMY18qfeflrLdPOlA68yRZksujCtkXa0FjEPQ5rMlMPlztjtyr3jjhV5hIJc2HOOiuCd88P8WYHqggNLqK58KMYx/w4N9hpqecdM81tCHIeR9ZIJgQYAyL/qc6fuTEBIkJVVWO8Y74bKQciE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=BbH4ro02; arc=none smtp.client-ip=209.85.214.173 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="BbH4ro02" Received: by mail-pl1-f173.google.com with SMTP id d9443c01a7336-21636268e43so61909905ad.2 for ; Wed, 01 Jan 2025 22:57:38 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1735801058; x=1736405858; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=65RIXZaQDNZZs9h8XjHyHNBnS0NP8JFMbESmaGLNetQ=; b=BbH4ro02uTqq1NYCRvgmTXAWeMKo1MG6VRrUyY0QLYlGY/EnrKatm0cvvjSV5K4ViQ +L6sUuO/4zskn8umCpeIDrkltvXYm/govzUKVB+t9Ff3RHHEF78//UwoESUnQxYOeINH lhwZwYD2ntRFHT9beImAoWgdbxKwczUYTgBnvlnOOrVmNAYMMBqQhnFzfwWhfYT+ACGz JFGfDg6LF9tKkmbAAyBLOp0rFS5R8R7LKMNbviv+G9DB8wT+K6XOQR5ev9I7I0r+j0na fhyZnNQOgkisuB9NxVW+4jILPKgizjN6sE5ZnaXYMFN7B/jPuXQNSm7CgjpMVRjbE34a /Sdw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1735801058; x=1736405858; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=65RIXZaQDNZZs9h8XjHyHNBnS0NP8JFMbESmaGLNetQ=; b=Q5M96k5hXHaSXXw4RiDehpsV5/aaW6rQPQQoOsuU+kF8Gmeu20pOvtKLgqELO3NghB Sm/LNOeItPjRpUfAkWiyV6n1kbrGw2/y/xp8U+gVZ2mjvhQCO3EGh5YsUZ3/ThOFYBeD tGYgtUxKLvY3aAsZc5igiI2fNFHmLaYVjBQyevRzmZkyd3NBDmg1niwVEd9QdDUJyjdZ Qwo80wZYInRTsYDabgcKEl2Xgg1j4RiD3H0E0qTXD40AElu9VNXErt/+//v4jK7vYGyA onEKIGR3IvHvdzTHjM5SbWeI3SZxBNfGA1HPlRTt8LKKUz85HWonAnSeIklcb14AEHm4 zBBQ== X-Forwarded-Encrypted: i=1; AJvYcCUKKyY2O3cDIECltuu3a2EoMthwOeugpZkysPDTnIoULwN0eyBEnuJzJBShWalAiQGGwCtKlsAvXNd2IAU=@vger.kernel.org X-Gm-Message-State: AOJu0Yx4QFa4MizWf1pEpNxsw95oymxPxr8fEAC2aQPRSS4GA3ys1jD2 nFEOFfT3iOuGC0KPgeoh/QStZbv3Klk6sjn2Y508406kR+1bh7SQKDADt+NN X-Gm-Gg: ASbGncutYtH+NKMwP0M/ETeZV2rPXhx+MvBlmgvukDppflL7Fbs6cpeOnjCf1qHCZxK Fn8rdlFd6ZtXiQaehZj5wrAhO5XFIs0IPq0w1JC6mxQJv35z/qC3VkJAC9iWgq35NmvDCEp/iLY 3J2S7c0OhkAP8iL+GVArX82/FcDAT5wbne6hl8oOaOtlDOXSVJL8UuS5JyfOWbUYa8puX+erncc NVCu2rqoWsdk0gHvCe+9vqpne1azu7LVleHDNZknypZZYY87gwk7nq0ZnWqdDJH7DvHE1IA/X26 kVhV X-Google-Smtp-Source: AGHT+IH4RvnnZ4DnvjtG3s0DHdfZzhIzz3QnrHMNv2553ao1Wb0/9glnxupSYooV32hv2MHRVX8bBg== X-Received: by 2002:a17:902:c943:b0:215:72aa:693f with SMTP id d9443c01a7336-219e6e8bb89mr686026635ad.9.1735801058053; Wed, 01 Jan 2025 22:57:38 -0800 (PST) Received: from localhost.localdomain ([36.110.106.149]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-219dc9f6156sm213883775ad.209.2025.01.01.22.57.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 01 Jan 2025 22:57:37 -0800 (PST) From: Guo Weikang To: Catalin Marinas , Mike Rapoport , Andrew Morton Cc: Guo Weikang , linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: [PATCH] mm/memmap: Prevent double scanning of memmap by kmemleak Date: Thu, 2 Jan 2025 14:57:03 +0800 Message-Id: <20250102065704.647693-1-guoweikang.kernel@gmail.com> X-Mailer: git-send-email 2.25.1 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" kmemleak explicitly scans the mem_map through the valid struct page objects. However, memmap_alloc() was also adding this memory to the gray object list, causing it to be scanned twice. Removes memmap_alloc() from the scan list and adds a comment to clarify the behavior. Link: https://lore.kernel.org/lkml/CAOm6qn=3DFVeTpH54wGDFMHuCOeYtvoTx30ktnv= 9-w3Nh8RMofEA@mail.gmail.com/ Signed-off-by: Guo Weikang --- include/linux/memblock.h | 8 +++++++- mm/mm_init.c | 8 ++++++-- mm/sparse-vmemmap.c | 20 ++------------------ 3 files changed, 15 insertions(+), 21 deletions(-) diff --git a/include/linux/memblock.h b/include/linux/memblock.h index 673d5cae7c81..b0483c534ef7 100644 --- a/include/linux/memblock.h +++ b/include/linux/memblock.h @@ -375,7 +375,13 @@ static inline int memblock_get_region_node(const struc= t memblock_region *r) } #endif /* CONFIG_NUMA */ =20 -/* Flags for memblock allocation APIs */ +/* + * Flags for memblock allocation APIs + * MEMBLOCK_ALLOC_ANYWHERE and MEMBLOCK_ALLOC_ACCESSIBLE + * indicates wheather the allocation is limited by memblock.current_limit. + * MEMBLOCK_ALLOC_NOLEAKTRACE not only indicates that it does not need to + * be scanned by kmemleak, but also implies MEMBLOCK_ALLOC_ACCESSIBLE + */ #define MEMBLOCK_ALLOC_ANYWHERE (~(phys_addr_t)0) #define MEMBLOCK_ALLOC_ACCESSIBLE 0 #define MEMBLOCK_ALLOC_NOLEAKTRACE 1 diff --git a/mm/mm_init.c b/mm/mm_init.c index 24b68b425afb..71b58f5f2492 100644 --- a/mm/mm_init.c +++ b/mm/mm_init.c @@ -1580,6 +1580,10 @@ static void __init free_area_init_core(struct pglist= _data *pgdat) } } =20 +/* + * Kmemleak will explicitly scan mem_map by traversing all valid `struct *= page`, + * so memblock does not need to be added to the scan list. + */ void __init *memmap_alloc(phys_addr_t size, phys_addr_t align, phys_addr_t min_addr, int nid, bool exact_nid) { @@ -1587,11 +1591,11 @@ void __init *memmap_alloc(phys_addr_t size, phys_ad= dr_t align, =20 if (exact_nid) ptr =3D memblock_alloc_exact_nid_raw(size, align, min_addr, - MEMBLOCK_ALLOC_ACCESSIBLE, + MEMBLOCK_ALLOC_NOLEAKTRACE, nid); else ptr =3D memblock_alloc_try_nid_raw(size, align, min_addr, - MEMBLOCK_ALLOC_ACCESSIBLE, + MEMBLOCK_ALLOC_NOLEAKTRACE, nid); =20 if (ptr && size > 0) diff --git a/mm/sparse-vmemmap.c b/mm/sparse-vmemmap.c index cec67c5f37d8..b6ac9b1d4ff7 100644 --- a/mm/sparse-vmemmap.c +++ b/mm/sparse-vmemmap.c @@ -27,25 +27,10 @@ #include #include #include - +#include "internal.h" #include #include =20 -/* - * Allocate a block of memory to be used to back the virtual memory map - * or to back the page tables that are used to create the mapping. - * Uses the main allocators if they are available, else bootmem. - */ - -static void * __ref __earlyonly_bootmem_alloc(int node, - unsigned long size, - unsigned long align, - unsigned long goal) -{ - return memblock_alloc_try_nid_raw(size, align, goal, - MEMBLOCK_ALLOC_ACCESSIBLE, node); -} - void * __meminit vmemmap_alloc_block(unsigned long size, int node) { /* If the main allocator is up use that, fallback to bootmem. */ @@ -66,8 +51,7 @@ void * __meminit vmemmap_alloc_block(unsigned long size, = int node) } return NULL; } else - return __earlyonly_bootmem_alloc(node, size, size, - __pa(MAX_DMA_ADDRESS)); + return memmap_alloc(size, size, __pa(MAX_DMA_ADDRESS), node, false); } =20 static void * __meminit altmap_alloc_block_buf(unsigned long size, --=20 2.25.1