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 497572E173E for ; Thu, 9 Oct 2025 10:57:59 +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=1760007482; cv=none; b=l2+QKoqgZWZ9nFaKEc0aQAlgvqttXjA5SxuMdTYH5MLb6LV3ISKAM/+QOE+y6U1iL+vfJezBd2MUOlzVGOMLR2nXSGiXBmKS3i8LXm5nSqhrZY48CL5AO6hiGkDsmQRc/PyXob+g+fdyf+HYaw6j6H6LZyRFWH7kBwaXS6+zpjg= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760007482; c=relaxed/simple; bh=Sl2YI7Td/C9YkkJpnWkOlkyn4hvpDBvdNr6f7stAoSw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Jsu3QnT/s4hKV0LEF7F6bMtwVMTE9sXNJIOfOtEC5dhDJak+4O/d9TIDkJ2D921RtfgJ2i9AUhmxS+t5M8IpaihKWZA2EsEQ69L2dITt/qrUp8GC0SX1xZbVP1iGQCfL88OxQIXmh3/6GxLifF83Bk9XIj+2OGhSPeEaCm+J9tg= 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=h+0aYUmk; arc=none smtp.client-ip=209.85.214.178 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="h+0aYUmk" Received: by mail-pl1-f178.google.com with SMTP id d9443c01a7336-2681660d604so9885215ad.0 for ; Thu, 09 Oct 2025 03:57:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1760007479; x=1760612279; darn=lists.linux.dev; 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=h+0aYUmk85f/P8k4vVB/xi9zbADa3h971xNGrxFkaRvUaVZFaUgdcfjNdgT7MLHvOu 6W8pu3XiE9pJzw+qoQ1OX+vn/2iJmSRM+BJq/bzcfOPmKVpIaVnnlxxlWpXFo+NBJDrY 22mCOH7Rwp9Evoci9h4ZHrMHkgBfLQwjokYRH8oBhrDyBqE8h1AUbbh6qJvU8PQozKYd o6PhtPGrY6DYo3y7QqHP7iUANoxMUsSf+S17xGCc/OfZVgozyodyajTEIVmpBQiWbV2v XAJZF6+CKXYMHnfTMnVJOouwzpat5MwbYszJJFRVJcDYUm4Tp0esyqKCg0mUkHpRJx22 8DZQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1760007479; x=1760612279; 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=i6bw3og0QGFk29imU409yelFtqthbnot9zw1y7lXJDMlgi4wYiV4lTUwX5nWE0zE6q vusF/qLfe8XpQwXlHH093WpoHj9OCBe9S5oMwSMsMW3sj0dnn/iFjTTZLNEDnZ+tAkVy l839kVu9ozihmKuuyP+hIc2XiFUCw3cdZFRM3wMvv/SGYSQQRgAj6CIkjc83XH+tjUek mgwhTsnDX8Wo1fIl842ZrGCRQ/xu4VkyDYPo9uJoKW9JVfhxu/jvfgDDmsr8c2kSxgii JUx5BhRVS9+wA5OKC64XQN2s6RcH058QAZP0kCSe6ThVKbuUQl0tlz++4cwAXkSoN3W0 B3fQ== X-Forwarded-Encrypted: i=1; AJvYcCU4gnrUa5L6ArUvd7dAGhm67QvhXU9hvSxk6D1ZtcuSRDIGeOfr1Ch1fmXQc2Pn3s/EaVpy@lists.linux.dev X-Gm-Message-State: AOJu0YxzH3Ec6Ntwp83NjpQT84IbZdMJC7nkHPY5R73SwhUtS4FUIpZL YW/fHXntqnkqv3Jf6tDkz27ZNitSciTu0NdhFI0TRXkAnl12cz5+9I8K X-Gm-Gg: ASbGncu6ikRMxfiFqVDrbwV69TGOJyB3OZtrUdO3U7xazn9hzuYS/OOMyM073ji3dqi GUGm12SHajoQI0SwMurr5LeXLpSp6fMfZ9i+LuxqEK+Uc7L9YHp9nTCM2DjvDfFU9uXdBMh07KR 9gTWEles3WpllBSKjG/IfXf7uuJA+uR0D3d9IZ9YGCWDsKv6VVrdORbnNmVpWqxqiD3FG7tYSno V0PXjmDUfxP+QeZK9Fg6QD9BrhaW1COckrSBooZiGlHTwJkCm++VP4MgOez3yXPmqbNPEg6Q3uQ zMUv3sCiDwEuffkt1/R/q5SFIF6mD9DVdq8pbgNtQ1TXUW7AQytVMpQkWwvLjqfC8RrzRLRjAV3 3DcR+NtoUFE6jMJgvLqJXHxtjZZdTNiZ8u/kfh4S7oS9yFpvlA0DTGtq5/XZ3 X-Google-Smtp-Source: AGHT+IG5Zi/tUWgv5fo5AJbJybfMI2YP3J2uv0Uwa+Uo4jUypcFGg1/JcKwmQEdKeq8TaIbn+u9v/A== X-Received: by 2002:a17:903:2a87:b0:24a:d213:9e74 with SMTP id d9443c01a7336-290272dfbb7mr102338975ad.49.1760007479177; Thu, 09 Oct 2025 03:57:59 -0700 (PDT) Received: from localhost ([45.142.165.62]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-29034f36408sm24973055ad.91.2025.10.09.03.57.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 09 Oct 2025 03:57:58 -0700 (PDT) From: Jinchao Wang To: Andrew Morton , Masami Hiramatsu , Peter Zijlstra , Mike Rapoport , Alexander Potapenko , Randy Dunlap , Marco Elver , 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 v7 13/23] mm/ksw: add per-task ctx tracking Date: Thu, 9 Oct 2025 18:55:49 +0800 Message-ID: <20251009105650.168917-14-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251009105650.168917-1-wangjinchao600@gmail.com> References: <20251009105650.168917-1-wangjinchao600@gmail.com> Precedence: bulk X-Mailing-List: llvm@lists.linux.dev 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