From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pf1-f172.google.com (mail-pf1-f172.google.com [209.85.210.172]) (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 84F332FF16A for ; Wed, 24 Sep 2025 11:52:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.172 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758714750; cv=none; b=HNir1dW5c8ByWBSGrshbetsQoVnaTpvQhsmRGIb7++nSX2rz2i1YVHF2c4Mo32ZfyUvusi5CJaKiXjF98/8A8T1vj+7pZuRlqX8N5WqyxBGYpUawZNKBj9y3Xzmu0Sv6X4ZD/S6tS+6Xg84H4mLhibUBvhvJ/yDRZBYhc9j/G24= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758714750; c=relaxed/simple; bh=Sl2YI7Td/C9YkkJpnWkOlkyn4hvpDBvdNr6f7stAoSw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=gVA5/0nalCpmI/aNCFQQwbhX8NR9eoCfdAxuYxteagBymezZmnYOUWuqes0WK2R01yc2bxMyi2NwK4Lx0goFDcKhZVvnYai5VQMKdHsQvyqu3cN8fw705UCTtotBtV3L5EOVEF49WF3LgnQhetpve15LKFkNLgtuqvadRcn3d/w= 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=Mj6Q95gj; arc=none smtp.client-ip=209.85.210.172 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="Mj6Q95gj" Received: by mail-pf1-f172.google.com with SMTP id d2e1a72fcca58-77f67ba775aso1026961b3a.3 for ; Wed, 24 Sep 2025 04:52:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1758714743; x=1759319543; 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=sX4DcHmKN6k6jLli4BcDyPNAsEAGb3ORwL+dRbW7euA=; b=Mj6Q95gjxAqB/UIvJL2Fz+IYzT43o6YMhcDCVCSbrht7yJjT68f5u3uCByk4A6vFTE T2Ko4MZZsVu2RPY367DjLf4llHmY8+W1mvOQdf0d1d3hraa6sbKIS2a4nHdsPxU53pVn 9R/y3vVIjzAErY2K2ZsUJPnYkPvX0n1bvvBsCuiCVlUANIPmLDupyIjFrnQIeuQxMJIU +u1iiO0v6jyZT1gXrsbiU+8mz/oqndHSfhn3BjEMT4YJhBVhem21HdrLIVtJY2cSl3zi oTVapqQpwViatAsyYNX0Z0cKLvbu7fBI/R42wcsn+hIWLn0TP0BjraxLqjIRTOucLfdf U3JA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758714743; x=1759319543; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=sX4DcHmKN6k6jLli4BcDyPNAsEAGb3ORwL+dRbW7euA=; b=iLizxiR3/R3ZfMskDXqAPwMA7c5YTFdqW2l/u3hAsa9BwsBheLIDZMAuuqMMkUvizw xrggHsXKksIgAKvj/Ku/8gbg8W2YmvATXOgvFUodEttHv0abXko+WAEDAYs+qhD6+NAm 0GUY38TcyzIbt4AExxPNMWLBsk1Gj/xUkS8tqZbqetMzDulIJPC8TfoeioXV/mQQI+sQ H6rmXDmuCIFxm9vpE3y2gy3jpOhkSDBxX39Irdf2rp3i2eJUHvp3hKeqipEvfz6uIvSM JmTTIHi68tEwxMKqZmxNig06KD+LhPl3lYF3KRgzEgJKwuxaiAb2kWBtvJAVk7RaepZb GdTg== X-Forwarded-Encrypted: i=1; AJvYcCVnrS6CfnRJ2Vqeo52B4F1rslkui/ZCOGkYUdSEr+XWskcjKGGMRuuMFTG9NYwGOr4oy4qzODLHovY=@vger.kernel.org X-Gm-Message-State: AOJu0YyoX6aZ9yLsNOQywZ7/5Gigv2F7M7BFaeGPjr1w0fgIW7dksNhx jYwSJ28S5BgvKQAS1LgDqm5esA4WKhYGXq/OwW0iX07i2XiYKLdtI1Zu X-Gm-Gg: ASbGnctVFzliqPtCzrJWl4xK4T9PetrwtlDh/ZIdyRxmR/nfZK6JO8RDaOs7H6AKfRn 7wPkkXTVfvkx2QNJpAEtLbQKCr70IVegMeiFKuEVT32RPf8+bV3bSuDgvbxeaW0w8IIChFZm4bm 0xn9ConVYz61hAxB7vqKl4Id0ujDuJY7Sm6JG7gY6lJDQJEjHBk3EBw1dYVTaW/B1iYhyyjy8Cj XTrit2QVxRSFRAZnIt0JofGAvq4Bcf+E+7+8VgqoSTGsdTXdbnr50dQ3VrBHqbvkAdMKN7Yr2eK Py2Oo28JGQSsu9J3Pm+Y+wA2Hv6Tb3GkGyQaJIjzDvoFnEw/i78v5Xnbxwms+xTVCKzWPuHuJyT SduFHW3FhNKYXJsqwMBYbu+Z9Pw== X-Google-Smtp-Source: AGHT+IHM4OGfhR5oYYdpAC3Dd6EW1w7h66PDSvRIMWNc5YTjulef4dYL+e/NY4vhVJcodihdgSSIbA== X-Received: by 2002:a05:6a20:e292:b0:247:65a0:822 with SMTP id adf61e73a8af0-2cff1c61c0amr8760157637.40.1758714742579; Wed, 24 Sep 2025 04:52:22 -0700 (PDT) Received: from localhost ([23.142.224.65]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-b551518480asm14947563a12.28.2025.09.24.04.52.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 24 Sep 2025 04:52:21 -0700 (PDT) From: Jinchao Wang To: Andrew Morton , Masami Hiramatsu , Peter Zijlstra , Mike Rapoport , Alexander Potapenko , Randy Dunlap , Jonathan Corbet , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Juri Lelli , Vincent Guittot , Dietmar Eggemann , Steven Rostedt , Ben Segall , Mel Gorman , Valentin Schneider , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , "Liang, Kan" , David Hildenbrand , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Suren Baghdasaryan , Michal Hocko , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt , Kees Cook , Alice Ryhl , Sami Tolvanen , Miguel Ojeda , Masahiro Yamada , Rong Xu , Naveen N Rao , David Kaplan , Andrii Nakryiko , Jinjie Ruan , Nam Cao , workflows@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, linux-mm@kvack.org, llvm@lists.linux.dev, Andrey Ryabinin , Andrey Konovalov , Dmitry Vyukov , Vincenzo Frascino , kasan-dev@googlegroups.com, "David S. Miller" , Mathieu Desnoyers , linux-trace-kernel@vger.kernel.org Cc: Jinchao Wang Subject: [PATCH v5 13/23] mm/ksw: add per-task ctx tracking Date: Wed, 24 Sep 2025 19:50:56 +0800 Message-ID: <20250924115124.194940-14-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250924115124.194940-1-wangjinchao600@gmail.com> References: <20250924115124.194940-1-wangjinchao600@gmail.com> Precedence: bulk X-Mailing-List: workflows@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Each task tracks its depth, stack pointer, and generation. A watchpoint is enabled only when the configured depth is reached, and disabled on function exit. The context is reset when probes are disabled, generation changes, or exit depth becomes inconsistent. Duplicate arming on the same frame is skipped. Signed-off-by: Jinchao Wang --- mm/kstackwatch/stack.c | 67 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/mm/kstackwatch/stack.c b/mm/kstackwatch/stack.c index 9f59f41d954c..e596ef97222d 100644 --- a/mm/kstackwatch/stack.c +++ b/mm/kstackwatch/stack.c @@ -12,6 +12,53 @@ static struct kprobe entry_probe; static struct fprobe exit_probe; +static bool probe_enable; +static u16 probe_generation; + +static void ksw_reset_ctx(void) +{ + struct ksw_ctx *ctx = ¤t->ksw_ctx; + + if (ctx->wp) + ksw_watch_off(ctx->wp); + + ctx->wp = NULL; + ctx->sp = 0; + ctx->depth = 0; + ctx->generation = READ_ONCE(probe_generation); +} + +static bool ksw_stack_check_ctx(bool entry) +{ + struct ksw_ctx *ctx = ¤t->ksw_ctx; + u16 cur_enable = READ_ONCE(probe_enable); + u16 cur_generation = READ_ONCE(probe_generation); + u16 cur_depth, target_depth = ksw_get_config()->depth; + + if (!cur_enable) { + ksw_reset_ctx(); + return false; + } + + if (ctx->generation != cur_generation) + ksw_reset_ctx(); + + if (!entry && !ctx->depth) { + ksw_reset_ctx(); + return false; + } + + if (entry) + cur_depth = ctx->depth++; + else + cur_depth = --ctx->depth; + + if (cur_depth == target_depth) + return true; + else + return false; +} + static int ksw_stack_prepare_watch(struct pt_regs *regs, const struct ksw_config *config, ulong *watch_addr, u16 *watch_len) @@ -26,10 +73,22 @@ static void ksw_stack_entry_handler(struct kprobe *p, struct pt_regs *regs, unsigned long flags) { struct ksw_ctx *ctx = ¤t->ksw_ctx; + ulong stack_pointer; ulong watch_addr; u16 watch_len; int ret; + stack_pointer = kernel_stack_pointer(regs); + + /* + * triggered more than once, may be in a loop + */ + if (ctx->wp && ctx->sp == stack_pointer) + return; + + if (!ksw_stack_check_ctx(true)) + return; + ret = ksw_watch_get(&ctx->wp); if (ret) return; @@ -50,6 +109,7 @@ static void ksw_stack_entry_handler(struct kprobe *p, struct pt_regs *regs, return; } + ctx->sp = stack_pointer; } static void ksw_stack_exit_handler(struct fprobe *fp, unsigned long ip, @@ -58,6 +118,8 @@ static void ksw_stack_exit_handler(struct fprobe *fp, unsigned long ip, { struct ksw_ctx *ctx = ¤t->ksw_ctx; + if (!ksw_stack_check_ctx(false)) + return; if (ctx->wp) { ksw_watch_off(ctx->wp); @@ -92,11 +154,16 @@ int ksw_stack_init(void) return ret; } + WRITE_ONCE(probe_generation, READ_ONCE(probe_generation) + 1); + WRITE_ONCE(probe_enable, true); + return 0; } void ksw_stack_exit(void) { + WRITE_ONCE(probe_enable, false); + WRITE_ONCE(probe_generation, READ_ONCE(probe_generation) + 1); unregister_fprobe(&exit_probe); unregister_kprobe(&entry_probe); } -- 2.43.0