From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from stravinsky.debian.org (stravinsky.debian.org [82.195.75.108]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5BA3E2EA171 for ; Mon, 15 Jun 2026 17:49:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=82.195.75.108 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781545790; cv=none; b=M65uDjXjOnKpEJHIoYfiSWNnsLCcnr7pTkjav+610IfLc+18YUi0p4vQqPxEq3fbp8l5WwSiBAOgCIuin1LfwCtIhwh+1lbrCnHMPktDYoUTMGHcby4aObbGcaztW6sShhMJYH5YhaIBrUyn/ddFrkbL/CEsSbJc5NSToUFHqJw= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781545790; c=relaxed/simple; bh=IWWc7F80a2JeCYOLSHoju45jzWrrC9mdOD0aEKR83G0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=YdZVnLrXA+SJAyOmPCZ82fgWUINTLv3Bpr4gq3qShP7gGW/BDzDUZ3OGX6h5DqPaTX2VKrEZyA1wDRlM7uLTOYApXt2v6Y4lZcIC7C/ugX3s5tUBjQ+EsgYnAZv80MdjapX5weNvpWc8igaOyTlOyayHGGLzAUx4ZPUcoJkpZDo= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=debian.org; spf=pass smtp.mailfrom=debian.org; dkim=pass (2048-bit key) header.d=debian.org header.i=@debian.org header.b=O9eTOjm/; arc=none smtp.client-ip=82.195.75.108 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=debian.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=debian.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=debian.org header.i=@debian.org header.b="O9eTOjm/" DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=debian.org; s=smtpauto.stravinsky; h=X-Debian-User:Cc:To:In-Reply-To:References: Message-Id:Content-Transfer-Encoding:Content-Type:MIME-Version:Subject:Date: From:Reply-To:Content-ID:Content-Description; bh=wCa02FL3lh6zuqD0+BOxEhv7Kc0e7142ZOHDkN6ScQQ=; b=O9eTOjm/FRFvkcbNAlEGaT4wLK L3LG7EKJr2tytkxP3RsotZEHWWj/KmE6kWmGBAhcEoCZ0FnB8o5HxGjgGc+gIMTDk1hSEy4nUWmVH OWQhxEuWvM7x75OrlNhp9oI92yn7vTCGWxGAnn8zeqV+hb8XE3PF/DL5Qb/JTaLtCA9d1h4YDGSpk BFDsPr2M1c+Glkoch7+85cymCgfd68ugAUiBq5CHVE9J10gsQdSJH2n2VmLzDI3MRrcD5ohGvhaEU ee5rsZ9nxptvhB1lJGFFys61PVEtRjNaTj7VtTbCXK30/q+JrJwKJ+KmPVPFm4HluiOdldJv7308d s8Xrk/kQ==; Received: from authenticated-user by stravinsky.debian.org with esmtpsa (TLS1.3:ECDHE_X25519__RSA_PSS_RSAE_SHA256__AES_256_GCM:256) (Exim 4.96) (envelope-from ) id 1wZBRG-00DFKc-2S; Mon, 15 Jun 2026 17:49:35 +0000 From: Breno Leitao Date: Mon, 15 Jun 2026 10:49:08 -0700 Subject: [PATCH v3 3/3] mm/kmemleak: stop the per-cpu and struct page scans early too 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: 7bit Message-Id: <20260615-kmemleak-stack-resched-v3-3-acecd7d7fd92@debian.org> References: <20260615-kmemleak-stack-resched-v3-0-acecd7d7fd92@debian.org> In-Reply-To: <20260615-kmemleak-stack-resched-v3-0-acecd7d7fd92@debian.org> To: Catalin Marinas , Andrew Morton , lance.yang@linux.dev, Davidlohr Bueso , Oleg Nesterov , Qian Cai Cc: oleg@redhat.com, sj@kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, Breno Leitao , kernel-team@meta.com X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=2310; i=leitao@debian.org; h=from:subject:message-id; bh=IWWc7F80a2JeCYOLSHoju45jzWrrC9mdOD0aEKR83G0=; b=owEBbQKS/ZANAwAIATWjk5/8eHdtAcsmYgBqMDseW0U7mXC+0BOyLYVkgluP/FcmINThzsfhF h9oBu/t06CJAjMEAAEIAB0WIQSshTmm6PRnAspKQ5s1o5Of/Hh3bQUCajA7HgAKCRA1o5Of/Hh3 bd0eEACQRudDOuvINcugm1IUgJDcHRSMompJ+TKpGIAgeaxGcuPaAvpT3SZBJ+yb9XwfJGIdqeU s06CwF0Ja//lufYtpht6cU69XBMut8KVkK0dLdtGBMKA8yHiul94r67CdvJydjZaiFp5fcXH2rn /IfggSngDSD3rg0HHqO/+5yB/mUVPGMo5QanRBOnk6Vn6pNXLfx6k4mG5d7ktdzof3kM1PuACeD 0kNJWl32KdCCBqoCd0jvGK9lTnXzmq8VMT5o9JrqrXJ4z8dX0MWg3aTZucRMF33LTbZDg0mxpYM H3q6OBGgSTtJNfJOAhYuOmSXUJA5NpbaJUiGMg6/ASZdUV64XcZpGeT2UwjkQlcX+i2Nu0I8qyf EuntCcBRp7wxNDtRBL0KP3g0HC7K9swqJTIUC40MH9W3sW+4N/OG/OnGdC7EkQ34ekCUzSySW40 2fSj6go4lxYaqb5SPgh5cZfO5MG2sU7XnxjJWOneD/mrUG+K5J9zGsSApzHfg4BffmVP6iquaZi Oln2iktJxEqCTMHX94sZXAeUeQJxzJ24VADNdaKNYeQ0P12P+tD3zx4gI+Ad4K4deBgr0Mbza8y sGnXywXFilc54Tu8Ba3a5N3VFkzQnS+4PRDqEWLCXit3wHrKn+3AeE4kdJzYgEXIPbY9xmfuWuU 6WdXfPZ75NxxvYg== X-Developer-Key: i=leitao@debian.org; a=openpgp; fpr=AC8539A6E8F46702CA4A439B35A3939FFC78776D X-Debian-User: leitao The per-cpu and struct page scan loops have no reschedule-stop check of their own: once a scan is interrupted they keep calling scan_block() for every remaining block, which scans nothing useful. Propagate scan_block()'s interrupted status through scan_large_block() and break both loops as soon as it is set. Suggested-by: Catalin Marinas Signed-off-by: Breno Leitao --- mm/kmemleak.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/mm/kmemleak.c b/mm/kmemleak.c index 916af7cecb3b4..7fa7124727e36 100644 --- a/mm/kmemleak.c +++ b/mm/kmemleak.c @@ -1558,18 +1558,22 @@ static int scan_block(void *_start, void *_end, /* * Scan a large memory block in MAX_SCAN_SIZE chunks to reduce the latency. + * Return non-zero if the scan was interrupted. */ #ifdef CONFIG_SMP -static void scan_large_block(void *start, void *end) +static int scan_large_block(void *start, void *end) { void *next; while (start < end) { next = min(start + MAX_SCAN_SIZE, end); - scan_block(start, next, NULL); + if (scan_block(start, next, NULL)) + return 1; start = next; cond_resched(); } + + return 0; } #endif @@ -1889,9 +1893,11 @@ static void kmemleak_scan(void) #ifdef CONFIG_SMP /* per-cpu sections scanning */ - for_each_possible_cpu(i) - scan_large_block(__per_cpu_start + per_cpu_offset(i), - __per_cpu_end + per_cpu_offset(i)); + for_each_possible_cpu(i) { + if (scan_large_block(__per_cpu_start + per_cpu_offset(i), + __per_cpu_end + per_cpu_offset(i))) + break; + } #endif /* @@ -1902,6 +1908,7 @@ static void kmemleak_scan(void) unsigned long start_pfn = zone->zone_start_pfn; unsigned long end_pfn = zone_end_pfn(zone); unsigned long pfn; + int stop = 0; for (pfn = start_pfn; pfn < end_pfn; pfn++) { struct page *page = pfn_to_online_page(pfn); @@ -1918,8 +1925,12 @@ static void kmemleak_scan(void) /* only scan if page is in use */ if (page_count(page) == 0) continue; - scan_block(page, page + 1, NULL); + stop = scan_block(page, page + 1, NULL); + if (stop) + break; } + if (stop) + break; } put_online_mems(); -- 2.53.0-Meta