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 7EF2830B50A for ; Mon, 15 Jun 2026 17:49:38 +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=1781545779; cv=none; b=dD+GotEYke4iUG/n34BvrgsNVWRhgG3s8oEHBwiSTEDtPYU9SilO/Kxcce36cJqb72Trl3Gaa4ypO6lm+H3JzJ5bA888zZjS64LK/a1rpyu+/CjkxnOBqSykoXp4Vd52rLlpT3PFzIuiSBbRzvWTKqKijQtXLAPI3Ssx5fY+NQM= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781545779; c=relaxed/simple; bh=sqaUBTnZNMsv3vx7Sjp6Vs9eiiNdreGgJEsQp6/ksxI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=lE6b//yTy+uWVT91SdwlL9uW10nfPDzgbu7ys5/m5DHAssW2iWAisqgMN51FH97oPOuXAcl92EtjkhAZe2/L0oA3cmDbd038RlHYPt73Z6CCEhD0Zn1s9bAuH/biuyZ1prGz8UWy1476YfQPchHMGn7hnsd4uneftxS9x9f+Za4= 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=jaA+QntH; 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="jaA+QntH" 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=XZ/ULChXuvaYI5jTaq4pmMF7zynuPHqKsRkGa8dx8n8=; b=jaA+QntHZm5MfNg/+qKILlFJJv xoWCNmmeqtaHm9E3kkZiFc7j/0ZotZ7L3g5zRY7HGJ1WsQOJMKAQ+vD835J9FCW81kNa3CBKBg3Q4 ikoVCiEZwjX2Kua+Yyhjwl7Ub6FAcy3NCW8Qvf/D6h0E+meBAIxv3R/K74M8nQX8RfewDmUZx0PO8 N3t4OeTyslgOycqTlS76GFDJFdMV0A+4WHoZ6rvfS+xQZEqscrpU8cF8b9F/QyVVFm52UI+HTyVZr jIUBw6gf3ynGokQWawWs81Jk50C0mehFy6W7XFDu4Ct2rgl/syOItv4FdDczV3X36rshgvMuSE4y4 tRJaouww==; 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 1wZBRC-00DFKF-2t; Mon, 15 Jun 2026 17:49:31 +0000 From: Breno Leitao Date: Mon, 15 Jun 2026 10:49:07 -0700 Subject: [PATCH v3 2/3] mm/kmemleak: stop the task stack scan early when interrupted 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-2-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=2431; i=leitao@debian.org; h=from:subject:message-id; bh=sqaUBTnZNMsv3vx7Sjp6Vs9eiiNdreGgJEsQp6/ksxI=; b=owEBbQKS/ZANAwAIATWjk5/8eHdtAcsmYgBqMDseGKfhJs2wd5Cm04HXffp4lYtYcdmwHYFD4 QhtzBCVg12JAjMEAAEIAB0WIQSshTmm6PRnAspKQ5s1o5Of/Hh3bQUCajA7HgAKCRA1o5Of/Hh3 bRjZD/wLjn2Ef9zo6pPt0HgnJWBa0m0FYQhcklv3qnH4VjYc0KP4zOeTTUqlLp9tgbeFEtg64Kd tCDdhqx4kTshPeWYVl7gpcMxj5o1lsRTHlV9TOyrysTF0KOY9otJ0nkKOfWEZdk7xDetVRFfTN6 iW772b17g6K0S0bCNIlV7B7RawNcL2DQo6guH7rUy/ZBptUig0gGsiE4vAoOJQfzWU3v4Q3JiH4 myuxG8I+t8e1QrxD5R+1Z9DlLGex2bwz68oXRLfAkWF5bWUxYW29SNJuyShB14sQamMlRIiWqOG whSIJPUIFxJJUXH0tD2IZQXVOE2m9u6lCUm7fpCSpUDYTk0G6wkG7sNdXuLcmEf4oNT6Pl4x0GY Lu+XrM+a7dspc6yx40AG/mDR+8Hpf8lro0s259BY+xHILU6IgKkpfU79HSJLB3/zgmFX+HEigt0 RZxw9iZiHa23Yeh/t/rdIX6jGhQMS3lg/c9vbg7xbY3sdIxrNg5aA4Ms2e6ddegLJYNRwTxdoZ3 tidJi/hDJPRH9iFZH3Ng7xhFMrT0H2NTpn/GWfVhAhLGBR/QsfbHgW06rH4UQ2gMlwTWgVW4Mjb zQCX3P0WtNJHSHn+2ToslU4hsqg5P1ahGW/FTOAdANdNmwPXzhl//qmvTnNu5l4+dDBJ2kpn8nz ldUs8Wz9ubM3p3Q== X-Developer-Key: i=leitao@debian.org; a=openpgp; fpr=AC8539A6E8F46702CA4A439B35A3939FFC78776D X-Debian-User: leitao scan_block() already checks scan_should_stop() for every pointer and bails out of the current block, but the task stack walk cannot tell and keeps issuing a separate scan_should_stop() between every task. Return that status from scan_block() and use it as the task stack loop condition, so the walk stops as soon as a scan is interrupted. Suggested-by: Catalin Marinas Signed-off-by: Breno Leitao --- mm/kmemleak.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/mm/kmemleak.c b/mm/kmemleak.c index a7786b6bc174e..916af7cecb3b4 100644 --- a/mm/kmemleak.c +++ b/mm/kmemleak.c @@ -1524,22 +1524,25 @@ static int scan_should_stop(void) /* * Scan a memory block (exclusive range) for valid pointers and add those - * found to the gray list. + * found to the gray list. Return non-zero if the scan was interrupted. */ -static void scan_block(void *_start, void *_end, - struct kmemleak_object *scanned) +static int scan_block(void *_start, void *_end, + struct kmemleak_object *scanned) { unsigned long *ptr; unsigned long *start = PTR_ALIGN(_start, BYTES_PER_POINTER); unsigned long *end = _end - (BYTES_PER_POINTER - 1); unsigned long flags; + int stop = 0; raw_spin_lock_irqsave(&kmemleak_lock, flags); for (ptr = start; ptr < end; ptr++) { unsigned long pointer; - if (scan_should_stop()) + if (scan_should_stop()) { + stop = 1; break; + } kasan_disable_current(); pointer = *(unsigned long *)kasan_reset_tag((void *)ptr); @@ -1549,6 +1552,8 @@ static void scan_block(void *_start, void *_end, pointer_update_refs(scanned, pointer, OBJECT_PERCPU); } raw_spin_unlock_irqrestore(&kmemleak_lock, flags); + + return stop; } /* @@ -1704,6 +1709,7 @@ static void kmemleak_scan_task_stacks(void) { struct pid *pid; int nr = 1; + int stop = 0; do { struct task_struct *p = NULL; @@ -1722,13 +1728,13 @@ static void kmemleak_scan_task_stacks(void) void *stack = try_get_task_stack(p); if (stack) { - scan_block(stack, stack + THREAD_SIZE, NULL); + stop = scan_block(stack, stack + THREAD_SIZE, NULL); put_task_stack(p); } put_task_struct(p); } cond_resched(); - } while (pid && !scan_should_stop()); + } while (pid && !stop); } /* -- 2.53.0-Meta