From nobody Thu Oct 2 01:01:41 2025 Received: from mail-pf1-f173.google.com (mail-pf1-f173.google.com [209.85.210.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 30C7D221287 for ; Tue, 30 Sep 2025 02:44:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759200264; cv=none; b=qVGoMmRmWEXySSDHy5FthM+TXlGDyHAMuLQsIBUoblAKQ5jcNFla8XGzi+WJtYKIvyST2ILDEWdUIhxYIopCvWWD3y5lpc2fGfI1dP1K7Dp6Or4e+JBSZtRT/7TwjwTMGEoiaScrKXpQP9FcvBInLe8i6ra8CKzaiqnAmQXR85Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759200264; c=relaxed/simple; bh=X7rbGcP88vwI8LXFWSyD4f0KAHbEZ/JYDGwMupozUWE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ejOZziOFAXl6IG1UOylKzzZEIhXdclNNb5anqODt29DQmOK7mX+3X43lpovm/p0C9nFkoqxcG8/UNeO2zKFk+E5ZaI/y1Uv5NFOK1z2qPdzCXJBmOQLANvsq7/6OIs1qF7nMxQSoXlYc+GIplDsLfq2y1eAeS++twySbG6cWoWc= 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=KeJt5d7Y; arc=none smtp.client-ip=209.85.210.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="KeJt5d7Y" Received: by mail-pf1-f173.google.com with SMTP id d2e1a72fcca58-780292fcf62so4127742b3a.0 for ; Mon, 29 Sep 2025 19:44:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1759200261; x=1759805061; 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=kk8QwiK6ueKhbPm+iybiDp/pMjWX1cNh1XEGnvIxiQI=; b=KeJt5d7YQHTtod6U/F/uhXMU+UAO32Olm4ehcjTSCHM13bS+qwDkXRnYwnsazo0eIS MlMv7Uu9XQOqHbT8SvqdPbC2YUGgl/BrRUvz4FydmM1o8+DCGiyQh4daDb3Qgdxv6Zgv odWRu9/2i3NQQqsxbk+cIf4NizpdIYGjrhE08Vv2yK8h5zYrAhpJAgAciE/mRcexP4D5 5p6k+3MgD6aHPOb32UkXrjspkmEDUPS1z/6H5wVd6l4YfdgrksdsfALUOqz5oDXSDmvR EJF5Ny7BzZsanTQ6IQ82nqUNRPwXnV+2AzB1XMJj4M49mIFaAWCGo0Kuvo+IyKGI1NOs iqjw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1759200261; x=1759805061; 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=kk8QwiK6ueKhbPm+iybiDp/pMjWX1cNh1XEGnvIxiQI=; b=EDac8krhfjGIuomxk64Y+7aMgkMvAdkwFPlt+x/X9/9uErVJ0bws8F6rYD/xDcz2n5 PxpF/2Z091a5ZBaNKu3H7pojaaGG7qKDyYqgerhlxtZnC/IGx2cV2Y21C3wtkkvUlQA4 BnzCsPKhxm50rOzD7BCvLJ3EWH9I6pReWNU9c/w70bK90pVR5BXoKKaQB8aDlgRSRXxn SEysOC4X4mXFEzwEZY8NPiWUYS64VgsASKp/Y1SdqXbnUYKMYsyXHK2GYyOJmG3A2Am/ bqCETofXQwbReegEqGZAxYd0Smyo/lk3ycqhrMv7Mr4A779Ywe8a627uRPuv0ghgOjgB KaSg== X-Forwarded-Encrypted: i=1; AJvYcCU6pEsNzFIVc+RwhlWOUKqgpaUL5VtryEqkD8HPBFjEoWVTOKk/VpsvBmGrIaZj8XlCMdGOJSuBOFVYXOI=@vger.kernel.org X-Gm-Message-State: AOJu0Yy+NJ23L6F7fDbCN4zJtNHTxYQpUyUS6rTYO5Ho2gjHWFpPDsQb DlyO7RlwHcWQHjGoMMsi9JCrgcNsJH2RuLWCrMwq0e0jwchMuutcORSC X-Gm-Gg: ASbGncslkmwerfcStNGnSxvsckuorRcdtrufu7nV5TE7SbsFGjrigOEuu58qHOna9ok Av5fizl5gT+SXrW0MlBkGSryn8FHBfvNvOqdaPWfWl34l8BtNlxsd4agM8xkc6gQqGkWscfnR6L b+F/pLdrxRZZmu9jYmNEm/c35zS/Ja9OZ6uIwniTmZyBM0ZDNYsuyzclbSAomkB3sYwTGfh9qOA OlOiwJp665EdGDyp7f+g4t3cCvBI6En4IHaQ4rb9hsmAVCB66FYtq1J8TvGuH7jUYrJy6MZoZdL fQht5VEVzDC8YdzzSSNziYaPmlUMKT4YjcZfS2C7hVvh8Fj/sNoOfDDA6HfZlZZaODPqAC5QMBk i3WuC3tGcsCLHg6mXsR/n0BeykjRVngXll/Lq7YGLI59SpsVQLTBp/CERc8XLseAGuasJ56OGp7 Is X-Google-Smtp-Source: AGHT+IEDrnXJljikPuqSeJPSpakmRAqAzuYiiAGD50MQ2/K4+bFVhmBDij8ZHMPdqyP96BrQHK5sAg== X-Received: by 2002:a05:6a20:e29:b0:2ea:41f1:d53a with SMTP id adf61e73a8af0-2ea41f1d8femr15753456637.41.1759200261084; Mon, 29 Sep 2025 19:44:21 -0700 (PDT) Received: from localhost ([45.142.167.196]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-b57c55a0ef3sm12386161a12.37.2025.09.29.19.44.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Sep 2025 19:44:20 -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 v6 01/23] x86/hw_breakpoint: Unify breakpoint install/uninstall Date: Tue, 30 Sep 2025 10:43:22 +0800 Message-ID: <20250930024402.1043776-2-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250930024402.1043776-1-wangjinchao600@gmail.com> References: <20250930024402.1043776-1-wangjinchao600@gmail.com> 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" Consolidate breakpoint management to reduce code duplication. The diffstat was misleading, so the stripped code size is compared instead. After refactoring, it is reduced from 11976 bytes to 11448 bytes on my x86_64 system built with clang. This also makes it easier to introduce arch_reinstall_hw_breakpoint(). In addition, including linux/types.h to fix a missing build dependency. Signed-off-by: Jinchao Wang Reviewed-by: Masami Hiramatsu (Google) --- arch/x86/include/asm/hw_breakpoint.h | 6 ++ arch/x86/kernel/hw_breakpoint.c | 141 +++++++++++++++------------ 2 files changed, 84 insertions(+), 63 deletions(-) diff --git a/arch/x86/include/asm/hw_breakpoint.h b/arch/x86/include/asm/hw= _breakpoint.h index 0bc931cd0698..aa6adac6c3a2 100644 --- a/arch/x86/include/asm/hw_breakpoint.h +++ b/arch/x86/include/asm/hw_breakpoint.h @@ -5,6 +5,7 @@ #include =20 #define __ARCH_HW_BREAKPOINT_H +#include =20 /* * The name should probably be something dealt in @@ -18,6 +19,11 @@ struct arch_hw_breakpoint { u8 type; }; =20 +enum bp_slot_action { + BP_SLOT_ACTION_INSTALL, + BP_SLOT_ACTION_UNINSTALL, +}; + #include #include #include diff --git a/arch/x86/kernel/hw_breakpoint.c b/arch/x86/kernel/hw_breakpoin= t.c index b01644c949b2..3658ace4bd8d 100644 --- a/arch/x86/kernel/hw_breakpoint.c +++ b/arch/x86/kernel/hw_breakpoint.c @@ -48,7 +48,6 @@ static DEFINE_PER_CPU(unsigned long, cpu_debugreg[HBP_NUM= ]); */ static DEFINE_PER_CPU(struct perf_event *, bp_per_reg[HBP_NUM]); =20 - static inline unsigned long __encode_dr7(int drnum, unsigned int len, unsigned int type) { @@ -85,96 +84,112 @@ int decode_dr7(unsigned long dr7, int bpnum, unsigned = *len, unsigned *type) } =20 /* - * Install a perf counter breakpoint. - * - * We seek a free debug address register and use it for this - * breakpoint. Eventually we enable it in the debug control register. - * - * Atomic: we hold the counter->ctx->lock and we only handle variables - * and registers local to this cpu. + * We seek a slot and change it or keep it based on the action. + * Returns slot number on success, negative error on failure. + * Must be called with IRQs disabled. */ -int arch_install_hw_breakpoint(struct perf_event *bp) +static int manage_bp_slot(struct perf_event *bp, enum bp_slot_action actio= n) { - struct arch_hw_breakpoint *info =3D counter_arch_bp(bp); - unsigned long *dr7; - int i; - - lockdep_assert_irqs_disabled(); + struct perf_event *old_bp; + struct perf_event *new_bp; + int slot; + + switch (action) { + case BP_SLOT_ACTION_INSTALL: + old_bp =3D NULL; + new_bp =3D bp; + break; + case BP_SLOT_ACTION_UNINSTALL: + old_bp =3D bp; + new_bp =3D NULL; + break; + default: + return -EINVAL; + } =20 - for (i =3D 0; i < HBP_NUM; i++) { - struct perf_event **slot =3D this_cpu_ptr(&bp_per_reg[i]); + for (slot =3D 0; slot < HBP_NUM; slot++) { + struct perf_event **curr =3D this_cpu_ptr(&bp_per_reg[slot]); =20 - if (!*slot) { - *slot =3D bp; - break; + if (*curr =3D=3D old_bp) { + *curr =3D new_bp; + return slot; } } =20 - if (WARN_ONCE(i =3D=3D HBP_NUM, "Can't find any breakpoint slot")) - return -EBUSY; + if (old_bp) { + WARN_ONCE(1, "Can't find matching breakpoint slot"); + return -EINVAL; + } + + WARN_ONCE(1, "No free breakpoint slots"); + return -EBUSY; +} + +static void setup_hwbp(struct arch_hw_breakpoint *info, int slot, bool ena= ble) +{ + unsigned long dr7; =20 - set_debugreg(info->address, i); - __this_cpu_write(cpu_debugreg[i], info->address); + set_debugreg(info->address, slot); + __this_cpu_write(cpu_debugreg[slot], info->address); =20 - dr7 =3D this_cpu_ptr(&cpu_dr7); - *dr7 |=3D encode_dr7(i, info->len, info->type); + dr7 =3D this_cpu_read(cpu_dr7); + if (enable) + dr7 |=3D encode_dr7(slot, info->len, info->type); + else + dr7 &=3D ~__encode_dr7(slot, info->len, info->type); =20 /* - * Ensure we first write cpu_dr7 before we set the DR7 register. - * This ensures an NMI never see cpu_dr7 0 when DR7 is not. + * Enabling: + * Ensure we first write cpu_dr7 before we set the DR7 register. + * This ensures an NMI never see cpu_dr7 0 when DR7 is not. */ + if (enable) + this_cpu_write(cpu_dr7, dr7); + barrier(); =20 - set_debugreg(*dr7, 7); + set_debugreg(dr7, 7); + if (info->mask) - amd_set_dr_addr_mask(info->mask, i); + amd_set_dr_addr_mask(enable ? info->mask : 0, slot); =20 - return 0; + /* + * Disabling: + * Ensure the write to cpu_dr7 is after we've set the DR7 register. + * This ensures an NMI never see cpu_dr7 0 when DR7 is not. + */ + if (!enable) + this_cpu_write(cpu_dr7, dr7); } =20 /* - * Uninstall the breakpoint contained in the given counter. - * - * First we search the debug address register it uses and then we disable - * it. - * - * Atomic: we hold the counter->ctx->lock and we only handle variables - * and registers local to this cpu. + * find suitable breakpoint slot and set it up based on the action */ -void arch_uninstall_hw_breakpoint(struct perf_event *bp) +static int arch_manage_bp(struct perf_event *bp, enum bp_slot_action actio= n) { - struct arch_hw_breakpoint *info =3D counter_arch_bp(bp); - unsigned long dr7; - int i; + struct arch_hw_breakpoint *info; + int slot; =20 lockdep_assert_irqs_disabled(); =20 - for (i =3D 0; i < HBP_NUM; i++) { - struct perf_event **slot =3D this_cpu_ptr(&bp_per_reg[i]); - - if (*slot =3D=3D bp) { - *slot =3D NULL; - break; - } - } - - if (WARN_ONCE(i =3D=3D HBP_NUM, "Can't find any breakpoint slot")) - return; + slot =3D manage_bp_slot(bp, action); + if (slot < 0) + return slot; =20 - dr7 =3D this_cpu_read(cpu_dr7); - dr7 &=3D ~__encode_dr7(i, info->len, info->type); + info =3D counter_arch_bp(bp); + setup_hwbp(info, slot, action !=3D BP_SLOT_ACTION_UNINSTALL); =20 - set_debugreg(dr7, 7); - if (info->mask) - amd_set_dr_addr_mask(0, i); + return 0; +} =20 - /* - * Ensure the write to cpu_dr7 is after we've set the DR7 register. - * This ensures an NMI never see cpu_dr7 0 when DR7 is not. - */ - barrier(); +int arch_install_hw_breakpoint(struct perf_event *bp) +{ + return arch_manage_bp(bp, BP_SLOT_ACTION_INSTALL); +} =20 - this_cpu_write(cpu_dr7, dr7); +void arch_uninstall_hw_breakpoint(struct perf_event *bp) +{ + arch_manage_bp(bp, BP_SLOT_ACTION_UNINSTALL); } =20 static int arch_bp_generic_len(int x86_len) --=20 2.43.0 From nobody Thu Oct 2 01:01:41 2025 Received: from mail-pg1-f172.google.com (mail-pg1-f172.google.com [209.85.215.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 5C7A522B8B5 for ; Tue, 30 Sep 2025 02:44:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759200270; cv=none; b=O2aY3QNq57NBso1FG9dZLLiQWyXZ5RVGuXbFIuLsgE0Yu29tqpMVTQF2/HboybTRHFupPj0qEl5z6Yhw1TgxL3fiGlDoPMpxluMGpXP9IoftP12xM2RauckqO8SstgDoZUoXIRgMdOnkDOQU0UCG9zSARjB1suDDc+yVxy2YKRE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759200270; c=relaxed/simple; bh=ZEq5LCeeZxdZtY+a+kvZMIoWs2Mzj+sOmq7f1LtT1gE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=mXuzbvDEhb21yIlY6XLkuCpuc0HRtusqiGMH4/dHxSiLU4A2Qu2acGDlBT03n7oL+Vrs9YBnQhPaNjsS2cydXWjquvChV7UpE0VKkpMERVzX34S8Vu89Y6U7qoMtk1cCBJl4CTI8keYKohF/fNsPiCa4xfv04njjoi/w5mUoQ/I= 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=VkGzb5LE; arc=none smtp.client-ip=209.85.215.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="VkGzb5LE" Received: by mail-pg1-f172.google.com with SMTP id 41be03b00d2f7-b57bf560703so4017930a12.2 for ; Mon, 29 Sep 2025 19:44:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1759200268; x=1759805068; 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=bd/jIJYyk1G6SYf0mNQVLBMDX4oiGoErfqkyMXn4+LQ=; b=VkGzb5LEGvJKRN7Y2WFRHu+8I5VpCaY44IwkBES6oVgTVZAE6McrKnwgK4mKF90wcD NQRNmK0gi/8jjHVb6Ic9mfB6vibCQwNpPo0817cNGmshKn7muGrJzVo6uriMMS60GJJj BO3AktyngzM7/cT343tQCnMEnccjUnsrEa2CzbRJxlxACYHSb35YGAsLnyhtvhjdySja tbqdf8CJbL3rBm2yedIwYpeiJS5rdVtXU/dZAGVeYTNaxs1xmnITSG9GtWYJ9d5BY/p4 DgdNTEqMenp3iHBMNJB6Gvb2K5siryzDi1ydOQrzVtJBbsThBXV+DN8qBta5coWVBB5P 158g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1759200268; x=1759805068; 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=bd/jIJYyk1G6SYf0mNQVLBMDX4oiGoErfqkyMXn4+LQ=; b=lvYxub3RJlcKL+Lef3/4CevMboy+nBpEX0KrMCB59IsejM8vWHLjdzZix9mLEdkcAE GY2YAuEN3Nti+ruoLTMpVEym7iHKDKS2syq9IwVaWjygqoroHw4JLoMyJTyD9QsfnoDX JtiLxD74XeOUaOW5DZvTQXhXUXK5jt54RWrg0ZUkjy2yJCyvkmnMZ/KTRKkFOIXIeJ+H Ye+djZY4lfr7IHqTWpe3RbQU+vqr3VRaZvr/dsKZ0/nEaGL8Bcmg8xv9SiO8E5u6sk3V 4vK6s2FHhLx2D8DH3UwJGeYY9aumJz5mLUqA7vfjfDWy5bYJ6PcdkUERhsa9Mu36/bKF z4OQ== X-Forwarded-Encrypted: i=1; AJvYcCU7QaE8NZe9sL5sQTLcHU8vhii9onJOLCs9YCpYz3M8aNCveRTmc2VL9mgKQ+n9Bv+qkiGpVCh/T1jSBxs=@vger.kernel.org X-Gm-Message-State: AOJu0Yz9fg0n7dkq4kKlqQPcJa/3uYtLrNIfNRczLDqf0pqDxutPFvPR o/GfoRaezMzj3SbG+b7xVKbZkgRI1MQuiTSmv0N1OJLJfJJIxYnXk/AA X-Gm-Gg: ASbGnctpcBygY4bSjwrBQPkySteqTgDnikChsdJR0mOlHaK3JrxQZgW5jtO2JPbIM8p yAI8IbTtyrYzAJOkTNlJehjkuIiwhihTzp0hYbSwNMB3CSss/I7LkKNgPdKWXdkwk9Z9heKFJcY XYKv6CmhobnCYsd6LfPI1v7CiATYjoyE4UXezhQgL23vxnB7MbNU6M+P2/EJLHzKKsBOagoCrQi pYzgIUPbLUQQY1LbSU+jvkiiXq2tWQUfw5yRnvxzHNTBkjvaTxiVp0EWgBWxx79C3Dar46/Fey9 +OhZyPKDzSWnAyOVepHIG4JT3vFRVCnz395TlDEI03HN5eedUml2uz4HdK9LoDycbO/vJl8XX4+ VqrGkvTpLnI98YL8M1ijBabBwUUG1Vq2shIPVp8VYeoyALN9Y6QZ/adh/W20UgdzzwTqblLXG9P z7 X-Google-Smtp-Source: AGHT+IHMOcWUXY/HnXgeQLe6jbo4QIzPdgwdgujFPg5G7XU1dMaY5AtA37WyD38lOg5pTss5CR5fOg== X-Received: by 2002:a17:903:a8b:b0:27d:339c:4b0 with SMTP id d9443c01a7336-27ed4aa57f1mr154617195ad.35.1759200267317; Mon, 29 Sep 2025 19:44:27 -0700 (PDT) Received: from localhost ([45.142.167.196]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-27ed66d43b8sm144778285ad.9.2025.09.29.19.44.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Sep 2025 19:44:26 -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 v6 02/23] x86/hw_breakpoint: Add arch_reinstall_hw_breakpoint Date: Tue, 30 Sep 2025 10:43:23 +0800 Message-ID: <20250930024402.1043776-3-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250930024402.1043776-1-wangjinchao600@gmail.com> References: <20250930024402.1043776-1-wangjinchao600@gmail.com> 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" The new arch_reinstall_hw_breakpoint() function can be used in an atomic context, unlike the more expensive free and re-allocation path. This allows callers to efficiently re-establish an existing breakpoint. Signed-off-by: Jinchao Wang Reviewed-by: Masami Hiramatsu (Google) --- arch/x86/include/asm/hw_breakpoint.h | 2 ++ arch/x86/kernel/hw_breakpoint.c | 9 +++++++++ 2 files changed, 11 insertions(+) diff --git a/arch/x86/include/asm/hw_breakpoint.h b/arch/x86/include/asm/hw= _breakpoint.h index aa6adac6c3a2..c22cc4e87fc5 100644 --- a/arch/x86/include/asm/hw_breakpoint.h +++ b/arch/x86/include/asm/hw_breakpoint.h @@ -21,6 +21,7 @@ struct arch_hw_breakpoint { =20 enum bp_slot_action { BP_SLOT_ACTION_INSTALL, + BP_SLOT_ACTION_REINSTALL, BP_SLOT_ACTION_UNINSTALL, }; =20 @@ -65,6 +66,7 @@ extern int hw_breakpoint_exceptions_notify(struct notifie= r_block *unused, =20 =20 int arch_install_hw_breakpoint(struct perf_event *bp); +int arch_reinstall_hw_breakpoint(struct perf_event *bp); void arch_uninstall_hw_breakpoint(struct perf_event *bp); void hw_breakpoint_pmu_read(struct perf_event *bp); void hw_breakpoint_pmu_unthrottle(struct perf_event *bp); diff --git a/arch/x86/kernel/hw_breakpoint.c b/arch/x86/kernel/hw_breakpoin= t.c index 3658ace4bd8d..29c9369264d4 100644 --- a/arch/x86/kernel/hw_breakpoint.c +++ b/arch/x86/kernel/hw_breakpoint.c @@ -99,6 +99,10 @@ static int manage_bp_slot(struct perf_event *bp, enum bp= _slot_action action) old_bp =3D NULL; new_bp =3D bp; break; + case BP_SLOT_ACTION_REINSTALL: + old_bp =3D bp; + new_bp =3D bp; + break; case BP_SLOT_ACTION_UNINSTALL: old_bp =3D bp; new_bp =3D NULL; @@ -187,6 +191,11 @@ int arch_install_hw_breakpoint(struct perf_event *bp) return arch_manage_bp(bp, BP_SLOT_ACTION_INSTALL); } =20 +int arch_reinstall_hw_breakpoint(struct perf_event *bp) +{ + return arch_manage_bp(bp, BP_SLOT_ACTION_REINSTALL); +} + void arch_uninstall_hw_breakpoint(struct perf_event *bp) { arch_manage_bp(bp, BP_SLOT_ACTION_UNINSTALL); --=20 2.43.0 From nobody Thu Oct 2 01:01:41 2025 Received: from mail-pg1-f177.google.com (mail-pg1-f177.google.com [209.85.215.177]) (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 E5A27231845 for ; Tue, 30 Sep 2025 02:44:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759200273; cv=none; b=kvxlFaEmkB2jkRuVSk4MqK8hVR6BSzxuwjDWqOW43gJdKSILNvTR92hhT8qV0d2jn6JMjeALeQY2b7blcSH3hxTXjGb1gmRugRiyQ3pBQvOxzVbSyRlJEu5mkTHHqJ0BHOpMeANnu4M7xrea37CiaVEJDqABK5A/FJveG8qQR20= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759200273; c=relaxed/simple; bh=JuRa9sqqB7Pb4oITEW69e6hBS72ry7/vRFUMRsXtE7E=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Ue/KQ77xatjkx4qMnN31+wvtK1ZJx4zHT9fjNwf/c5MH5OSyO0JRf2ouTXqS2eIiJZImlaLCRxCRiMosSdSPk81yDh6IOr5YKnpho0ARpP7v84D31P7jEzFoXGsw8vn1W/nuT8Zvox3MPIcfiAgfNsdgWZ/HaM5LeMeKNt/buJU= 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=OYUnLXwn; arc=none smtp.client-ip=209.85.215.177 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="OYUnLXwn" Received: by mail-pg1-f177.google.com with SMTP id 41be03b00d2f7-b4fb8d3a2dbso4213831a12.3 for ; Mon, 29 Sep 2025 19:44:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1759200271; x=1759805071; 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=l9dguoBkY6LX1N0DOj75LxFoPgkZue82QF3pLTyVov0=; b=OYUnLXwnElDfaCj0ikoWn7FzFQnNoB/0MCW4c2IetzX1da6VF7jpCmQjrXl34NjwW1 EKIqmBVIkI19u/Wh2/K1ZkTwGypX5g7bfDXcyl9aADVVNcTgorlM04fDorCtLcq3t6i3 7AZ1twrJy7BkxSfUIqTk7vWxjSGRHlxKvHn7QN0l+B4kL7/mwjyLQ1lFjfgAhjthatub TAPU2JYyelGkeht5V+F0s05X3BJ1vPBce8ZOiWRVEIPxxaD5B5kXz0+ttn7b2r+SaBIb HMK2s+SAUD40qwwRJMZgX7f2sPJwl2s+5wXoBi6JljONCIugPR8WQb+HUH8nvTtgry8H q9Wg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1759200271; x=1759805071; 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=l9dguoBkY6LX1N0DOj75LxFoPgkZue82QF3pLTyVov0=; b=GbnPVH5S6X692NYLfeI0ammmvuR1Ld3apQng7PlMlDh5TqHhYvHi2PCbTtcZ9bfSiK NBKOMUW1aqQG2fh1bmJ7D6QsJCWCfPGbYdATSDG96yr1f6/CGF19tsayuGI7kH1/gQ3P 6oop3aJI6RAl7bldzybrJ8LP75hGUBHtD4aPjFwS6tEMTStuYwDXLPCu/BEb94k1JDz5 h2AS0fqUXmtss3crf++Lc3I+0idbkpoBNR4g/jcxrx7LicJXQ+Tx8kdrTEh6B+o0y1/p o0kE3VCnwyOr9jJrXASyOcT5h175aqIJ1pTjq+TEBkj70DWBq0EUAkIpc6PPzyx90ECp lIaw== X-Forwarded-Encrypted: i=1; AJvYcCV6KEEBVJd23W3YQKzoNHXnjkgx38qs2Sc4pqdOej+tdIGivdZ67vvXiZn+710RmEna2c64bqcOF8QZPGA=@vger.kernel.org X-Gm-Message-State: AOJu0Yxj8mvL4+3hyJehU3zVbWZNH9oTUdWyykAq5TfK5NePSUflRIjN Mefakn5VHnzH+IPCQgZZzABHrcQJ3ZEen4xH4ExCNJs6xTbqv2lRzu96 X-Gm-Gg: ASbGncvRsM32Sk5JgAvJllQPbbgc+qudZdvhi7Ks5LpD/KjXvqW+1hNazenu4Cbvdtr BkXl9jKNwO/5rait7OM0/X7LfshTkXb/vzWY4XQbihde2OUdsCXvdSuXUA40c3CGVLFENVNMedQ roEZDhiPM2T0+bu0SflEHjvnKEZNdd1E5rFBYuTMBzERhaRtPSNaQtDJI8Wbc55Q7kGok9xpjtC uk5epcyfhMYzXB0cmZ+zj/Qif8ln/kZrOhfuPOPNuyo+V1mCLkhvViq9MWWg+ASNKNfY2S0vRCt Nd8msZfgsRjTdHybTnOk5txjpw7xGzmrRvEZePaF91iz1qgJLRLBuD5x6cYYI6xxLcqFubiv0id 82uC5qJaz/gsvto7/NlQaZmGrqO9gcgQENfhBt7BEZ0tFRWWlZem2mexI58ihY5NZ6hYAUgW+l0 gF/bD0Ug32+3s= X-Google-Smtp-Source: AGHT+IHjrrKfxlAjB9vjrTGyvJK813tH9TeLe0y5kgR3cpWBZ7wuSWlGxxuhJbW7A37WSlnCeWMzQw== X-Received: by 2002:a17:902:f543:b0:24c:b39f:baaa with SMTP id d9443c01a7336-27ed4a98ae9mr223248625ad.49.1759200270921; Mon, 29 Sep 2025 19:44:30 -0700 (PDT) Received: from localhost ([45.142.167.196]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-27ed69bf9bdsm145712165ad.127.2025.09.29.19.44.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Sep 2025 19:44:30 -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 v6 03/23] HWBP: Add modify_wide_hw_breakpoint_local() API Date: Tue, 30 Sep 2025 10:43:24 +0800 Message-ID: <20250930024402.1043776-4-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250930024402.1043776-1-wangjinchao600@gmail.com> References: <20250930024402.1043776-1-wangjinchao600@gmail.com> 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" From: "Masami Hiramatsu (Google)" Add modify_wide_hw_breakpoint_local() arch-wide interface which allows hwbp users to update watch address on-line. This is available if the arch supports CONFIG_HAVE_REINSTALL_HW_BREAKPOINT. Note that this allows to change the type only for compatible types, because it does not release and reserve the hwbp slot based on type. For instance, you can not change HW_BREAKPOINT_W to HW_BREAKPOINT_X. Signed-off-by: Masami Hiramatsu (Google) --- arch/Kconfig | 10 ++++++++++ arch/x86/Kconfig | 1 + include/linux/hw_breakpoint.h | 6 ++++++ kernel/events/hw_breakpoint.c | 37 +++++++++++++++++++++++++++++++++++ 4 files changed, 54 insertions(+) diff --git a/arch/Kconfig b/arch/Kconfig index d1b4ffd6e085..e4787fc814df 100644 --- a/arch/Kconfig +++ b/arch/Kconfig @@ -418,6 +418,16 @@ config HAVE_MIXED_BREAKPOINTS_REGS Select this option if your arch implements breakpoints under the latter fashion. =20 +config HAVE_REINSTALL_HW_BREAKPOINT + bool + depends on HAVE_HW_BREAKPOINT + help + Depending on the arch implementation of hardware breakpoints, + some of them are able to update the breakpoint configuration + without release and reserve the hardware breakpoint register. + What configuration is able to update depends on hardware and + software implementation. + config HAVE_USER_RETURN_NOTIFIER bool =20 diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 52c8910ba2ef..4ea313ef3e82 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -247,6 +247,7 @@ config X86 select HAVE_FUNCTION_TRACER select HAVE_GCC_PLUGINS select HAVE_HW_BREAKPOINT + select HAVE_REINSTALL_HW_BREAKPOINT select HAVE_IOREMAP_PROT select HAVE_IRQ_EXIT_ON_IRQ_STACK if X86_64 select HAVE_IRQ_TIME_ACCOUNTING diff --git a/include/linux/hw_breakpoint.h b/include/linux/hw_breakpoint.h index db199d653dd1..ea373f2587f8 100644 --- a/include/linux/hw_breakpoint.h +++ b/include/linux/hw_breakpoint.h @@ -81,6 +81,9 @@ register_wide_hw_breakpoint(struct perf_event_attr *attr, perf_overflow_handler_t triggered, void *context); =20 +extern int modify_wide_hw_breakpoint_local(struct perf_event *bp, + struct perf_event_attr *attr); + extern int register_perf_hw_breakpoint(struct perf_event *bp); extern void unregister_hw_breakpoint(struct perf_event *bp); extern void unregister_wide_hw_breakpoint(struct perf_event * __percpu *cp= u_events); @@ -124,6 +127,9 @@ register_wide_hw_breakpoint(struct perf_event_attr *att= r, perf_overflow_handler_t triggered, void *context) { return NULL; } static inline int +modify_wide_hw_breakpoint_local(struct perf_event *bp, + struct perf_event_attr *attr) { return -ENOSYS; } +static inline int register_perf_hw_breakpoint(struct perf_event *bp) { return -ENOSYS; } static inline void unregister_hw_breakpoint(struct perf_event *bp) { } static inline void diff --git a/kernel/events/hw_breakpoint.c b/kernel/events/hw_breakpoint.c index 8ec2cb688903..5ee1522a99c9 100644 --- a/kernel/events/hw_breakpoint.c +++ b/kernel/events/hw_breakpoint.c @@ -887,6 +887,43 @@ void unregister_wide_hw_breakpoint(struct perf_event *= __percpu *cpu_events) } EXPORT_SYMBOL_GPL(unregister_wide_hw_breakpoint); =20 +/** + * modify_wide_hw_breakpoint_local - update breakpoint config for local CPU + * @bp: the hwbp perf event for this CPU + * @attr: the new attribute for @bp + * + * This does not release and reserve the slot of a HWBP; it just reuses the + * current slot on local CPU. So the users must update the other CPUs by + * themselves. + * Also, since this does not release/reserve the slot, this can not change= the + * type to incompatible type of the HWBP. + * Return err if attr is invalid or the CPU fails to update debug register + * for new @attr. + */ +#ifdef CONFIG_HAVE_REINSTALL_HW_BREAKPOINT +int modify_wide_hw_breakpoint_local(struct perf_event *bp, + struct perf_event_attr *attr) +{ + int ret; + + if (find_slot_idx(bp->attr.bp_type) !=3D find_slot_idx(attr->bp_type)) + return -EINVAL; + + ret =3D hw_breakpoint_arch_parse(bp, attr, counter_arch_bp(bp)); + if (ret) + return ret; + + return arch_reinstall_hw_breakpoint(bp); +} +#else +int modify_wide_hw_breakpoint_local(struct perf_event *bp, + struct perf_event_attr *attr) +{ + return -EOPNOTSUPP; +} +#endif +EXPORT_SYMBOL_GPL(modify_wide_hw_breakpoint_local); + /** * hw_breakpoint_is_used - check if breakpoints are currently used * --=20 2.43.0 From nobody Thu Oct 2 01:01:41 2025 Received: from mail-pf1-f180.google.com (mail-pf1-f180.google.com [209.85.210.180]) (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 C450223313E for ; Tue, 30 Sep 2025 02:44:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759200277; cv=none; b=g7vNZYK35OV5uLK8VzcaLKhUaAKEqjD7AvYqVCC6xY1JeWUiXXm+XXliO95FO1OiUi+Jeht1FRg8Z3ssDV8xK8QgVdhCDM73W8iXBjh/D/WzVth6d1oy5j+23BiO5Z0UrcorVg7xomRVsr6LG9gvTF7xaIVw2rKZYCKLTrvQ8U8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759200277; c=relaxed/simple; bh=boxEQn+lY/C6jkvJZFjK01G2rW6t0U2zmcOwIq1YIoI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=NPZgej8XCILJMdgHxUVzYeGXueWqYOBfdgEaADdAX6Ru40tfYA2nJKfovZnPLwFaWT9vrjrot1CpdIxsXpAAZMPOLpS9BXZ5Eri7iSNJTJt4fGeHhRhS03oS8brv8/V0t8Ygd8t03XcGpSaYsAM9ZayScZfTGg6Nb5ezDZfjEOI= 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=bC2DSGZK; arc=none smtp.client-ip=209.85.210.180 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="bC2DSGZK" Received: by mail-pf1-f180.google.com with SMTP id d2e1a72fcca58-76e6cbb991aso4612721b3a.1 for ; Mon, 29 Sep 2025 19:44:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1759200275; x=1759805075; 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=DLL9szq8LgdVljgQmrpuYN0dKjRbhwJ4oBDbEm6eF/Y=; b=bC2DSGZK64bV0V4VwYrPhZ87NyeXrn4N1/gDgu1QEAOXxYyoDSWwqTIgW99eX8D002 ebw+gg2ofPjgYVxo6cmu0TKU6yEwfgV6lPJUNynSobkRUUfzwwH/jWcXpZME4rEhNruv o1ENNjwOKRbZttzLmaSAspqTNbeUqc6p72F57f2qpAf7P0cbk1FqS+NYLJTlNdOBS42z dGsJDosoIATTiqmpD5NerWCnQSqE8nhPEHMW2fJS+GsNInj7jmXDr2KT6wgyWqvptTbR O37aE88YOo/Q3Ul9XUCYjzzosK7dAjZPiauwMt9Nwsowbb8VAP6KJR/yjsHTeUzR56mc 9gMg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1759200275; x=1759805075; 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=DLL9szq8LgdVljgQmrpuYN0dKjRbhwJ4oBDbEm6eF/Y=; b=Q3ThKLLKgQChXXoVilmph2H06alqQLIiLLN7uDcd0W38+2sgKAre7qNeFk63uM2t1y oR+qing/aShsKLBZcSn5+uN1R7ThTtf4AquA4H5MVWRM0rdrEKnAtLbjr/g9jCguKF9n sTe/xvsj20Wqan+NCEP1eGw0ydIE+rrQYPB0SbTlg0WlypV19GPvaHLVkiOUQ5cdkX8K ckXo/81JrDxRs9Ldo4Od/NPJM5nnKCFWECtxoGLlybTOzfQUVoCQzoGow2UzaL8W1utN oPixnwgqkQmsbt33kA6/Un7iOnLwX2zRlSBNlOfcaxZmsMdf7feF4EWRRVFn7bn9HiFz Gr6g== X-Forwarded-Encrypted: i=1; AJvYcCX87xOnid0D8ngbXm0QXboP1jUWs27Vr72kt6qlw0PwZehkbyx9YLB0vZsytg8/nZJY2RKCJNn77FEvCxY=@vger.kernel.org X-Gm-Message-State: AOJu0Yw58UzisPiCtAit7zuHpICUQhfI/y8iutYIBgA+VzgM+nc5Vpwa NR4ZhMQEaP91Hw4ceSGNKJyCDPegWy5bUVskI4rpYBkwyI3l6V3LrNgT X-Gm-Gg: ASbGncsV48ddZtjxz0i/wPEnfNcCpxdpeAaE8p+JD+04M6L3wY78GhLkGSt8KwtDwqf Kfuq5bL5v51yz1UI8Km9mBeaO3MO7R8nB4BkjUu7ARznOMu6pkLV/AN5WUFxVL8wT1+aHcs/zjw 3Hm1i7iVy16DthuGlhPpbXsAWzD8PrvWCKcvJQ4d3rkfadqdMDe/GuGMYyJ8U3ZxAARR/jEBPVB oV+8GKtsJtCmKxgvCSO8FofYi+EytuMf17R2WIRRWH+7kHhNiAYnR/fG2HHjQlS04qS4B+ULRth PM76xOlRAbzOIXHgRqctiOkp+KPoAL8lN1kE2MWmW1PpKSHGKSHwOLad1vSaz73dGin6zIIqFAU aPMcDZLU6jx7lP7bGYCmh0ynk5XmhvN3LFRrwxzEWa+IloD8K2f8nbesZdKQY8mJX9A6MSQKKER Zx X-Google-Smtp-Source: AGHT+IFKAUJd50skyQZezOIyRCzitP2KYWlsYqho8uHybu50MFOQdhfyrcEbVkIiLwip8Qb7gZ0ySg== X-Received: by 2002:a05:6a00:4b46:b0:77f:416e:de8e with SMTP id d2e1a72fcca58-780fceb5040mr19851033b3a.26.1759200274983; Mon, 29 Sep 2025 19:44:34 -0700 (PDT) Received: from localhost ([45.142.167.196]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-7810238f11esm12449091b3a.19.2025.09.29.19.44.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Sep 2025 19:44:34 -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 v6 04/23] mm/ksw: add build system support Date: Tue, 30 Sep 2025 10:43:25 +0800 Message-ID: <20250930024402.1043776-5-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250930024402.1043776-1-wangjinchao600@gmail.com> References: <20250930024402.1043776-1-wangjinchao600@gmail.com> 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" Add Kconfig and Makefile infrastructure. The implementation is located under `mm/kstackwatch/`. Signed-off-by: Jinchao Wang --- mm/Kconfig.debug | 8 ++++++++ mm/Makefile | 1 + mm/kstackwatch/Makefile | 2 ++ mm/kstackwatch/kernel.c | 23 +++++++++++++++++++++++ mm/kstackwatch/kstackwatch.h | 5 +++++ mm/kstackwatch/stack.c | 1 + mm/kstackwatch/watch.c | 1 + 7 files changed, 41 insertions(+) create mode 100644 mm/kstackwatch/Makefile create mode 100644 mm/kstackwatch/kernel.c create mode 100644 mm/kstackwatch/kstackwatch.h create mode 100644 mm/kstackwatch/stack.c create mode 100644 mm/kstackwatch/watch.c diff --git a/mm/Kconfig.debug b/mm/Kconfig.debug index 32b65073d0cc..24f4c4254f01 100644 --- a/mm/Kconfig.debug +++ b/mm/Kconfig.debug @@ -309,3 +309,11 @@ config PER_VMA_LOCK_STATS overhead in the page fault path. =20 If in doubt, say N. + +config KSTACK_WATCH + bool "Kernel Stack Watch" + depends on HAVE_HW_BREAKPOINT && KPROBES && FPROBE && STACKTRACE + help + A lightweight real-time debugging tool to detect stack corruption. + + If unsure, say N. diff --git a/mm/Makefile b/mm/Makefile index ef54aa615d9d..665c9f2bf987 100644 --- a/mm/Makefile +++ b/mm/Makefile @@ -92,6 +92,7 @@ obj-$(CONFIG_PAGE_POISONING) +=3D page_poison.o obj-$(CONFIG_KASAN) +=3D kasan/ obj-$(CONFIG_KFENCE) +=3D kfence/ obj-$(CONFIG_KMSAN) +=3D kmsan/ +obj-$(CONFIG_KSTACK_WATCH) +=3D kstackwatch/ obj-$(CONFIG_FAILSLAB) +=3D failslab.o obj-$(CONFIG_FAIL_PAGE_ALLOC) +=3D fail_page_alloc.o obj-$(CONFIG_MEMTEST) +=3D memtest.o diff --git a/mm/kstackwatch/Makefile b/mm/kstackwatch/Makefile new file mode 100644 index 000000000000..84a46cb9a766 --- /dev/null +++ b/mm/kstackwatch/Makefile @@ -0,0 +1,2 @@ +obj-$(CONFIG_KSTACK_WATCH) +=3D kstackwatch.o +kstackwatch-y :=3D kernel.o stack.o watch.o diff --git a/mm/kstackwatch/kernel.c b/mm/kstackwatch/kernel.c new file mode 100644 index 000000000000..78f1d019225f --- /dev/null +++ b/mm/kstackwatch/kernel.c @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: GPL-2.0 +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#include + +static int __init kstackwatch_init(void) +{ + pr_info("module loaded\n"); + return 0; +} + +static void __exit kstackwatch_exit(void) +{ + pr_info("module unloaded\n"); +} + +module_init(kstackwatch_init); +module_exit(kstackwatch_exit); + +MODULE_AUTHOR("Jinchao Wang"); +MODULE_DESCRIPTION("Kernel Stack Watch"); +MODULE_LICENSE("GPL"); + diff --git a/mm/kstackwatch/kstackwatch.h b/mm/kstackwatch/kstackwatch.h new file mode 100644 index 000000000000..0273ef478a26 --- /dev/null +++ b/mm/kstackwatch/kstackwatch.h @@ -0,0 +1,5 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _KSTACKWATCH_H +#define _KSTACKWATCH_H + +#endif /* _KSTACKWATCH_H */ diff --git a/mm/kstackwatch/stack.c b/mm/kstackwatch/stack.c new file mode 100644 index 000000000000..cec594032515 --- /dev/null +++ b/mm/kstackwatch/stack.c @@ -0,0 +1 @@ +// SPDX-License-Identifier: GPL-2.0 diff --git a/mm/kstackwatch/watch.c b/mm/kstackwatch/watch.c new file mode 100644 index 000000000000..cec594032515 --- /dev/null +++ b/mm/kstackwatch/watch.c @@ -0,0 +1 @@ +// SPDX-License-Identifier: GPL-2.0 --=20 2.43.0 From nobody Thu Oct 2 01:01:41 2025 Received: from mail-pj1-f47.google.com (mail-pj1-f47.google.com [209.85.216.47]) (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 E6D1321B9E2 for ; Tue, 30 Sep 2025 02:44:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759200287; cv=none; b=UX5BeBS0FWJcpgIfanmJUXCn+tfcvgRK6+nnjvb6hRX7z1pYnk0LfGUkyieNXta8R7n55/BgbhrvUSNASD34mhhLsqltqyJw0Df6mKLrznxS8HVp0P3wUjgjvokbYuFRhLis5t/Yngw7TfLf8KsoMDxgWia/yO/F5GSF3HiecFg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759200287; c=relaxed/simple; bh=Feu6QMw0Ju5Y4dTxQ53cERWbV/8rWQzq92gPB2aNeXU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=f85Q2/5Y45gA9tMK+XSn+S69HLzGXsAonYA/L/299+g35Srgpttez4MT4M9kgk98XIEPge5QVDD7wTR+Tp8b0vT2rTGpSX27nNlbq+Lw6Epkt/t4yOchqwT7tsVItX9B1pkirvCGkjMuHIXdIAIm4ZnG9l68KkqGU0B4fntTeq0= 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=cD9UsyAP; arc=none smtp.client-ip=209.85.216.47 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="cD9UsyAP" Received: by mail-pj1-f47.google.com with SMTP id 98e67ed59e1d1-32df5cae0b1so6379115a91.2 for ; Mon, 29 Sep 2025 19:44:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1759200285; x=1759805085; 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=eGY4NXn9SYrwp2MIROIAsCXd8mHWC2w3iRZMJXUxzyw=; b=cD9UsyAP5k2wj4gs9yH53Z5F0evW6nvZeYep6U0kGGBeOq22iMBGQ10fM4HLmh6GoF ibawQ7frk+355kuKbgNVplNh2RBpcejEqPqp8ekEoIAd/nN0lrc8n7zGmNOu1PNXZjSl i+jMW7vO3nhuGEKYovvsy+1U+FVTZv+u3oxyDCVIa/7HagNJvsc63RMlohld5WAoArmv WsgKXvDy2bkVe6dLS1kaRSdoMxVgyyN6+EzILqOlGDHRWQGxakjNwT9P4VnSx5ENfSZL ezdf4YzogQO0TaQ5Ji79Dh7FUajDGZcrv7mkd4HnUmIAz22USLvwRkj2cQKWmYxQirj/ X4vQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1759200285; x=1759805085; 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=eGY4NXn9SYrwp2MIROIAsCXd8mHWC2w3iRZMJXUxzyw=; b=ta0Amrtu2EJ3srtbR8k5Yez07rWlTexVTbWh3C6pmxkYLjtkjrEr/jqZPVUPptZHaC 7N9mG7oOHcFeF30Fd0pee1ZnwuH9rnwa1RShU+QC4DcKp69wHg/d5j3pIm5GqqGpvEeD 8lReo3+LlZqPvnxFBUMVGVvN0uvUB/ZTm/KLmn+4h/meydjfwbOvEIReEe5gZi55LNHw atpaHIgYzVPtuFDmXnfT5xKxUm93TioaQgeV9XXA2fCCh/8iq/j4HX9yjU1S37nAz/gl lcRvfKW7uXvEi6KtB/aH2RizFZJtJrS5x0QXKnj0hpDNS9f6zloLjccQA/E23TiU5yv6 qE+A== X-Forwarded-Encrypted: i=1; AJvYcCVNdW+OS0L9JBejt2YyInfYC/GuwMLyF1XWbzs253o4+k0Asr7mb/UmbiIj6SeQydKYvom5ioThdhxTTmY=@vger.kernel.org X-Gm-Message-State: AOJu0YxgGNuIW4keQVihF2p4bsV0pLJVDa9rWG+jlkv9l9xem9QtLXGW MzHWXxG8OapkG9rUTjR3MMiA1jWJ7nXYsZq9e2E/rG1nNdHoeHzAWXa1 X-Gm-Gg: ASbGncsZCxeHyfF3MdTK/7kX9ywLubV9k+YKzMszge99xCUdagYIfFlUoNAs/2sOWf6 GTnTTSy8ictDCmpBKJwBxhWIDj1/nXPmXI806d/Fq9tJYOrQ+2+twsls4DHd9ytFu/Dkp5FuOdu taYPpuBpw26pExvaKsJ8jRqsF9hjTBAMNiPS2BNioBcB/TRNLKvcUS7S+lvPwJxPGsZZGOSzzxZ ty0zOsg92LHRcY8AjjsuV38+x6CE+Pewlib8rsqum8WDMRh6cN6+DHTYnr+gmZ6NynNl7U91SSA /w2fu5D+dzbzBkcEBe2mveV8B/7KG1ABcg1QPlwSA/+gq8DYkon0ilxOKM3kGeh0WVvmbHJIw41 veNQbeJulAoIFnrsCB3vgCro7C7CqGVIGc6XDHqCKTpvjvYMt2/u+aNtscLtYuz28zlWGzK0Zzg V+ X-Google-Smtp-Source: AGHT+IFCIxJ+f2ZP7/SRGQLtykJQ9skkyS5Xc4YM8nOS80KRWl9hYAY1JbghIyfFVwcemJPxzbxqqQ== X-Received: by 2002:a17:90b:1347:b0:330:6edd:9cf with SMTP id 98e67ed59e1d1-3342a2b0f1fmr20209339a91.22.1759200285220; Mon, 29 Sep 2025 19:44:45 -0700 (PDT) Received: from localhost ([45.142.167.196]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3341bdac46bsm18593679a91.12.2025.09.29.19.44.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Sep 2025 19:44:44 -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 v6 05/23] mm/ksw: add ksw_config struct and parser Date: Tue, 30 Sep 2025 10:43:26 +0800 Message-ID: <20250930024402.1043776-6-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250930024402.1043776-1-wangjinchao600@gmail.com> References: <20250930024402.1043776-1-wangjinchao600@gmail.com> 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" Add struct ksw_config and ksw_parse_config() to parse user string. Signed-off-by: Jinchao Wang --- mm/kstackwatch/kernel.c | 112 +++++++++++++++++++++++++++++++++++ mm/kstackwatch/kstackwatch.h | 27 +++++++++ 2 files changed, 139 insertions(+) diff --git a/mm/kstackwatch/kernel.c b/mm/kstackwatch/kernel.c index 78f1d019225f..3b7009033dd4 100644 --- a/mm/kstackwatch/kernel.c +++ b/mm/kstackwatch/kernel.c @@ -1,16 +1,128 @@ // SPDX-License-Identifier: GPL-2.0 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt =20 +#include #include +#include + +#include "kstackwatch.h" + +static struct ksw_config *ksw_config; + +struct param_map { + const char *name; /* long name */ + const char *short_name; /* short name (2 letters) */ + size_t offset; /* offsetof(struct ksw_config, field) */ + bool is_string; /* true for string */ +}; + +/* macro generates both long and short name automatically */ +#define PMAP(field, short, is_str) \ + { #field, #short, offsetof(struct ksw_config, field), is_str } + +static const struct param_map ksw_params[] =3D { + PMAP(func_name, fn, true), + PMAP(func_offset, fo, false), + PMAP(depth, dp, false), + PMAP(max_watch, mw, false), + PMAP(sp_offset, so, false), + PMAP(watch_len, wl, false), +}; + +static int ksw_parse_param(struct ksw_config *config, const char *key, + const char *val) +{ + const struct param_map *pm =3D NULL; + int ret; + + for (int i =3D 0; i < ARRAY_SIZE(ksw_params); i++) { + if (strcmp(key, ksw_params[i].name) =3D=3D 0 || + strcmp(key, ksw_params[i].short_name) =3D=3D 0) { + pm =3D &ksw_params[i]; + break; + } + } + + if (!pm) + return -EINVAL; + + if (pm->is_string) { + char **dst =3D (char **)((char *)config + pm->offset); + *dst =3D kstrdup(val, GFP_KERNEL); + if (!*dst) + return -ENOMEM; + } else { + ret =3D kstrtou16(val, 0, (u16 *)((char *)config + pm->offset)); + if (ret) + return ret; + } + + return 0; +} + +/* + * Configuration string format: + * param_name=3D [param_name=3D ...] + * + * Required parameters: + * - func_name |fn (str) : target function name + * - func_offset|fo (u16) : instruction pointer offset + * + * Optional parameters: + * - depth |dp (u16) : recursion depth + * - max_watch |mw (u16) : maximum number of watchpoints + * - sp_offset |so (u16) : offset from stack pointer at func_offset + * - watch_len |wl (u16) : watch length (1,2,4,8) + */ +static int __maybe_unused ksw_parse_config(char *buf, struct ksw_config *c= onfig) +{ + char *part, *key, *val; + int ret; + + kfree(config->func_name); + kfree(config->user_input); + memset(ksw_config, 0, sizeof(*ksw_config)); + + buf =3D strim(buf); + config->user_input =3D kstrdup(buf, GFP_KERNEL); + if (!config->user_input) + return -ENOMEM; + + while ((part =3D strsep(&buf, " \t\n")) !=3D NULL) { + if (*part =3D=3D '\0') + continue; + + key =3D strsep(&part, "=3D"); + val =3D part; + if (!key || !val) + continue; + ret =3D ksw_parse_param(config, key, val); + if (ret) + pr_warn("unsupported param %s=3D%s", key, val); + } + + if (!config->func_name || !config->func_offset) { + pr_err("Missing required parameters: function or func_offset\n"); + return -EINVAL; + } + + return 0; +} =20 static int __init kstackwatch_init(void) { + ksw_config =3D kzalloc(sizeof(*ksw_config), GFP_KERNEL); + if (!ksw_config) + return -ENOMEM; + pr_info("module loaded\n"); return 0; } =20 static void __exit kstackwatch_exit(void) { + kfree(ksw_config); + pr_info("module unloaded\n"); } =20 diff --git a/mm/kstackwatch/kstackwatch.h b/mm/kstackwatch/kstackwatch.h index 0273ef478a26..a7bad207f863 100644 --- a/mm/kstackwatch/kstackwatch.h +++ b/mm/kstackwatch/kstackwatch.h @@ -2,4 +2,31 @@ #ifndef _KSTACKWATCH_H #define _KSTACKWATCH_H =20 +#include + +#define MAX_CONFIG_STR_LEN 128 + +struct ksw_config { + char *func_name; + u16 depth; + + /* + * watched variable info: + * - func_offset : instruction offset in the function, typically the + * assignment of the watched variable, where ksw + * registers a kprobe post-handler. + * - sp_offset : offset from stack pointer at func_offset. Usually 0. + * - watch_len : size of the watched variable (1, 2, 4, or 8 bytes). + */ + u16 func_offset; + u16 sp_offset; + u16 watch_len; + + /* max number of hwbps that can be used */ + u16 max_watch; + + /* save to show */ + char *user_input; +}; + #endif /* _KSTACKWATCH_H */ --=20 2.43.0 From nobody Thu Oct 2 01:01:41 2025 Received: from mail-pj1-f49.google.com (mail-pj1-f49.google.com [209.85.216.49]) (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 6C57123E23C for ; Tue, 30 Sep 2025 02:44:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759200294; cv=none; b=jw1f05wNFNIGDcC31t/mnEqWi/+ZB011WimFYs3AOxzEWkOR9VP/+GOYO6UR+Xq5REw/fZUtNQT1iuL+8TEqUbtOT+dMP/zO3/SLHYBcfxV2hj1E/6tXwCUo/S2ImYStNYYtR6Td7XsvV/3HdKbghNzTAzMNHP5W6V3iuV/0T3A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759200294; c=relaxed/simple; bh=NKGG2Deka0iYHCcjeICKwSp0xNn5UzCtr+YC+OdIklo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=CQh3cZbf5YiJa/9uv5gyLJNETG1EkmU/ANhDdiP30BCqwjU6V7DxlX++2fl/OHIYrGm3+RFtVOyh/HQBoTxQbmyAJ0C9Jc10265jg3JMfncOAziZhgyZIAqQl9gaChjqVv2a8SSi7mF9j8RdRnY4vP4ehcnb6IvEtKO6r29iREQ= 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=iJU7h/hq; arc=none smtp.client-ip=209.85.216.49 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="iJU7h/hq" Received: by mail-pj1-f49.google.com with SMTP id 98e67ed59e1d1-329a41dc2ebso4463180a91.3 for ; Mon, 29 Sep 2025 19:44:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1759200291; x=1759805091; 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=tH9NPPXYzjzWmBeV5TNMSRB6I94mkI1pmHDAIM87ayY=; b=iJU7h/hq+0Zl+S5CJiDaa4ggLdpamAziSTzoQj64IOgBovCo+YDbRLFBTugApzi8Dk hkCRsIT8iVELG8JajFpmPm/Nce+mjSnr0ZOZSN09wSO1T/BDahZ3q+C1yx4OsFU8ivs6 8QxReTYLt950fQKnijDmHD5zK51G20XPoQ9aWfk0Ott1XSwI4u7D1h4JEEJwLi9e1bK1 ZIHTssvnxpDrxbOu/16G+y+uQHneJyTluqq99xjbiQm5PwNcGF5IF/XiXIdgxeQhIgQa vYRLg8bnzzIQqWezNxOsY2SjzrSZ9k0hugo5XnyUB0fEA5d86nk37HACXYKF/kyC09ie tj9w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1759200291; x=1759805091; 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=tH9NPPXYzjzWmBeV5TNMSRB6I94mkI1pmHDAIM87ayY=; b=RLlPSOeCPJPLBvCx9TYDFEgvAiusmk6LtO1qVARcGGOd+Ztf7/CNmWhuqzvX4bc8/c TUmlEjLg73lRMB2A9dXfHeA6UYYCD133N6puuhwjnUTZ/LTm8zatV+a4GdqeCgbxGD0v P6oxlgltrbvmtUUztUJx3NSVE2PBKP4RX2EWauZiXqVebwvwfHzHJOUZEvAlv/ZyrBmZ frCb//8+jUBf3L2Ti7KjeSYDXGp4gVzEHF4f3TXmmOSH6lZWtZrkS2RCsVoG+7uabuHG t4o84eUwPPyFr3gZxNnZnKa0uqF3YIdUMzUVkoEzdDO866WQeZHSN3SPFDw2IhxpzX+u Y/tA== X-Forwarded-Encrypted: i=1; AJvYcCVY8odYz2dbZwLFHBBNBPqoyQ3wcEfmsG4g5qyQmGRAli/RjgfVwm1GZgp82dAdT5opxXOPHV6jrhiXYRU=@vger.kernel.org X-Gm-Message-State: AOJu0YxX2yn1CMs67cdOmXaJ0A79JgQZ+MSCz2Gs82/zLvrAD93K7PwJ ID1r3H06aHvJ/y9m3zYf1od88hm456qQIgcPAGWf/d2Z92Mxadq65pc0 X-Gm-Gg: ASbGncvLBYfeonyjlSOLltjqnLlG57qYG4S9/l/sXO9UpPrWrJrughuXIZVhw51lb51 npSkavwW4amocgsEcUpEsGnH4eU422X4qZ8juTkYvKHg6cAsNBuDubvj+XCNbaHKdMVNC0H7l4+ qoKNn3Gtj/ihDCq53hPbs7WC6+CkvcHeL8tXAQPUDigQbUUX2TbqEZZcJOBNifLtG/Ndo1yMcPZ wlekaEapKNH/ZmOOPiU/xDGlKCJLQsFVC4EAB37Ee6AEi3DM6B3beSlRreWpKERUU3qsbJHDD4Y HwAIVler0EAZ5VpvL3Bqci8aV1ZbZgM9V1fGycEEHzKOoqZTxb8KTVasJxXsLtQm1bB+/8io7NX 1f+fUu8yQInDH7AaY3nGqMqNDx6way1ozpgqvU68qhlE0qsH4cSzcardfWTXq0ZL3krYF6bpN7F I+ X-Google-Smtp-Source: AGHT+IFVE9O//P1+ssBUOG8eBG1xptc20Z1rkKT0r8Peul+CYAeELZZLuPAbA8MMh6puLAlFfjJIyA== X-Received: by 2002:a17:90b:3ece:b0:32b:6145:fa63 with SMTP id 98e67ed59e1d1-3342a216f73mr19097573a91.4.1759200290701; Mon, 29 Sep 2025 19:44:50 -0700 (PDT) Received: from localhost ([45.142.167.196]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3341be38382sm18526671a91.25.2025.09.29.19.44.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Sep 2025 19:44:50 -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 v6 06/23] mm/ksw: add singleton debugfs interface Date: Tue, 30 Sep 2025 10:43:27 +0800 Message-ID: <20250930024402.1043776-7-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250930024402.1043776-1-wangjinchao600@gmail.com> References: <20250930024402.1043776-1-wangjinchao600@gmail.com> 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" Provide the debugfs config file to read or update the configuration. Only a single process can open this file at a time, enforced using atomic config_file_busy, to prevent concurrent access. ksw_get_config() exposes the configuration pointer as const. Signed-off-by: Jinchao Wang --- mm/kstackwatch/kernel.c | 104 +++++++++++++++++++++++++++++++++-- mm/kstackwatch/kstackwatch.h | 3 + 2 files changed, 103 insertions(+), 4 deletions(-) diff --git a/mm/kstackwatch/kernel.c b/mm/kstackwatch/kernel.c index 3b7009033dd4..898ebb2966fe 100644 --- a/mm/kstackwatch/kernel.c +++ b/mm/kstackwatch/kernel.c @@ -1,13 +1,18 @@ // SPDX-License-Identifier: GPL-2.0 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt =20 +#include #include #include #include +#include =20 #include "kstackwatch.h" =20 +static atomic_t dbgfs_config_busy =3D ATOMIC_INIT(0); static struct ksw_config *ksw_config; +static struct dentry *dbgfs_config; +static struct dentry *dbgfs_dir; =20 struct param_map { const char *name; /* long name */ @@ -74,7 +79,7 @@ static int ksw_parse_param(struct ksw_config *config, con= st char *key, * - sp_offset |so (u16) : offset from stack pointer at func_offset * - watch_len |wl (u16) : watch length (1,2,4,8) */ -static int __maybe_unused ksw_parse_config(char *buf, struct ksw_config *c= onfig) +static int ksw_parse_config(char *buf, struct ksw_config *config) { char *part, *key, *val; int ret; @@ -109,20 +114,111 @@ static int __maybe_unused ksw_parse_config(char *buf= , struct ksw_config *config) return 0; } =20 +static ssize_t ksw_dbgfs_read(struct file *file, char __user *buf, size_t = count, + loff_t *ppos) +{ + return simple_read_from_buffer(buf, count, ppos, ksw_config->user_input, + ksw_config->user_input ? strlen(ksw_config->user_input) : 0); +} + +static ssize_t ksw_dbgfs_write(struct file *file, const char __user *buffe= r, + size_t count, loff_t *ppos) +{ + char input[MAX_CONFIG_STR_LEN]; + int ret; + + if (count =3D=3D 0 || count >=3D sizeof(input)) + return -EINVAL; + + if (copy_from_user(input, buffer, count)) + return -EFAULT; + + input[count] =3D '\0'; + strim(input); + + if (!strlen(input)) { + pr_info("config cleared\n"); + return count; + } + + ret =3D ksw_parse_config(input, ksw_config); + if (ret) { + pr_err("Failed to parse config %d\n", ret); + return ret; + } + + return count; +} + +static int ksw_dbgfs_open(struct inode *inode, struct file *file) +{ + if (atomic_cmpxchg(&dbgfs_config_busy, 0, 1)) + return -EBUSY; + return 0; +} + +static int ksw_dbgfs_release(struct inode *inode, struct file *file) +{ + atomic_set(&dbgfs_config_busy, 0); + return 0; +} + +static const struct file_operations kstackwatch_fops =3D { + .owner =3D THIS_MODULE, + .open =3D ksw_dbgfs_open, + .read =3D ksw_dbgfs_read, + .write =3D ksw_dbgfs_write, + .release =3D ksw_dbgfs_release, + .llseek =3D default_llseek, +}; + +const struct ksw_config *ksw_get_config(void) +{ + return ksw_config; +} + static int __init kstackwatch_init(void) { + int ret =3D 0; + ksw_config =3D kzalloc(sizeof(*ksw_config), GFP_KERNEL); - if (!ksw_config) - return -ENOMEM; + if (!ksw_config) { + ret =3D -ENOMEM; + goto err_alloc; + } + + dbgfs_dir =3D debugfs_create_dir("kstackwatch", NULL); + if (!dbgfs_dir) { + ret =3D -ENOMEM; + goto err_dir; + } + + dbgfs_config =3D debugfs_create_file("config", 0600, dbgfs_dir, NULL, + &kstackwatch_fops); + if (!dbgfs_config) { + ret =3D -ENOMEM; + goto err_file; + } =20 pr_info("module loaded\n"); return 0; + +err_file: + debugfs_remove_recursive(dbgfs_dir); + dbgfs_dir =3D NULL; +err_dir: + kfree(ksw_config); + ksw_config =3D NULL; +err_alloc: + return ret; } =20 static void __exit kstackwatch_exit(void) { + debugfs_remove_recursive(dbgfs_dir); + kfree(ksw_config->func_name); + kfree(ksw_config->user_input); kfree(ksw_config); - pr_info("module unloaded\n"); } =20 diff --git a/mm/kstackwatch/kstackwatch.h b/mm/kstackwatch/kstackwatch.h index a7bad207f863..983125d5cf18 100644 --- a/mm/kstackwatch/kstackwatch.h +++ b/mm/kstackwatch/kstackwatch.h @@ -29,4 +29,7 @@ struct ksw_config { char *user_input; }; =20 +// singleton, only modified in kernel.c +const struct ksw_config *ksw_get_config(void); + #endif /* _KSTACKWATCH_H */ --=20 2.43.0 From nobody Thu Oct 2 01:01:41 2025 Received: from mail-pg1-f169.google.com (mail-pg1-f169.google.com [209.85.215.169]) (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 EE909242D6A for ; Tue, 30 Sep 2025 02:44:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.169 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759200299; cv=none; b=m0xodeAJ8H6BNYrE5UVQM52XE1FE/QQSN69EaUTeF6dzEx+pHuQGJigOKJoZvYpz7PfJv63cjqTxMBQ0/Qs8Klgh+V6WSzVCM6h2F8viL29wds4RU37BG4+h4HoNsMMSXLVKkyao/Y1UPWbiz2AuvxZUvFg/eYEFnsw1tLpjlN0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759200299; c=relaxed/simple; bh=nvDFxA5+kzzGy254IQd/07joD3bGnycuza2xxZ+JqIE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=WHxXEy8oUHzpJXDaXjpgIiUrXJCw3+PTJ3i0aTxcXD0q/syvKnDGj9uC9ihNK866VURmEauqhqwJ6FI722OhUAhH+RjJNHVbzWsjO7Ju48jhnWnrj7SCl3y+a/Zb2qBDi7wrBn0okJ4fIEX/qnuimr82CP5aFDugYO1RRuTcsUE= 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=mJ76OFhY; arc=none smtp.client-ip=209.85.215.169 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="mJ76OFhY" Received: by mail-pg1-f169.google.com with SMTP id 41be03b00d2f7-b55562f3130so3778041a12.2 for ; Mon, 29 Sep 2025 19:44:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1759200296; x=1759805096; 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=5NW3rnfkFZjd7Zh69vJKiLybxjQ5f/0P49rVAWgM4UU=; b=mJ76OFhYyoEVI1m6MmA90KWiXh0cWoZ+eVR32ITQ1dl8xZlM6ELU4o/auxNRHvKf+F bck2JmEnVSLQwXMsluy+z9wGgo7KYB4mpwaFKr40+Rx1A9e2NQWFraw+b9RKDtaq2Iuv rdG36KAv5nA5sQ4JyE9FNpdfQ2dOgkPHUOSF1rHLLbSM3Vg1RZ1op3VY7jff+zz+S08C ai0MrjNUcAGMf6daJwhHFMLozqdK0fDvfb58SuNv8pYJwXFeqf5ztAMxXslYiPZC9UZc soNL6a5z4FBLavJhyi1WdWifEkRayE29joiC9LrjHAL7KIq6TjxdZty/D6+IF3xKelJ0 /DSQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1759200296; x=1759805096; 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=5NW3rnfkFZjd7Zh69vJKiLybxjQ5f/0P49rVAWgM4UU=; b=JoL12CKrjyOuA+S6HIWy5jIvtywjoGv2WJ+D0nHmGQl8Fa+uQROfPaI+co8KCipT1t iNC4m1W0VDK8gKoKK6qli835YobacJku1si4SMmrjDAZSaZHYy9sI567a4pBrLUlYm8K yXVUtORuu3+jLJnFAJZq/CgbgKOcSsJfkGxpgMO74MESYqg980UO4kbvgMAveTJsWtO/ /zCIjpFA7Mi539pK9Id0FhkRsJDvHoGOrSZ3Rt7+6sY1nn+KL8MYi4BfmQyuvvRc+/iI Aijs3jmMKxC1TU8WJpa78vTVoIY5Hd/nec0Pt8UG44Xz915Akr36Q/+viS9vL5AbKQza xAAg== X-Forwarded-Encrypted: i=1; AJvYcCVepKhd4OiZ1MrVdhf9L1XuyCf98bTLRJFfJhM2w/9SQAlzs76vuVXEz1jKnaGdxGLU3y92Sj7suSA14CY=@vger.kernel.org X-Gm-Message-State: AOJu0Yxmdfxnwk08rX8c9Ivfc7AaIGMjc0ovrwfmMQLkGRKq4ezy1dZc IoAC6P00YC8gJykOGXaDrY4hQbS6WbfvtS50+p1iD32jFXkS61WJJONM X-Gm-Gg: ASbGncu+wr8uhcyyp01Gnqmv9qO6yLwjAxKhHl/T6Ewsj4dCgqbTIeULoFHXjEsQCQH ebZVTYsKVulSSu8k1SIb6I+i8jkfcnvP1tAJBBLyR6FQfWDx7A+hkTkfWJXnwoQt7qXUJ84v5OG eKi1Z1FOWuxByGjFA+quUEI7Y3tq7PpSrJImvQUrZSFRv5v103dVzrU3aN62DeAAkCIJNZSJPpC 9J6QxrPnBMZ6N/zx+wcbW5IIoqFEW5T4nWnqx9+E49da3gM3xBp49I8Uc1w52FJUUfq+yXj63hU Kno1HqftUJ+DHO7Xjfd09pxSbv+kFlwj39nlZRWAJxWMyL994KvD4uzYsIbUsZN04HKNeEWfXct iNWXARiUx3g0Na/sMR7bDxVHDzE/cGFiGG0tm1ZLrwEJa6UJzHUarR33K7BZPbNT/FA== X-Google-Smtp-Source: AGHT+IH29Thtb5D6YkJakO5t9BTsEfGfbuz5XXYNk5kI0v7F6fpI1sv279aA08He56DkC5ZrjPjoLw== X-Received: by 2002:a17:902:e54a:b0:270:b6d5:f001 with SMTP id d9443c01a7336-27ed4a0d542mr209110885ad.23.1759200295846; Mon, 29 Sep 2025 19:44:55 -0700 (PDT) Received: from localhost ([45.142.167.196]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-27ed69952b3sm145098075ad.96.2025.09.29.19.44.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Sep 2025 19:44:55 -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 v6 07/23] mm/ksw: add HWBP pre-allocation Date: Tue, 30 Sep 2025 10:43:28 +0800 Message-ID: <20250930024402.1043776-8-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250930024402.1043776-1-wangjinchao600@gmail.com> References: <20250930024402.1043776-1-wangjinchao600@gmail.com> 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" Pre-allocate per-CPU hardware breakpoints at init with a place holder address, which will be retargeted dynamically in kprobe handler. This avoids allocation in atomic context. At most max_watch breakpoints are allocated (0 means no limit). Signed-off-by: Jinchao Wang --- mm/kstackwatch/kstackwatch.h | 13 +++++ mm/kstackwatch/watch.c | 97 ++++++++++++++++++++++++++++++++++++ 2 files changed, 110 insertions(+) diff --git a/mm/kstackwatch/kstackwatch.h b/mm/kstackwatch/kstackwatch.h index 983125d5cf18..4eac1be3b325 100644 --- a/mm/kstackwatch/kstackwatch.h +++ b/mm/kstackwatch/kstackwatch.h @@ -2,6 +2,9 @@ #ifndef _KSTACKWATCH_H #define _KSTACKWATCH_H =20 +#include +#include +#include #include =20 #define MAX_CONFIG_STR_LEN 128 @@ -32,4 +35,14 @@ struct ksw_config { // singleton, only modified in kernel.c const struct ksw_config *ksw_get_config(void); =20 +/* watch management */ +struct ksw_watchpoint { + struct perf_event *__percpu *event; + struct perf_event_attr attr; + struct llist_node node; // for atomic watch_on and off + struct list_head list; // for cpu online and offline +}; +int ksw_watch_init(void); +void ksw_watch_exit(void); + #endif /* _KSTACKWATCH_H */ diff --git a/mm/kstackwatch/watch.c b/mm/kstackwatch/watch.c index cec594032515..1d8e24fede54 100644 --- a/mm/kstackwatch/watch.c +++ b/mm/kstackwatch/watch.c @@ -1 +1,98 @@ // SPDX-License-Identifier: GPL-2.0 +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#include +#include +#include +#include +#include + +#include "kstackwatch.h" + +static LLIST_HEAD(free_wp_list); +static LIST_HEAD(all_wp_list); +static DEFINE_MUTEX(all_wp_mutex); + +static ulong holder; +bool panic_on_catch; +module_param(panic_on_catch, bool, 0644); +MODULE_PARM_DESC(panic_on_catch, "panic immediately on corruption catch"); + +static void ksw_watch_handler(struct perf_event *bp, + struct perf_sample_data *data, + struct pt_regs *regs) +{ + pr_err("=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D KStackWatch: Caught stack corrupti= on =3D=3D=3D=3D=3D=3D=3D\n"); + pr_err("config %s\n", ksw_get_config()->user_input); + dump_stack(); + pr_err("=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D KStackW= atch End =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D\n"); + + if (panic_on_catch) + panic("Stack corruption detected"); +} + +static int ksw_watch_alloc(void) +{ + int max_watch =3D ksw_get_config()->max_watch; + struct ksw_watchpoint *wp; + int success =3D 0; + int ret; + + init_llist_head(&free_wp_list); + + //max_watch=3D0 means at most + while (!max_watch || success < max_watch) { + wp =3D kzalloc(sizeof(*wp), GFP_KERNEL); + if (!wp) + return success > 0 ? success : -EINVAL; + + hw_breakpoint_init(&wp->attr); + wp->attr.bp_addr =3D (ulong)&holder; + wp->attr.bp_len =3D sizeof(ulong); + wp->attr.bp_type =3D HW_BREAKPOINT_W; + wp->event =3D register_wide_hw_breakpoint(&wp->attr, + ksw_watch_handler, wp); + if (IS_ERR((void *)wp->event)) { + ret =3D PTR_ERR((void *)wp->event); + kfree(wp); + return success > 0 ? success : ret; + } + llist_add(&wp->node, &free_wp_list); + mutex_lock(&all_wp_mutex); + list_add(&wp->list, &all_wp_list); + mutex_unlock(&all_wp_mutex); + success++; + } + + return success; +} + +static void ksw_watch_free(void) +{ + struct ksw_watchpoint *wp, *tmp; + + mutex_lock(&all_wp_mutex); + list_for_each_entry_safe(wp, tmp, &all_wp_list, list) { + list_del(&wp->list); + unregister_wide_hw_breakpoint(wp->event); + kfree(wp); + } + mutex_unlock(&all_wp_mutex); +} + +int ksw_watch_init(void) +{ + int ret; + + ret =3D ksw_watch_alloc(); + if (ret <=3D 0) + return -EBUSY; + + + return 0; +} + +void ksw_watch_exit(void) +{ + ksw_watch_free(); +} --=20 2.43.0 From nobody Thu Oct 2 01:01:41 2025 Received: from mail-pj1-f54.google.com (mail-pj1-f54.google.com [209.85.216.54]) (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 1F33E2459E7 for ; Tue, 30 Sep 2025 02:45:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759200302; cv=none; b=qVqPeTpsOVXjYm6ch8/ieEnlx3S3tLg67HHgvnpfss2DDRPi3GKjW5pyD2YZAxDJv9afGVqoowtztKG5a9FTMfax3nQcMCgLKynHtuRV9p3vaOSRiB3ALhk1MQ6ZtUijPC3niV13a8+ifthpk4LSbXVt7OI3F8OYHgqFxsWSuU0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759200302; c=relaxed/simple; bh=9SDUPEZSlMV40T53tfVBMh3pQptZtl+KprWlK44Wx6c=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=qmlB5LOJDs9gnmEkitk67BEgvpf73un6zFuQanJFvS6eKaucE3WUsKUi4oWUC8rx3pdklAELUIGHjPJcx7NkhdvnNIMQOKKo/HgBTeaOA/NjXeGP0gi5VoigQlMzwNHbnrm67LbdRz+6LQmiGwuQV8cYvNMCJ0aG5wsUsBNeKh0= 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=R3xq3Lxq; arc=none smtp.client-ip=209.85.216.54 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="R3xq3Lxq" Received: by mail-pj1-f54.google.com with SMTP id 98e67ed59e1d1-329a41dc2ebso4463266a91.3 for ; Mon, 29 Sep 2025 19:45:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1759200300; x=1759805100; 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=EtGUQc6HOhuSXywhIDZ+AUqHUInlRCKup6JfN/4+ZEc=; b=R3xq3LxqEZxsiGZGYi3bq6u9DZ2mJuAa5YCT0IsFAPS34YFd2Rubj3uXbjrvFN/t3O P69i8+OerthgXZT8E+gWCvYQc+wQdd1pFNLfuJHewLBA5LMLgEl5VP7T3SsopcqUaBSs Qx9lAEjWasG6aPolnsyvatg0QBWDXvMgCGnlVJd/InvwHesw+lApPojdax/ZD5VwZtHC 6ZdOxFkAmtUdWjee3RHkSxvJq8LmyIgKtgCRCxCqTIVf5g6PRYO7ZSZkXttRCe4gfUJ5 6rP4IirgYRWR3zArJS+u7DncpyRvZmexxcKYBVzkV/Mx7PVVGSB9O30JBbkzfrka7ojH G/eA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1759200300; x=1759805100; 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=EtGUQc6HOhuSXywhIDZ+AUqHUInlRCKup6JfN/4+ZEc=; b=dZ6eknRtWMRbqGoZz7ZDqg6naRuoUpcFxPMtIJ5+SaIjUPqBaOLAdJUdXfE4r/pvXS LB+fFtjtutq/mzAtPNMMFEevjXbUH8leLrgiJx9OkoschY6mive7HWUd1VXmwPyO9c3O wMI8j5OBJmcntcRwWHcZ08cj/drfiT5NkMr2u6viLIV9VDPyy0v8t3N7HObwESIAe32M hEzxLMDTKMr5AngNXsrzkABKv2AQ+gcTPaJXXJkQ9spQWTmA92dXDQ4bzsFM6kooH7MP e2oBWGcp/lWFOAfol/Uqyryvr20t/Izpn854yrOELOS6suLa1Lv74LcdSqFiR64wmdZd QP0w== X-Forwarded-Encrypted: i=1; AJvYcCXEJXgDBUtqQ1mVW1u6RoRv08JXnSZV3XBE/eo4VR/teXdfYpKyyLpi0Ekg3K0VJ/9OrlLkDXNE7ftRT9U=@vger.kernel.org X-Gm-Message-State: AOJu0YwlXa/IoGNIFv1r165Rc8VV+t9O+/qc5MRgxkYQGLI0JUdBCs7U 0AwkEmXmbj8n7J5WFXD11Qs+A9hbs7S+Bwcqjv/omxmBwdZ56BjWj0pf X-Gm-Gg: ASbGncuWEjqfHzaRP3R31Sh+377e+kM6Vsp4SdzJfRG3Ot/NsHrauC30cewH3KtoMHs macl/ozTAlI+M1j2Okr8W9MuT6Yi+aD6jbesuReW+mRxMFD9zKR6y54RUnslsQJBwQ1xIy9sdZk k5BlttyXbLON83/0bRBPC+Lb49B/pCNcimczuDsq6PFMOSoomGmuDrYYSz2/WLpdnu/MlZPxMhI 590gdVKHYsvIC7BxXTUM+y2FqF1QqxhvWs9D3S/O8RO827Hu5ae+fIxr+OlSxj1VmZwu8udRLot Nl9BAvUNejUge55XcvI6JIE9krqZLCCatz7mAZRUZo/jwCd+G4BCoFz1GVzgwfYbkc4gT07zzh4 kEq7ql6WEQHS2yPyFEt43W1Ua3u+xQpuwFfywQ9YAuN9njKh9F89vgXxYStoOh60xkw== X-Google-Smtp-Source: AGHT+IE6QAYldFReTbNhwKklFYNdCEVJpgfxwTpvKILLxf8DP4CkMPu7V/vifWE/k6I2u8vpWc3E8w== X-Received: by 2002:a17:90b:1b4d:b0:330:797a:f504 with SMTP id 98e67ed59e1d1-3342a215b70mr18813357a91.3.1759200300239; Mon, 29 Sep 2025 19:45:00 -0700 (PDT) Received: from localhost ([45.142.167.196]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-338387255adsm2766677a91.19.2025.09.29.19.44.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Sep 2025 19:44:59 -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 v6 08/23] mm/ksw: Add atomic watchpoint management api Date: Tue, 30 Sep 2025 10:43:29 +0800 Message-ID: <20250930024402.1043776-9-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250930024402.1043776-1-wangjinchao600@gmail.com> References: <20250930024402.1043776-1-wangjinchao600@gmail.com> 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" Add three functions for atomic lifecycle management of watchpoints: - ksw_watch_get(): Acquires a watchpoint from a llist. - ksw_watch_on(): Enables the watchpoint on all online CPUs. - ksw_watch_off(): Disables the watchpoint and returns it to the llist. For cross-CPU synchronization, updates are propagated using direct modification on the local CPU and asynchronous IPIs for remote CPUs. Signed-off-by: Jinchao Wang --- mm/kstackwatch/kstackwatch.h | 4 ++ mm/kstackwatch/watch.c | 85 +++++++++++++++++++++++++++++++++++- 2 files changed, 88 insertions(+), 1 deletion(-) diff --git a/mm/kstackwatch/kstackwatch.h b/mm/kstackwatch/kstackwatch.h index 4eac1be3b325..850fc2b18a9c 100644 --- a/mm/kstackwatch/kstackwatch.h +++ b/mm/kstackwatch/kstackwatch.h @@ -38,11 +38,15 @@ const struct ksw_config *ksw_get_config(void); /* watch management */ struct ksw_watchpoint { struct perf_event *__percpu *event; + call_single_data_t __percpu *csd; struct perf_event_attr attr; struct llist_node node; // for atomic watch_on and off struct list_head list; // for cpu online and offline }; int ksw_watch_init(void); void ksw_watch_exit(void); +int ksw_watch_get(struct ksw_watchpoint **out_wp); +int ksw_watch_on(struct ksw_watchpoint *wp, ulong watch_addr, u16 watch_le= n); +int ksw_watch_off(struct ksw_watchpoint *wp); =20 #endif /* _KSTACKWATCH_H */ diff --git a/mm/kstackwatch/watch.c b/mm/kstackwatch/watch.c index 1d8e24fede54..887cc13292dc 100644 --- a/mm/kstackwatch/watch.c +++ b/mm/kstackwatch/watch.c @@ -31,11 +31,83 @@ static void ksw_watch_handler(struct perf_event *bp, panic("Stack corruption detected"); } =20 +static void ksw_watch_on_local_cpu(void *info) +{ + struct ksw_watchpoint *wp =3D info; + struct perf_event *bp; + ulong flags; + int cpu; + int ret; + + local_irq_save(flags); + cpu =3D raw_smp_processor_id(); + bp =3D per_cpu(*wp->event, cpu); + if (!bp) { + local_irq_restore(flags); + return; + } + + ret =3D modify_wide_hw_breakpoint_local(bp, &wp->attr); + local_irq_restore(flags); + WARN(ret, "fail to reinstall HWBP on CPU%d ret %d", cpu, ret); +} + +static void ksw_watch_update(struct ksw_watchpoint *wp, ulong addr, u16 le= n) +{ + call_single_data_t *csd; + int cur_cpu; + int cpu; + + wp->attr.bp_addr =3D addr; + wp->attr.bp_len =3D len; + + cur_cpu =3D raw_smp_processor_id(); + for_each_online_cpu(cpu) { + /* remote cpu first */ + if (cpu =3D=3D cur_cpu) + continue; + csd =3D per_cpu_ptr(wp->csd, cpu); + smp_call_function_single_async(cpu, csd); + } + ksw_watch_on_local_cpu(wp); +} + +int ksw_watch_get(struct ksw_watchpoint **out_wp) +{ + struct ksw_watchpoint *wp; + struct llist_node *node; + + node =3D llist_del_first(&free_wp_list); + if (!node) + return -EBUSY; + + wp =3D llist_entry(node, struct ksw_watchpoint, node); + WARN_ON_ONCE(wp->attr.bp_addr !=3D (u64)&holder); + + *out_wp =3D wp; + return 0; +} +int ksw_watch_on(struct ksw_watchpoint *wp, ulong watch_addr, u16 watch_le= n) +{ + ksw_watch_update(wp, watch_addr, watch_len); + return 0; +} + +int ksw_watch_off(struct ksw_watchpoint *wp) +{ + WARN_ON_ONCE(wp->attr.bp_addr =3D=3D (u64)&holder); + ksw_watch_update(wp, (ulong)&holder, sizeof(ulong)); + llist_add(&wp->node, &free_wp_list); + return 0; +} + static int ksw_watch_alloc(void) { int max_watch =3D ksw_get_config()->max_watch; struct ksw_watchpoint *wp; + call_single_data_t *csd; int success =3D 0; + int cpu; int ret; =20 init_llist_head(&free_wp_list); @@ -45,6 +117,16 @@ static int ksw_watch_alloc(void) wp =3D kzalloc(sizeof(*wp), GFP_KERNEL); if (!wp) return success > 0 ? success : -EINVAL; + wp->csd =3D alloc_percpu(call_single_data_t); + if (!wp->csd) { + kfree(wp); + return success > 0 ? success : -EINVAL; + } + + for_each_possible_cpu(cpu) { + csd =3D per_cpu_ptr(wp->csd, cpu); + INIT_CSD(csd, ksw_watch_on_local_cpu, wp); + } =20 hw_breakpoint_init(&wp->attr); wp->attr.bp_addr =3D (ulong)&holder; @@ -54,6 +136,7 @@ static int ksw_watch_alloc(void) ksw_watch_handler, wp); if (IS_ERR((void *)wp->event)) { ret =3D PTR_ERR((void *)wp->event); + free_percpu(wp->csd); kfree(wp); return success > 0 ? success : ret; } @@ -75,6 +158,7 @@ static void ksw_watch_free(void) list_for_each_entry_safe(wp, tmp, &all_wp_list, list) { list_del(&wp->list); unregister_wide_hw_breakpoint(wp->event); + free_percpu(wp->csd); kfree(wp); } mutex_unlock(&all_wp_mutex); @@ -88,7 +172,6 @@ int ksw_watch_init(void) if (ret <=3D 0) return -EBUSY; =20 - return 0; } =20 --=20 2.43.0 From nobody Thu Oct 2 01:01:41 2025 Received: from mail-pf1-f181.google.com (mail-pf1-f181.google.com [209.85.210.181]) (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 53CEF2459D1 for ; Tue, 30 Sep 2025 02:45:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759200308; cv=none; b=P23Xj8hT/CNvFeVcRVV/rZqJBrQSZ6qHsSoW4ZB1HdqxPOfuYJkSWnEoDYwXS0WecQC0jvXEr+1CCNrXGu7mSDD/j8OzEwyWqX8MiZr66qt6VdTfovONfFKAr9WyeHLflyue/LkR+Kop61fFUzN7tDPZwOjDGM62elIqHEeZmms= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759200308; c=relaxed/simple; bh=0RaB9b3mDxARpzNAU+b9+OM/53UguV9OX02ut00avNs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=LokIvYuZaeyCGlBSzK97pTts2Ovy/7g1lIVleiSwMyi/QIbIRkLaWaw1NhljerXStRQ40Xu5VzuOfK+9mfS8hzHjW++BW4RSa/tg5grlNGVjXz35WlSkcO7XU2tKrTOTVQfRFCUaeGLEHD6S+gboZtaLQmsVlxfkFFdm0XRpR5I= 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=MmTgSTCi; arc=none smtp.client-ip=209.85.210.181 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="MmTgSTCi" Received: by mail-pf1-f181.google.com with SMTP id d2e1a72fcca58-78100be28easo3958584b3a.1 for ; Mon, 29 Sep 2025 19:45:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1759200305; x=1759805105; 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=8p2Xfne7CGpLjN/MkaU3Ee28S3aCNgQ2oxnJpFebIbs=; b=MmTgSTCivQdUN6WGxhnHkpN5oRIKQd+LSfqs/sOS1wy2A8Aebb4kOPRHOFYP3Pye7z okcZ63/Z8oiXVqnARwwKT96xgQmpBZbY+wkkiB4SSSIYm1ClzYVE+/8XgMwVfFzunb+o XvcryWYV3OnknQgXuLeGqq/shiIkNcaQ0pXvEwa6uHBUtTc6CO7nO5P9ET3F1STh5Kjc Wv0H71Sbx8+0eaXFVfwdROUoeWJOWYekKay/Rifb38+oU2cqbXnZQc33Yqnqs21fy6rv 6JMUsBzxNF1hZRisA1VjjCVCTayeXC8zgP0SvJCR7PSv0VSdcEkaQkq7wsxKea2CKhui HyIw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1759200305; x=1759805105; 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=8p2Xfne7CGpLjN/MkaU3Ee28S3aCNgQ2oxnJpFebIbs=; b=c7TwPUwi0YaFvqIPp7ypbsETrQf7DXuQXBCmSWADarxdVP+mKwcXUTFS0kdNvSfmBQ l7drhiSsskFQKaMtiaOm3TowxUFujdGS9gDwDJFo1kINjP1YUeddgY/SYF3PantFXvPm IMma6b2tI2nSeRC6sfMB6Fb1db4jHtfm7NmTki7YqF573KZml/bZPoOZwLdoG6KuUdTn l3uhKfM+2btRTxsztECeytDM1C+ioi3q19YlK/7Ro8D7A9UOJ4DqElNlTNjAYQ9LpJ9N y8TpZN9Gnmu+zegEmE1Hyb+9XgGnYIiuZ70Byg/PA9kiS7iVtfJUrFOagBi6juyoynV0 GGZA== X-Forwarded-Encrypted: i=1; AJvYcCW4yrx+XwuZHOGT5hZi/zgID9LMkGPiX5gipn/KG8ZyhRvgJN94gDywTIgyqJYvDZ+deXHgpGJluDUHyf0=@vger.kernel.org X-Gm-Message-State: AOJu0YzjRNe8QEJ60hCBPNkMt10Mw8sALAr4+eHV8cv+UpeHYDSxU2SU WXoVXNBuL6PC1AjZ23VASSVERMxCPJ/jMGkGMxaQ5pNfygJPMtXmDe0j X-Gm-Gg: ASbGncu6uDFNfDxOzB1/oI4z68Q+FBEsPD3Vzw01Fm/LcHdi7dKCLHINEhgQ+MPhMfI MFc7YepbiCovR3L6JONR8JS8Pjy0T1p32mefIvdnBWb/fhshgdNMOXejVZbk+QFEduaWnOLThbP 9tKhgjK+GiT1BuH8VtdNQqM0+Xdy6rXW8qxN7ePQS4kdiCBRlDuOPex5tj62vufb/37W5vv4fAb kneVW+JZpoLEiZlfEZmgihtsxg+2r2xU2ys+ykp8JzmaYYTXKdsQ9/SeztfjvwgcvmCQaxizKI3 mwVdYuM9gpnl7PnsWldeoA2dRLd+bvM6Qz0IqTZUAGxuDAzSNYyrfZHtYkrOKjwB7CO8QQe76/J LfRfC8hlAHUn7KJTOwvRrg/2TEfdqNXOiQHfNLgZ2oiSjKflKYLVQBASKJRtrvNdiwQ== X-Google-Smtp-Source: AGHT+IGPdLJDAcFgGXBMapnRTLkbwOuAH98GZaW3SdGH9OxArUIFVK7BxMIb+p319lKI1/5kl2O6lQ== X-Received: by 2002:a05:6a00:1404:b0:782:d4b6:f5e5 with SMTP id d2e1a72fcca58-782d4b6f88amr8934209b3a.13.1759200305238; Mon, 29 Sep 2025 19:45:05 -0700 (PDT) Received: from localhost ([45.142.167.196]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-7822f628080sm6431314b3a.89.2025.09.29.19.45.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Sep 2025 19:45:04 -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 v6 09/23] mm/ksw: ignore false positives from exit trampolines Date: Tue, 30 Sep 2025 10:43:30 +0800 Message-ID: <20250930024402.1043776-10-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250930024402.1043776-1-wangjinchao600@gmail.com> References: <20250930024402.1043776-1-wangjinchao600@gmail.com> 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" Because trampolines run after the watched function returns but before the exit_handler is called, and in the original stack frame, so the trampoline code may overwrite the watched stack address. These false positives should be ignored. is_ftrace_trampoline() does not cover all trampolines, so add a local check to handle the remaining cases. Signed-off-by: Jinchao Wang --- mm/kstackwatch/watch.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/mm/kstackwatch/watch.c b/mm/kstackwatch/watch.c index 887cc13292dc..722ffd9fda7c 100644 --- a/mm/kstackwatch/watch.c +++ b/mm/kstackwatch/watch.c @@ -2,6 +2,7 @@ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt =20 #include +#include #include #include #include @@ -18,10 +19,46 @@ bool panic_on_catch; module_param(panic_on_catch, bool, 0644); MODULE_PARM_DESC(panic_on_catch, "panic immediately on corruption catch"); =20 +#define TRAMPOLINE_NAME "return_to_handler" +#define TRAMPOLINE_DEPTH 16 + +/* Resolved once, then reused */ +static unsigned long tramp_start, tramp_end; + +static void ksw_watch_resolve_trampoline(void) +{ + unsigned long sz, off; + + if (likely(tramp_start && tramp_end)) + return; + + tramp_start =3D kallsyms_lookup_name(TRAMPOLINE_NAME); + if (tramp_start && kallsyms_lookup_size_offset(tramp_start, &sz, &off)) + tramp_end =3D tramp_start + sz; +} + +static bool ksw_watch_in_trampoline(unsigned long ip) +{ + if (tramp_start && tramp_end && ip >=3D tramp_start && ip < tramp_end) + return true; + return false; +} static void ksw_watch_handler(struct perf_event *bp, struct perf_sample_data *data, struct pt_regs *regs) { + unsigned long entries[TRAMPOLINE_DEPTH]; + int i, nr =3D 0; + + nr =3D stack_trace_save_regs(regs, entries, TRAMPOLINE_DEPTH, 0); + for (i =3D 0; i < nr; i++) { + //ignore trampoline + if (is_ftrace_trampoline(entries[i])) + return; + if (ksw_watch_in_trampoline(entries[i])) + return; + } + pr_err("=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D KStackWatch: Caught stack corrupti= on =3D=3D=3D=3D=3D=3D=3D\n"); pr_err("config %s\n", ksw_get_config()->user_input); dump_stack(); @@ -168,6 +205,7 @@ int ksw_watch_init(void) { int ret; =20 + ksw_watch_resolve_trampoline(); ret =3D ksw_watch_alloc(); if (ret <=3D 0) return -EBUSY; --=20 2.43.0 From nobody Thu Oct 2 01:01:41 2025 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 C1EC1216E32 for ; Tue, 30 Sep 2025 02:45:10 +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=1759200312; cv=none; b=BLU1CCZPsfSISuHqbvdgwQGG08/eSJHCxA1Pq9pqfqzicJyZp/hgUcX7FQ2X0JUVHWAjPXhNFKOwHghSEy8omOl4s6vgb411p/r1emwX7XCx1UhbHuSpwmZrltSkgV9rLfAcAatpmrIB5TkxEdtTGBKgtr4TZQ5tQ3JgsPUXdPs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759200312; c=relaxed/simple; bh=EtuMaKP8CWfi9pjY9FcQGV9HEHi4WtiOKMPT566R1T4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=pIKaTveVQHZhkhuGubzphPF3178kqrvrwBYNnXrTnApUVO+/jFoNCHgqqrBxL62whyu3FAX4Zc6x/mdmqsnh8Kv7dMt8p/AD6VQPJVOqVDQhG4DatxarxWF07QLQLz5sRghHpzEotcb9bf+Tes4suE0HmIodGR5vp+rcs0W9qFM= 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=GsITOqqY; 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="GsITOqqY" Received: by mail-pf1-f172.google.com with SMTP id d2e1a72fcca58-781ea2cee3fso2301895b3a.0 for ; Mon, 29 Sep 2025 19:45:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1759200310; x=1759805110; 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=VplC5p74+BCL3Xjzqw2UL/AL1hevTQUKrGPaYOT40mY=; b=GsITOqqYnKqZ1zRX4YByuGKp8skPIoPTvM2JpobPjAuYfxoIK8XcoyyL/slPo7DPzx g7QcrpZkln2+aaFM9C/a0nzNKl2IVdXxpsao+IuZoWj2ncebpODIgQAQp/vTbOasgvvc wk2gJDEUdhKiG8C6CXEu30npaYDNHzDVYv8MWtf3l1zz/p36tUiYM6C74IovR1cQblNg 879SZoWJ94tFnPnmxyqFA6605yTBqNmybm0vCSiTxsky7t+JL+mrFVnzSSAjH094i/Hp ii44jnyfE427PJEBd+VWOGIdWCQlQ2Tb5PnbzLaaoAXIxTCyWc06a+AxacNyQSC5R/ro Gdww== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1759200310; x=1759805110; 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=VplC5p74+BCL3Xjzqw2UL/AL1hevTQUKrGPaYOT40mY=; b=UU65O3PqfVlq15BHtSjOkCQzeV0TrPMmgJINSstKbZKqO16qi3lGHZSyvJLfKe12yY 8uNPUScUJDLgQiRLY7M5UY+sahIQnQ2tRzwYznAGvxeJ402zNPoN3GTK/aMQGaD5dttv cLFbHNAexoVXhMUlNQKcZLC7/s/JsuZnOPCiQ1Z0BxonWkrGnAFuuVYGWdTsA3fKKPoF WV18l8BBtcQK4M16NRy6kvaJTF6FTQZ/leuSzugvZSewFJoniZdazy52HPrhcW7oIl3y 8MMivftPCdf3L8guc3SPCXoPTC99LjgkvF01tUxjEarj0QrCgU3Ifwuc2VQpQ0MxcaQx HAfA== X-Forwarded-Encrypted: i=1; AJvYcCX83SBLo2s96Ni+ueH8DYc6HsYr3jHJhxZSfbKvehGP+r1lUGL1T3P6n9IBl/RoUycOgzoNsw6nfF+wnao=@vger.kernel.org X-Gm-Message-State: AOJu0YzhDdDxOQWwFBuiw0oNWAFU73MTKCKG0wL6CxdK6c+6YdEDRS66 eyz7tSZcETjLuFPh6HMNxjFBPBG9xOe7Tv8t+1BaTmV1ZKHZUancNIAV X-Gm-Gg: ASbGncsajmIruJS58cQe5nltOJYk6e3z/gFE1x9pFDPrNZycGsYX6VgyG+9y8sb07Ao 13cAh0vgjZg/c7iIg/pOVKhGxGb5HRxXvYVVNx95UZOefPEs36l7QIZ1/qPKw5pDTcvyKTfZ87I mjeyWz5CriXoRFr5mG/lmZ5lT9wU02vDnYrC/x+v6yxoyfgm9oBzwp2y8O5gTdBexw0CpAoRwCC 79Jfgz82yRfyccGkNZNPDvvmlrRKfExl3eyfROphxBeH7hNTOhvUL/NOYQbVMU9qdRm5YWEhRMC YvyemP4uVuNVdsXlY8jhZKZOAURV0jRYBpXvFnXOplp8jGhvGxFpOeZSLOogjSbDGVcAcxu9NW6 aRQJhcNSSTfYpf1FJ0arQk3AiiLndqEVPxjaJ5BsqIP06sjkxucVzHX12KtzGfCcBs1sosqngXR Yt X-Google-Smtp-Source: AGHT+IFzdUzonqFGpCtXDfhyMuXTs8sxTYcPas1DIEDImQCxbrq0zIYK9+c7MQCk4izaUyzaG6ziGA== X-Received: by 2002:a05:6a21:e098:b0:250:f80d:b355 with SMTP id adf61e73a8af0-2e7cdd9ffe2mr5395317637.33.1759200309894; Mon, 29 Sep 2025 19:45:09 -0700 (PDT) Received: from localhost ([45.142.167.196]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-78102b23206sm12485889b3a.58.2025.09.29.19.45.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Sep 2025 19:45:09 -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 v6 10/23] mm/ksw: support CPU hotplug Date: Tue, 30 Sep 2025 10:43:31 +0800 Message-ID: <20250930024402.1043776-11-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250930024402.1043776-1-wangjinchao600@gmail.com> References: <20250930024402.1043776-1-wangjinchao600@gmail.com> 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" Register CPU online/offline callbacks via cpuhp_setup_state_nocalls() so stack watches are installed/removed dynamically as CPUs come online or go offline. When a new CPU comes online, register a hardware breakpoint for the holder, avoiding races with watch_on()/watch_off() that may run on another CPU. The watch address will be updated the next time watch_on() is called. Signed-off-by: Jinchao Wang --- mm/kstackwatch/watch.c | 52 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/mm/kstackwatch/watch.c b/mm/kstackwatch/watch.c index 722ffd9fda7c..f32b1e46168c 100644 --- a/mm/kstackwatch/watch.c +++ b/mm/kstackwatch/watch.c @@ -89,6 +89,48 @@ static void ksw_watch_on_local_cpu(void *info) WARN(ret, "fail to reinstall HWBP on CPU%d ret %d", cpu, ret); } =20 +static int ksw_watch_cpu_online(unsigned int cpu) +{ + struct perf_event_attr attr; + struct ksw_watchpoint *wp; + call_single_data_t *csd; + struct perf_event *bp; + + mutex_lock(&all_wp_mutex); + list_for_each_entry(wp, &all_wp_list, list) { + attr =3D wp->attr; + attr.bp_addr =3D (u64)&holder; + bp =3D perf_event_create_kernel_counter(&attr, cpu, NULL, + ksw_watch_handler, wp); + if (IS_ERR(bp)) { + pr_warn("%s failed to create watch on CPU %d: %ld\n", + __func__, cpu, PTR_ERR(bp)); + continue; + } + + per_cpu(*wp->event, cpu) =3D bp; + csd =3D per_cpu_ptr(wp->csd, cpu); + INIT_CSD(csd, ksw_watch_on_local_cpu, wp); + } + mutex_unlock(&all_wp_mutex); + return 0; +} + +static int ksw_watch_cpu_offline(unsigned int cpu) +{ + struct ksw_watchpoint *wp; + struct perf_event *bp; + + mutex_lock(&all_wp_mutex); + list_for_each_entry(wp, &all_wp_list, list) { + bp =3D per_cpu(*wp->event, cpu); + if (bp) + unregister_hw_breakpoint(bp); + } + mutex_unlock(&all_wp_mutex); + return 0; +} + static void ksw_watch_update(struct ksw_watchpoint *wp, ulong addr, u16 le= n) { call_single_data_t *csd; @@ -210,6 +252,16 @@ int ksw_watch_init(void) if (ret <=3D 0) return -EBUSY; =20 + ret =3D cpuhp_setup_state_nocalls(CPUHP_AP_ONLINE_DYN, + "kstackwatch:online", + ksw_watch_cpu_online, + ksw_watch_cpu_offline); + if (ret < 0) { + ksw_watch_free(); + pr_err("Failed to register CPU hotplug notifier\n"); + return ret; + } + return 0; } =20 --=20 2.43.0 From nobody Thu Oct 2 01:01:41 2025 Received: from mail-pf1-f175.google.com (mail-pf1-f175.google.com [209.85.210.175]) (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 A9A4A25487B for ; Tue, 30 Sep 2025 02:45:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759200318; cv=none; b=TwI6+e+FLd3g0zQjY0fts5ZoOmbyguwNZy8LbQSpCmo1gpcUHLqB4RURBNMhbI6JDN6LcH5B0xxXLVgp4FWgVrNY3d1eM/SQDKKTTp64xV90REi2iEGmfJIWvkO7DRprDz0QJnhI4BVAgo2FUG4OJNp0H7aTXGowuU+j1emXx9A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759200318; c=relaxed/simple; bh=wmwmRtcPH4ST6Dm0G2/AFHsMnlz3q9k9yRWhyo1wI/Y=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Wz4SbHKJn1xyDDVHhZbXYSW0z/RmMvG0KAp1mdMlmV/05W4NAxvKwLM7Jym42c2zkfn/CzdtUUHfZbJ+T1g7hKi+WIV4IeSoBPIuvSRQcN6TNNphk5rOHTf0PoV3GDThQ8btri8Q0TxSQwThXyMYPZDk+k2vi//NtjFiFGlfhqE= 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=KMQ3RZdc; arc=none smtp.client-ip=209.85.210.175 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="KMQ3RZdc" Received: by mail-pf1-f175.google.com with SMTP id d2e1a72fcca58-7811a5ec5b6so2800946b3a.1 for ; Mon, 29 Sep 2025 19:45:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1759200316; x=1759805116; 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=E4BKEfc9ax2ksTKKBAwbjubQHvBiDjA54WMJGQTptLg=; b=KMQ3RZdckAmme0jUOCXJIopgemB2Ja56Kpmz+pbEeM0xoR/HYAly3J0SYhU6acxg9c TE1YANvW5GLqxlokWaBsC94u3Df3Poh7J2S51JRvuFVp5QAN4u0/5Bk78DnZflaGAIF3 GaAHFrt/JiI3GGcSiAZQKNFeq5N/scmw79xffzCMMwoXlLpaig1EUpBnmgp1Xiw4lE+W yRRuhICYSgLsqg2mBt8118beN1+fESg9GutgwL7xJ4G0koaRA8mIIogGpHVqAX7Rf4LP cnwMekiQj0fEx2e6tzstCrH0wuSOhn7ui5xrX7TGCEuEe800b1rM4DQqwnuwfGOHLdgI wlLg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1759200316; x=1759805116; 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=E4BKEfc9ax2ksTKKBAwbjubQHvBiDjA54WMJGQTptLg=; b=OswxC6gG4JbHvcLKTR9prT3Om/40ok6WWHk2RUGmzijEQi/IjDH1fVaR61DKqSXTv2 V2fRJSv7fn68nqFqjOC+uhLP8xupcr3LRFdqnKnuAUYVlsgfBx2VgfYOoIIrbcHt7Fhs JmNo9vY+0p0FObR3NFefbVJgMvEfJB5OOWDpPxMAQSw6y4TKbDmUS+gdk0CoMOrvLeaS 4frMy76cJPstN4dGxBlhh28cSvpoJ97O7bdhbvQAkUMBpFRsZQ7qWEUlhtrN9WuIv6Tf +PpA/Rtp3EeUfGdSdejsg5OI5sXvqiHhqJrIJbUQqysHk6KGizNaEoJ+AEdBgCK+wBgI W3Sw== X-Forwarded-Encrypted: i=1; AJvYcCVGnthYPJP2aZYpkZhF1M/SuqzbouLNXYhbuZ04mSjwDYN1KnnEVHDkRXibRG1eWk50xJ3hvuFExhzKF8A=@vger.kernel.org X-Gm-Message-State: AOJu0YwpjOGkw2knjxTka4aLuCpqpJgo6ag3D2jg95ZrlDjvW+FSUxXj WwuKScszzmswXoJc+ViaTOorsiTpZX8+g5dfmpoSUGyh74ckUVX5nZ2k X-Gm-Gg: ASbGncs66hTyOeh16TYWwCT2lGyKRtiHdEdDamuB9JnBV+8c0ManAOcP5MPCIqC8sSz sj/3erH/tmD8ZJG5K6bnyguWEINaIF+GOjU3zq3oJnj01oTkjsfEzE/c7Dl5akHCIDUHvA8Qbve +dtVGLR2gyjiWAdta3ir3b5rSWzMpTVoyyVIn8dCY2uoiPqXAqQqP8nNht5D5D/dp217Zw/ifUj GL3cV3N/DmDU4X58tQtUeMLqSA07jNPs/f7mXz2olxysgNCwm8isuduBVoSg0vLSEVwSGJ9vKGL zscbpYa/3DwrAEUQVxrZqMc/OJr7pu3p7o1Tjn4ZJ0E08faKH+TOwGq1brtEzjw0UVGUA3nxPHS 9ixl84qHbNxynwko5rbparaUBhf3BFLfPhSu1PyGDYLWzIuqALNT2C8FF0iZROI2RPkQDT+Y6PP +M8Lwhs0aEcrU= X-Google-Smtp-Source: AGHT+IEQuyQ0WfSSzPcc+c258KMZgmg4lZ9MhFnyLGeSTv6phqmEXsURuXiHXbyU/qbGHk1KY6eV1g== X-Received: by 2002:a05:6a21:3296:b0:2b5:9c2:c584 with SMTP id adf61e73a8af0-31772a179dcmr3208370637.26.1759200315810; Mon, 29 Sep 2025 19:45:15 -0700 (PDT) Received: from localhost ([45.142.167.196]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-b57c557418csm12399859a12.30.2025.09.29.19.45.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Sep 2025 19:45:15 -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 v6 11/23] sched: add per-task context Date: Tue, 30 Sep 2025 10:43:32 +0800 Message-ID: <20250930024402.1043776-12-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250930024402.1043776-1-wangjinchao600@gmail.com> References: <20250930024402.1043776-1-wangjinchao600@gmail.com> 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" Introduce struct ksw_ctx to enable lockless per-task state tracking. This is required because KStackWatch operates in NMI context (via kprobe handler) where traditional locking is unsafe. Signed-off-by: Jinchao Wang --- include/linux/kstackwatch_types.h | 14 ++++++++++++++ include/linux/sched.h | 5 +++++ 2 files changed, 19 insertions(+) create mode 100644 include/linux/kstackwatch_types.h diff --git a/include/linux/kstackwatch_types.h b/include/linux/kstackwatch_= types.h new file mode 100644 index 000000000000..2b515c06a918 --- /dev/null +++ b/include/linux/kstackwatch_types.h @@ -0,0 +1,14 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _LINUX_KSTACK_WATCH_TYPES_H +#define _LINUX_KSTACK_WATCH_TYPES_H +#include + +struct ksw_watchpoint; +struct ksw_ctx { + struct ksw_watchpoint *wp; + ulong sp; + u16 depth; + u16 generation; +}; + +#endif /* _LINUX_KSTACK_WATCH_TYPES_H */ diff --git a/include/linux/sched.h b/include/linux/sched.h index f8188b833350..6935ee51f855 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -1481,6 +1482,10 @@ struct task_struct { struct kmsan_ctx kmsan_ctx; #endif =20 +#if IS_ENABLED(CONFIG_KSTACK_WATCH) + struct ksw_ctx ksw_ctx; +#endif + #if IS_ENABLED(CONFIG_KUNIT) struct kunit *kunit_test; #endif --=20 2.43.0 From nobody Thu Oct 2 01:01:41 2025 Received: from mail-pf1-f175.google.com (mail-pf1-f175.google.com [209.85.210.175]) (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 C70DF2248B9 for ; Tue, 30 Sep 2025 02:45:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759200326; cv=none; b=JqlN1FWk/OrYmWBzYWixG6ugJNdHD+FX3POsD2dhVgjeWvCN2OjvRXoDfm33F1s7Vh0ZDeSvAJeHhbZzjRzprGjN8uHVek1ZODJ6OGo5Xox6V0mQD3xcOMhs+Lq9qzHpJUgmhhOP+DFZUh1ByS5FVyC/CvTM+vK/4SBrzmiBqqQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759200326; c=relaxed/simple; bh=fgMlahiCQseGsOMwUDeQip37398eJhQex5YpJdEa4RY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=F5j+hcNDirHvJVmjgdV/ujqWFTssuGfO7iJDWaPk4OvQk9IWVSSnbvtqkuJBEGVj30Vx/JO+FKCvevuO8O8GbtsCiLRBVO+V6taSaCWL/WSQqu7vrYSy+rTtKbiDets1V06RjUH6uEl4EI50VTSU4YBLqRfMQzZevl7PCjMtoGM= 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=No9OfCZX; arc=none smtp.client-ip=209.85.210.175 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="No9OfCZX" Received: by mail-pf1-f175.google.com with SMTP id d2e1a72fcca58-782bfd0a977so1881254b3a.3 for ; Mon, 29 Sep 2025 19:45:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1759200324; x=1759805124; 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=Zjvk/jwcgtCF9TRiT6Fv94jzQiYOsdOhmjAblUevyNs=; b=No9OfCZX9owieXBcRX+B6gSVclHzBzJQOdWfoZW1dw/BKdM/Q0KQAv2vYG6qhtGT3Q UiJVzXVzY2mfNRCQoaG6UyHtAI393lh8+dW8+9xeMJ/Vka4UQVCsIE24O4q06u5zhIB/ VIj6CvpUhfWZIkmqbsoAJ+tp5Hz3iF+Q3E722TWAiEEhUZd23IUBRHyTR/FhvioOgjHL YOOIJ6rZmPCltya7R4+Ze4T0vUJ+E/GxezdjyH1OUkysJewfOmNJ6QniD78dJmVe44Jr i2FL0Whnb4tJs/85PK1fO5guI59deBBBqW7dQeheMT4R3CFSlcmfV6df+ah7q5Eua5Uy wshQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1759200324; x=1759805124; 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=Zjvk/jwcgtCF9TRiT6Fv94jzQiYOsdOhmjAblUevyNs=; b=hXaek20tLTutgWilEpioBHbnGO3laLD8hmpSzGLGlLAVFUv/O0+ID6YeWo5kCezeRc kQOZnY7gka3947kBDSgfxvI8xIvWvPP3TQGgBnc+01Jb/Ec6xzeCFjVSf2Z1ugTKv5lM B76r+tXNwi9BMDyuJ+o6Q50IT8IjJQJ4K6JcSTiLqZDfFdYVZvrNJV3osd4X7/Mh/32m GxuVHEiMMFiIRzDH0f1YxN9E2IYlOEpZiEY00wMu4mt20tUZl8tXeDcsuRZPmHRi7VUa BcOobFztqp5LOdjFv6HVQav3Txqn8LLAxhKZkuoP2iITGHDQK3Xm3l3XTYUTEVAdb9/z NtGA== X-Forwarded-Encrypted: i=1; AJvYcCVcQJxoxm6Ozsr7GDHv2k3fY4xXECrL3vcDbii7+EOOFnW1q8FFonaULe9O+FCxIt2e3guhEBP3CjoR3ZI=@vger.kernel.org X-Gm-Message-State: AOJu0YzICCEmY/AzavgY2h5lG5MWw+2qTmGX1OSHUaUVMZwLo/Iq3Enp tOuUjOvsf+p0BOBBNMP+EATMjkxXC6zdbgFNepneHIdCjVfmjTvBsn4A X-Gm-Gg: ASbGncsmbLLvQzaP/imEU7bIhzz7oG5lknRP0MQCpclVwWSSI/U4+Dq4iYs80SZsTNz XbJDLl6503Faue5QY093jctun1UJ+P6PUmoT6SX7WFEQJdMSKVYT7KuA03SRv8a9ziVE9qsr4Rh ht54e9GGGCAeieRMJ5DhXcaKKGX7pRc3TR/7+jgf3y4e6wVJjhyW8ejDB+95oeYfVKrSFfzXjI7 ZUZBxtsHNMKcCTG2UM34o5dwB620ywgkLq0tEjaWKrTL4YrBNstGHjStRLG+SnRhZpT1SKB9Wo0 vKeVA32XqmiC7731umzNEOjTomb+bmGaiawGlW86I5Jkz/5ZXpK94v01XpH9Fb82Vslzhd9TcnF M4wSkr3yZN797/cMVXvj122PW/JGN3/C62LymysNlTZqUCX3zk5K7SMCEfWzo1j0OgnnMKYH5Fc Hu X-Google-Smtp-Source: AGHT+IFfp8YXgNuQukwwqsnxDRX708PqLBqQKd9UC8iSffGPe0+X00XIAI7NxbzgZKbYcTueKMe0YQ== X-Received: by 2002:a17:903:3bc5:b0:27d:6777:2833 with SMTP id d9443c01a7336-27ed4a986c5mr179688865ad.47.1759200323854; Mon, 29 Sep 2025 19:45:23 -0700 (PDT) Received: from localhost ([45.142.167.196]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-27ed68821d3sm145446045ad.83.2025.09.29.19.45.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Sep 2025 19:45:23 -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 v6 12/23] mm/ksw: add entry kprobe and exit fprobe management Date: Tue, 30 Sep 2025 10:43:33 +0800 Message-ID: <20250930024402.1043776-13-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250930024402.1043776-1-wangjinchao600@gmail.com> References: <20250930024402.1043776-1-wangjinchao600@gmail.com> 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" Provide ksw_stack_init() and ksw_stack_exit() to manage entry and exit probes for the target function from ksw_get_config(). Signed-off-by: Jinchao Wang --- mm/kstackwatch/kstackwatch.h | 4 ++ mm/kstackwatch/stack.c | 101 +++++++++++++++++++++++++++++++++++ 2 files changed, 105 insertions(+) diff --git a/mm/kstackwatch/kstackwatch.h b/mm/kstackwatch/kstackwatch.h index 850fc2b18a9c..4045890e5652 100644 --- a/mm/kstackwatch/kstackwatch.h +++ b/mm/kstackwatch/kstackwatch.h @@ -35,6 +35,10 @@ struct ksw_config { // singleton, only modified in kernel.c const struct ksw_config *ksw_get_config(void); =20 +/* stack management */ +int ksw_stack_init(void); +void ksw_stack_exit(void); + /* watch management */ struct ksw_watchpoint { struct perf_event *__percpu *event; diff --git a/mm/kstackwatch/stack.c b/mm/kstackwatch/stack.c index cec594032515..9f59f41d954c 100644 --- a/mm/kstackwatch/stack.c +++ b/mm/kstackwatch/stack.c @@ -1 +1,102 @@ // SPDX-License-Identifier: GPL-2.0 +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#include +#include +#include +#include +#include + +#include "kstackwatch.h" + +static struct kprobe entry_probe; +static struct fprobe exit_probe; + +static int ksw_stack_prepare_watch(struct pt_regs *regs, + const struct ksw_config *config, + ulong *watch_addr, u16 *watch_len) +{ + /* implement logic will be added in following patches */ + *watch_addr =3D 0; + *watch_len =3D 0; + return 0; +} + +static void ksw_stack_entry_handler(struct kprobe *p, struct pt_regs *regs, + unsigned long flags) +{ + struct ksw_ctx *ctx =3D ¤t->ksw_ctx; + ulong watch_addr; + u16 watch_len; + int ret; + + ret =3D ksw_watch_get(&ctx->wp); + if (ret) + return; + + ret =3D ksw_stack_prepare_watch(regs, ksw_get_config(), &watch_addr, + &watch_len); + if (ret) { + ksw_watch_off(ctx->wp); + ctx->wp =3D NULL; + pr_err("failed to prepare watch target: %d\n", ret); + return; + } + + ret =3D ksw_watch_on(ctx->wp, watch_addr, watch_len); + if (ret) { + pr_err("failed to watch on depth:%d addr:0x%lx len:%u %d\n", + ksw_get_config()->depth, watch_addr, watch_len, ret); + return; + } + +} + +static void ksw_stack_exit_handler(struct fprobe *fp, unsigned long ip, + unsigned long ret_ip, + struct ftrace_regs *regs, void *data) +{ + struct ksw_ctx *ctx =3D ¤t->ksw_ctx; + + + if (ctx->wp) { + ksw_watch_off(ctx->wp); + ctx->wp =3D NULL; + ctx->sp =3D 0; + } +} + +int ksw_stack_init(void) +{ + int ret; + char *symbuf =3D NULL; + + memset(&entry_probe, 0, sizeof(entry_probe)); + entry_probe.symbol_name =3D ksw_get_config()->func_name; + entry_probe.offset =3D ksw_get_config()->func_offset; + entry_probe.post_handler =3D ksw_stack_entry_handler; + ret =3D register_kprobe(&entry_probe); + if (ret) { + pr_err("failed to register kprobe ret %d\n", ret); + return ret; + } + + memset(&exit_probe, 0, sizeof(exit_probe)); + exit_probe.exit_handler =3D ksw_stack_exit_handler; + symbuf =3D (char *)ksw_get_config()->func_name; + + ret =3D register_fprobe_syms(&exit_probe, (const char **)&symbuf, 1); + if (ret < 0) { + pr_err("failed to register fprobe ret %d\n", ret); + unregister_kprobe(&entry_probe); + return ret; + } + + return 0; +} + +void ksw_stack_exit(void) +{ + unregister_fprobe(&exit_probe); + unregister_kprobe(&entry_probe); +} --=20 2.43.0 From nobody Thu Oct 2 01:01:41 2025 Received: from mail-pf1-f179.google.com (mail-pf1-f179.google.com [209.85.210.179]) (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 D60CB258CD0 for ; Tue, 30 Sep 2025 02:45:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759200331; cv=none; b=HXcTMxPwXwrGB45zRfsEH+bJfH+YEvQXLWQx4/qDT9hWD+ruiE41NuhxPDJd7XPXVJDUXZK/7DQ9Kjd+FnqLQLmwtq6LIZ32KDOkT4dJDBm/kHRjKj2zxjIm517z/By9alH4qw6hu9P0PagHaRoenW9YRJm1u7TGJOxZ6wI3G1U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759200331; c=relaxed/simple; bh=Sl2YI7Td/C9YkkJpnWkOlkyn4hvpDBvdNr6f7stAoSw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=cdcZ63hNGDXAa+iIiHkAY8Wh23DpfIBgZtWGqmBkdmzC7YGMLlfY5U3aVIaC3g5XFWeoDWX2sSINBmOywLpzc8VqcZZ5xLw7tnOs8Mgs3Brbg2+6NmivXfUugjpbFaUy/NfvPui2Gx82loLHJGmcr9u8LdhISEceU6QPJ04Jl/Q= 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=aiyBF/wn; arc=none smtp.client-ip=209.85.210.179 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="aiyBF/wn" Received: by mail-pf1-f179.google.com with SMTP id d2e1a72fcca58-77c1814ca1dso4226432b3a.2 for ; Mon, 29 Sep 2025 19:45:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1759200329; x=1759805129; 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=aiyBF/wnrDTAEUGQ3gs3hkoDo6ov65uut92C3I+ngMReOiufaQ1vmTFIu1XnSWaGGh khX0pjDWJadRCDMCM3CMXPMKCKltjKWNUtc51qshE5kXFvc287XTIF8QXgev3XVGSn9y 05DxNPfZbgEUDZkoFxdl+YdQopelHsQzG3KhzdyKhxkrnE1Hv/+FHU7/2n9zyeLmIYVz uTo47nYJvcaZwtoT0ajVuJE7PlG/Oh+U/sm85SO4tUaIx1F5/CrTTe7S+qGifdVeBf89 wV/OxahguZKjvN/XTCzxgnwE0taEPgzJ1LSh95A9Ols1FTzW4QPkrMnIoSn1CJaDFPvk oNiw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1759200329; x=1759805129; 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=ZvquRfQKl4mwmCLBkftEGyHswMeg5G7d7+G8OgA8IheRbWr6M0EFvrjf5vNldt2VFf k1PINN3haIrebXCoIn+KuJH7GOfUy1bn7jSz1yQLthR2Kip9nZSpA+OcKEiOLN5g7RjX o74FVj+JsZvnP4qVqYLIur6WVplvDwG+DUZ5jq7vmiztzNnnhdgzUZNzf6zcpDhtiEAi ZpJfCWPyaMBxt4db+rvAmNcZr/DXiuVHIs460fsUYmqhkUjLJh4ctHyDfz2j8z+tX5kI 0RlJW3Vk7wNorqMRHUQ5JyvhiGnA+/blEf9gjmVSQU58xwfRPaD3Y6PWr4UCREpX3bJg VW9w== X-Forwarded-Encrypted: i=1; AJvYcCVCz6dNB3vUWaz31LWZXTGoNvlbdkbyyM7caNvC6LFuK1MJF+7cf7maYQN8KjH9R9bPjQrSaYoVcHB280c=@vger.kernel.org X-Gm-Message-State: AOJu0YxTj9UUqzdG3T6gukF6q3pxGBzfRbx1X7QexBuw+peODapNBEy6 eVjpKeBaecS/2QoD5dwBkX10QORTmwvqwBbShZK4QC5GD4AejD1SKdCV X-Gm-Gg: ASbGncss7+TK8PIiO/uoFY7prBUIHS+fw7PFk6PvTm4mssxmSgDi4OznBjfG1vQUG7z 29sJO7hleGBKQ9etAriXVDb3KUZ8mVeZTmjyxDfH6Os3kPDOI2qgOzJKMnD7DDBnt1AMdsXVf2a grqcr6v15ld/rYvtsLOz4IL/F42ZpbjruwbemPDe/7m7JXzQC3CX6HcvP0z+d2ceNwnYnuhyOL3 w9AMF0nUUkhsqgvYOSMfXZX1BbC3BeYoQwVt2CotafaucanKAyZO+K4klg1wWImCsuKMYAznWvS /aM3bs17OBX/+XX5U0rT/hGTDeJIGNCcW6jj+JkZCG5QxFfKQD3XHlWjO/ufFkfgsml+BQyCtad TxQaGK3LryJe/pK/biKuQQaG5YPc0BqC8UI7HMkZoF4uaZOw4BUHrd1LZyN2/j0y/LecSBEqJGm M6lJRr3Se9Ap0= X-Google-Smtp-Source: AGHT+IGTqTwXopd2ojQqxBEBkqI1vY+O5jS9ODQlBJjx1qTPcUYlj9RqM72R3p1od6/UyekDO+cXWA== X-Received: by 2002:a05:6a00:b53:b0:76e:885a:c332 with SMTP id d2e1a72fcca58-780fcf080d2mr23371738b3a.32.1759200329155; Mon, 29 Sep 2025 19:45:29 -0700 (PDT) Received: from localhost ([45.142.167.196]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-782e36c803fsm5830819b3a.38.2025.09.29.19.45.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Sep 2025 19:45:28 -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 v6 13/23] mm/ksw: add per-task ctx tracking Date: Tue, 30 Sep 2025 10:43:34 +0800 Message-ID: <20250930024402.1043776-14-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250930024402.1043776-1-wangjinchao600@gmail.com> References: <20250930024402.1043776-1-wangjinchao600@gmail.com> 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" 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; =20 +static bool probe_enable; +static u16 probe_generation; + +static void ksw_reset_ctx(void) +{ + struct ksw_ctx *ctx =3D ¤t->ksw_ctx; + + if (ctx->wp) + ksw_watch_off(ctx->wp); + + ctx->wp =3D NULL; + ctx->sp =3D 0; + ctx->depth =3D 0; + ctx->generation =3D READ_ONCE(probe_generation); +} + +static bool ksw_stack_check_ctx(bool entry) +{ + struct ksw_ctx *ctx =3D ¤t->ksw_ctx; + u16 cur_enable =3D READ_ONCE(probe_enable); + u16 cur_generation =3D READ_ONCE(probe_generation); + u16 cur_depth, target_depth =3D ksw_get_config()->depth; + + if (!cur_enable) { + ksw_reset_ctx(); + return false; + } + + if (ctx->generation !=3D cur_generation) + ksw_reset_ctx(); + + if (!entry && !ctx->depth) { + ksw_reset_ctx(); + return false; + } + + if (entry) + cur_depth =3D ctx->depth++; + else + cur_depth =3D --ctx->depth; + + if (cur_depth =3D=3D 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, s= truct pt_regs *regs, unsigned long flags) { struct ksw_ctx *ctx =3D ¤t->ksw_ctx; + ulong stack_pointer; ulong watch_addr; u16 watch_len; int ret; =20 + stack_pointer =3D kernel_stack_pointer(regs); + + /* + * triggered more than once, may be in a loop + */ + if (ctx->wp && ctx->sp =3D=3D stack_pointer) + return; + + if (!ksw_stack_check_ctx(true)) + return; + ret =3D ksw_watch_get(&ctx->wp); if (ret) return; @@ -50,6 +109,7 @@ static void ksw_stack_entry_handler(struct kprobe *p, st= ruct pt_regs *regs, return; } =20 + ctx->sp =3D stack_pointer; } =20 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, un= signed long ip, { struct ksw_ctx *ctx =3D ¤t->ksw_ctx; =20 + if (!ksw_stack_check_ctx(false)) + return; =20 if (ctx->wp) { ksw_watch_off(ctx->wp); @@ -92,11 +154,16 @@ int ksw_stack_init(void) return ret; } =20 + WRITE_ONCE(probe_generation, READ_ONCE(probe_generation) + 1); + WRITE_ONCE(probe_enable, true); + return 0; } =20 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); } --=20 2.43.0 From nobody Thu Oct 2 01:01:41 2025 Received: from mail-pf1-f178.google.com (mail-pf1-f178.google.com [209.85.210.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 35821220687 for ; Tue, 30 Sep 2025 02:45:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.178 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759200335; cv=none; b=Jz10jwCGaehXPMaFRkGS9CJ4ikf+1kjn5yz6XOl6B8CDHX8cARer5ydcKdT1yHwelOL4j2pLjLoAmX1aV+t/8AEEpuFWlGzFS7Er98ObFhpgRG7ynVSjWCzkVZjqlgxcw47UhlL3ppy4oipvbQH6cJjPmGQhnI3CkV7CzAeSvqU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759200335; c=relaxed/simple; bh=ye1IFedT6QyfAsl7NnFp/ScKqi80nwnk9udpC+1GQaI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=OQJenJ2PTRI+gB34GGnXziYZc69Lg875XlOC/VdmGKba4OY+b6pyrzyxb91sDF4VckjnY+4cf47ZnwsO4HBM18T9kYsrt6nROPHJxqgoEpl9zd+OcpxdtgjsgF0rsytxAeQZyAbu0qbs2Oj4K/a+EkIU6eCxqL2ibDnwuEOD5sM= 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=Jha/9BeC; arc=none smtp.client-ip=209.85.210.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="Jha/9BeC" Received: by mail-pf1-f178.google.com with SMTP id d2e1a72fcca58-76e2ea933b7so4737704b3a.1 for ; Mon, 29 Sep 2025 19:45:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1759200333; x=1759805133; 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=1RtyZdLa/V9peD4vyIt7vF3g+yVd+tHG9wNYuCcZNH8=; b=Jha/9BeCuaRtE0JfPKt3h9P0e7AHRjWzzXJ2XqL365I45C8+45IfFKvWrjyZA8GECL JFOFuxqDhAla9JTIKjfLW561RXAL3wPtz1g3UrXL22umArjaXaOGOLGIX/nksv1fa786 FTlmUTwlyFV/hV0kmwr7t4nvvo7WV2bbIuavbBa4uCNjVJ3Lq81HBtu/oUpYrlYZuFlg k8MvVu3ertyf2KcFfL3/slcQAcf7CTQzsv/dlxMPjgbKKuWslzvbPyibXyTo3z8cmraS Qdm4ZnSKQ6OmEb1xVmwu11spf+1JfEuOf8Oirbr06Aodsd/uc1Ft9e4muhpcLlXUkMPN b6FQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1759200333; x=1759805133; 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=1RtyZdLa/V9peD4vyIt7vF3g+yVd+tHG9wNYuCcZNH8=; b=i/OpNXw85TqG0zqMi3nUnbQKG9UvHZRSaW0Tg5GiWBxiBZWaf56YCIdMK/wZPy2Wxp 4tV0sM2u44uDCflhvBZ8Phs9t4MdK2a4k+OvKwS1mNOD0RcjQnkbqrZnTJKppcdk9+nu qT4M/2l7/C3+gRHJZwG2+mbDtv/G2OrcHgODjf4TuX0cVDE41/MBTDovPbJmfhCpQ41j GJ1SYsIcp0HHfZfhGCVhCzqCuvEr6Bh+5a7faQKAgudxARwgQozkIxCCJd+Q5xdg7ZSg avRBD9O0mUkA52X3vXu4mINUn3WChG0o0FO/uDw/tfCbONFWBDSNkhZ3XMbADbw/kwpf CYsA== X-Forwarded-Encrypted: i=1; AJvYcCU5GquoLc5arWj7+hPjXa9eu1fUTV8t19hEMU+6yG95w7x97HecEueJKbK2BXinawp9BD4yRii7fIOsptQ=@vger.kernel.org X-Gm-Message-State: AOJu0YwGCOJE5j3hVyTwPKVnvN3GMFCtvuhBGdbX/scxuK4tuZg9CEtV g//u8ZCMQDOaS3yNACXPTxUQ5PIuBe49F64Zq6MK8saIk+W0m70qbKb1 X-Gm-Gg: ASbGncuwk8hgnQ+Ps9tW7cl4/drd148AJQCmZxLOkJNjsTR8GtfkmV6S30QCKlycw4b ohCL6ICbRRpMl9l53y7StVsN5lLccBPVboAbIvmp6CLnJzcUV/0Qv5oVIvTAUIQ9KeBw+e/7Pzn jXgiz+cqRJW/DD9wH/y99cqO296pVzs9CKLuMqOAa0etNR8LQFk6xLJdRfZgD5jdia6sINhpCX6 p9ltnokAZRgHixIYK+W+blFeim4MEvFrOTbqYMXqGUoKfvOqQtI3cGIc+RnNj6knC5AyYsdA3Bf Rp6jsdNXuajmAU1XBhJXpNGdVDeOPERjtivadwRygmh0yExRoYkFgm++T6W4ZE0URecIC7uhI/D jvYx3VZgGVFUi+/tUV/z3wH7sCCzokrVc7zxjM5YwqSAtL/rq1yjTm8evAw+cciy2gqQOt+4P4U 16 X-Google-Smtp-Source: AGHT+IEsif2bxHXvYWWChBgM/szcD1tJlw9HGin9oZWPM2Y8lHrYniUGiEidosj0MGkcbXMNhwhy+Q== X-Received: by 2002:a05:6a20:9c8c:b0:248:ef8:66df with SMTP id adf61e73a8af0-317732b6b3cmr3072325637.30.1759200333340; Mon, 29 Sep 2025 19:45:33 -0700 (PDT) Received: from localhost ([45.142.167.196]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-b57c53bb255sm12683002a12.5.2025.09.29.19.45.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Sep 2025 19:45:32 -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 v6 14/23] mm/ksw: resolve stack watch addr and len Date: Tue, 30 Sep 2025 10:43:35 +0800 Message-ID: <20250930024402.1043776-15-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250930024402.1043776-1-wangjinchao600@gmail.com> References: <20250930024402.1043776-1-wangjinchao600@gmail.com> 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" Add helpers to find the stack canary or a local variable addr and len for the probed function based on ksw_get_config(). For canary search, limits search to a fixed number of steps to avoid scanning the entire stack. Validates that the computed address and length are within the kernel stack. Signed-off-by: Jinchao Wang --- mm/kstackwatch/stack.c | 77 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 74 insertions(+), 3 deletions(-) diff --git a/mm/kstackwatch/stack.c b/mm/kstackwatch/stack.c index e596ef97222d..3c4cb6d5b58a 100644 --- a/mm/kstackwatch/stack.c +++ b/mm/kstackwatch/stack.c @@ -9,6 +9,7 @@ =20 #include "kstackwatch.h" =20 +#define MAX_CANARY_SEARCH_STEPS 128 static struct kprobe entry_probe; static struct fprobe exit_probe; =20 @@ -59,13 +60,83 @@ static bool ksw_stack_check_ctx(bool entry) return false; } =20 +static unsigned long ksw_find_stack_canary_addr(struct pt_regs *regs) +{ + unsigned long *stack_ptr, *stack_end, *stack_base; + unsigned long expected_canary; + unsigned int i; + + stack_ptr =3D (unsigned long *)kernel_stack_pointer(regs); + + stack_base =3D (unsigned long *)(current->stack); + + // TODO: limit it to the current frame + stack_end =3D (unsigned long *)((char *)current->stack + THREAD_SIZE); + + expected_canary =3D current->stack_canary; + + if (stack_ptr < stack_base || stack_ptr >=3D stack_end) { + pr_err("Stack pointer 0x%lx out of bounds [0x%lx, 0x%lx)\n", + (unsigned long)stack_ptr, (unsigned long)stack_base, + (unsigned long)stack_end); + return 0; + } + + for (i =3D 0; i < MAX_CANARY_SEARCH_STEPS; i++) { + if (&stack_ptr[i] >=3D stack_end) + break; + + if (stack_ptr[i] =3D=3D expected_canary) { + pr_debug("canary found i:%d 0x%lx\n", i, + (unsigned long)&stack_ptr[i]); + return (unsigned long)&stack_ptr[i]; + } + } + + pr_debug("canary not found in first %d steps\n", + MAX_CANARY_SEARCH_STEPS); + return 0; +} + +static int ksw_stack_validate_addr(unsigned long addr, size_t size) +{ + unsigned long stack_start, stack_end; + + if (!addr || !size) + return -EINVAL; + + stack_start =3D (unsigned long)current->stack; + stack_end =3D stack_start + THREAD_SIZE; + + if (addr < stack_start || (addr + size) > stack_end) + return -ERANGE; + + return 0; +} + static int ksw_stack_prepare_watch(struct pt_regs *regs, const struct ksw_config *config, ulong *watch_addr, u16 *watch_len) { - /* implement logic will be added in following patches */ - *watch_addr =3D 0; - *watch_len =3D 0; + ulong addr; + u16 len; + + // default is to watch the canary + if (!ksw_get_config()->watch_len) { + addr =3D ksw_find_stack_canary_addr(regs); + len =3D sizeof(ulong); + } else { + addr =3D kernel_stack_pointer(regs) + ksw_get_config()->sp_offset; + len =3D ksw_get_config()->watch_len; + } + + if (ksw_stack_validate_addr(addr, len)) { + pr_err("invalid stack addr:0x%lx len :%u\n", addr, len); + return -EINVAL; + } + + *watch_addr =3D addr; + *watch_len =3D len; return 0; } =20 --=20 2.43.0 From nobody Thu Oct 2 01:01:41 2025 Received: from mail-pl1-f171.google.com (mail-pl1-f171.google.com [209.85.214.171]) (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 B129825A2A7 for ; Tue, 30 Sep 2025 02:45:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759200340; cv=none; b=X72vxORbruXnCwAsZfOaG9kUGH/Br19bJ3cBXC+m1tB6QMZN/mctuGZxst0pr5AvAo7PKamJ4EaqlUT1upp+zsEdmkFMrPrOFBjdBWMMFpc6oqvrxzWy2LWHKlnptGgWcgQf3m+3MTqYHrrfWksTJq1wf1a9Wp1dY52vEzAODcI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759200340; c=relaxed/simple; bh=jb47W2mefivkhEZpeuyQPhjnJkRHRCJ2NscvV1apXQg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=sa4kumOH79u50Yf+hcvZgqtSlrJAxtVIz8LsqxdYYvwzZoVIVUtR4tpLuI/GHcdp0agmhTn3tjZIPjTkKuaU7K06shctz3mnH+dl6ETMaBqFg8pum8KIicRmy4aLxBHmBXfnZKF/zmnXQFXCNchUhtmvzOaw1N4dmdGYSmTEPFA= 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=K3vWiMgM; arc=none smtp.client-ip=209.85.214.171 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="K3vWiMgM" Received: by mail-pl1-f171.google.com with SMTP id d9443c01a7336-2681660d604so51083125ad.0 for ; Mon, 29 Sep 2025 19:45:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1759200337; x=1759805137; 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=kFRia/GHfKKxxNt0IUc2kN+EVm0fmr2Lz8hq8oGCXGU=; b=K3vWiMgMKtLTuKpqcWv34nrk88DQfOtkH/XpAg5Sxk0gw6iENOjF/zjJ6oOBnaIl4Y eM4nPaLnOw6Nr8aTYlHFq7s0F0fWz6AeqLcDT2+SVNrurs2aUA81kZL6xJVBkMp5tWsS h8kNgIyZllzdkGgbTMd7wlbZYlfSwH5aFnWrOo9zUpMFYk1oeENkPlKDiGbBX4sOE5rj V1MQlB+TSnc1NYhTzYSYu+W3jocbehr7/UF9ueW6Ds4UcO6KZTGIOROz+y31FUpQHtbA etYWOQ6m80S2vtvT6199cLxwnVz5HTi2atQrANsbmtmvK/XeJgplHY75s4UuxmTj7jdd wHHQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1759200337; x=1759805137; 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=kFRia/GHfKKxxNt0IUc2kN+EVm0fmr2Lz8hq8oGCXGU=; b=LWnl74bKKLbFXJ0jku8xhLI1ssitJ1S36ekn4wVKN1M/JT2JVeLYR1WKQMdhnyRlgd h2HmSTd3X/RpwoMuoVYIEsvQzgX3YZLFVIkP7WfUVyzD1udmjeyw/R4wHN823ppj14rx hi0ameOuHXdgUNs00mofs0FYMn42mqH/9pjD3KiLSjfTI9uxZbT48zpKoqdj/weZyKrL 4OB7ft2d/68M7hjyBmFLnGzv1hmvY1JOd3Nd0DYBr8ioJtzE4/WDQlTUqS2GePwe8H30 +azi/tJUsTZK2ctEZv3x3Iio6aCLgxl3E+iqL/vNKg6TMU5cVzT1r56N3J9uqhGjeJZd do8w== X-Forwarded-Encrypted: i=1; AJvYcCVAg01gy3vvrr62EIPuK50zqZZBNAbSyMtYseuSqPlx8dV9/KfjVx3W0Bd8N2+nFuRE35TBvRJkveMeOFQ=@vger.kernel.org X-Gm-Message-State: AOJu0Ywdz32HhsgE1vR4ekX2qT0sPMfPna+NwnEjI7fjps/w/wvjecVT aNtW6VfZJJ31sh3SzeAbdc/xTm8pYX99XCdmWXPSF9HJskslnaE8tTAa X-Gm-Gg: ASbGnctwQiklchIF13aWeTcjmRj1K86qSoI6/gpfR8S3fNv+Snac2rte7eCVrt2wtxj bqE/4RUOZ1cXh0MOhpY1TyiPvggHSl3vSeMZJ9WJzZEfBnkMv4MoIOp09woVwFp6BEYKBHfNE4h FIN7mbm7wteh4Qy/bbtvpAAORyAmeMgaqe7soB2SW8PoctQELGKH106Msd0BZJMXKEuH2816XRR m5ZWRjA8OZFl79gSMaL5OTRNjZJvtAYh5Ibk+Wgir49snoiN14sCLZL0Pde5uM+T+qOJH5f/M4K LjSILSy4BJXhtbqufGKbEjYFCUOrZSmrYjvAXAhy5U4S+glT54NmGZxrRGbALIjkZaN4hEKrYjj zKQmYcT3tV3mIc6TvE7YTGoEojMcnzXCi+rXszpwc5cQ+2Do0ACAydFk3cPVN2dxBAs47ebfHv0 jL X-Google-Smtp-Source: AGHT+IHKpBUnWq+gpU5Sy4KTGKE+VZZI2OvvUEv1k1IBPSw7fn6QhmyAtdZNGDjD1lnTAGMCtuFmNA== X-Received: by 2002:a17:903:2442:b0:250:999f:31c6 with SMTP id d9443c01a7336-27ed4a3165amr204393375ad.32.1759200336891; Mon, 29 Sep 2025 19:45:36 -0700 (PDT) Received: from localhost ([45.142.167.196]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-b57c55bf378sm12519152a12.50.2025.09.29.19.45.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Sep 2025 19:45:36 -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 v6 15/23] mm/ksw: manage probe and HWBP lifecycle via procfs Date: Tue, 30 Sep 2025 10:43:36 +0800 Message-ID: <20250930024402.1043776-16-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250930024402.1043776-1-wangjinchao600@gmail.com> References: <20250930024402.1043776-1-wangjinchao600@gmail.com> 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" Allow dynamic enabling/disabling of KStackWatch through user input of proc. With this patch, the entire system becomes functional. Signed-off-by: Jinchao Wang --- mm/kstackwatch/kernel.c | 60 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 58 insertions(+), 2 deletions(-) diff --git a/mm/kstackwatch/kernel.c b/mm/kstackwatch/kernel.c index 898ebb2966fe..57628bace365 100644 --- a/mm/kstackwatch/kernel.c +++ b/mm/kstackwatch/kernel.c @@ -14,6 +14,43 @@ static struct ksw_config *ksw_config; static struct dentry *dbgfs_config; static struct dentry *dbgfs_dir; =20 +static bool watching_active; + +static int ksw_start_watching(void) +{ + int ret; + + /* + * Watch init will preallocate the HWBP, + * so it must happen before stack init + */ + ret =3D ksw_watch_init(); + if (ret) { + pr_err("ksw_watch_init ret: %d\n", ret); + return ret; + } + + ret =3D ksw_stack_init(); + if (ret) { + pr_err("ksw_stack_init ret: %d\n", ret); + ksw_watch_exit(); + return ret; + } + watching_active =3D true; + + pr_info("start watching: %s\n", ksw_config->user_input); + return 0; +} + +static void ksw_stop_watching(void) +{ + ksw_stack_exit(); + ksw_watch_exit(); + watching_active =3D false; + + pr_info("stop watching: %s\n", ksw_config->user_input); +} + struct param_map { const char *name; /* long name */ const char *short_name; /* short name (2 letters) */ @@ -117,8 +154,18 @@ static int ksw_parse_config(char *buf, struct ksw_conf= ig *config) static ssize_t ksw_dbgfs_read(struct file *file, char __user *buf, size_t = count, loff_t *ppos) { - return simple_read_from_buffer(buf, count, ppos, ksw_config->user_input, - ksw_config->user_input ? strlen(ksw_config->user_input) : 0); + const char *out; + size_t len; + + if (watching_active && ksw_config->user_input) { + out =3D ksw_config->user_input; + len =3D strlen(out); + } else { + out =3D "not watching\n"; + len =3D strlen(out); + } + + return simple_read_from_buffer(buf, count, ppos, out, len); } =20 static ssize_t ksw_dbgfs_write(struct file *file, const char __user *buffe= r, @@ -133,6 +180,9 @@ static ssize_t ksw_dbgfs_write(struct file *file, const= char __user *buffer, if (copy_from_user(input, buffer, count)) return -EFAULT; =20 + if (watching_active) + ksw_stop_watching(); + input[count] =3D '\0'; strim(input); =20 @@ -147,6 +197,12 @@ static ssize_t ksw_dbgfs_write(struct file *file, cons= t char __user *buffer, return ret; } =20 + ret =3D ksw_start_watching(); + if (ret) { + pr_err("Failed to start watching with %d\n", ret); + return ret; + } + return count; } =20 --=20 2.43.0 From nobody Thu Oct 2 01:01:41 2025 Received: from mail-pf1-f177.google.com (mail-pf1-f177.google.com [209.85.210.177]) (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 09C96261B96 for ; Tue, 30 Sep 2025 02:45:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759200344; cv=none; b=EwQAHbcJ+qhcjL2xKiYup11qjmItP4lQBrLfCLOwHMFWU6+zbAbmRp4xm4m5K4n9AYC8AXsPTQMTcfvzHBiT/6NIcWc22mIJPG6iGH940C/ext7FWKKO3Fzt3ZwgB8pIRYV1k2fOWGyFQ254IdsyB5Sv7f2bi4ujCjD1Ju9gCJ8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759200344; c=relaxed/simple; bh=zgbvGJBSx4YBKNkqO/qzz/La9XfnZ3vAatfFaQMoL7I=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=kFQttb76QmPi9gkI+VJHR5oXM/piKeT7jTeQOSuwS/ABwMFbyi4VKvnhNKl5mNLPqiHaYQkSWAluHqbAPJWwxcXfKqnG/A5Cx+oWjz+Cdz7AouI+EjobNWD0ZzGkXmjD1iQ/3zndhcBJlOwdmuShweJcKjj0Oru+Ltpp/RNiAPo= 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=VKJOEc+9; arc=none smtp.client-ip=209.85.210.177 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="VKJOEc+9" Received: by mail-pf1-f177.google.com with SMTP id d2e1a72fcca58-781997d195aso1892826b3a.3 for ; Mon, 29 Sep 2025 19:45:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1759200341; x=1759805141; 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=UmaGbmiuxIsK0xKTEWJ/f7gfwC2bw8p0SOLh4b9Z4FY=; b=VKJOEc+94AKnpJiVOpWnQ6DKSsWX1R1XbyHo5/r/AG6aDGAWk9wPLSshoMM+livdS+ MyEuw5bGfLyFLEN+CymB1AYeyMGWWzvzslOuckXZNL+LkSjQP5bzS2nXeQjKnytOTkYn I3znRL92dI+MXIBc0Fotj3NpYAr6hAMRbuIxDzLO9p6jaZ0voXC2/ADIbtgpiE45AqYk 6KiAb/IiOHKoiHWF38rhEnx8s7VaaJkf9vC+I5pJNvNIGogQNziLULRwmmnUmEFUMU9c FfGiRCJb+mhy38xk1bCLHPsMgriXv6C+zhRwB5OmgZb8gtGClZpvwOrAEAqybrDgc9kW ouvg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1759200341; x=1759805141; 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=UmaGbmiuxIsK0xKTEWJ/f7gfwC2bw8p0SOLh4b9Z4FY=; b=X4Fy3fpMQKRqmmBNJFFr/v+4T5KZmiYVCYdRnWDutDtsLlRN8/g7Deub7yhkZUeYtq o7Qb449fws6CzL+AFctvrSh4vPaLtxBY2N/SkjniHUcaREmhST9+sni0pD5ckVQuoIDm 8fQY0t6PFZw4yt2EkXanFnL1YboEmnXPbaxqpQJ72CJbgEIOpHambr9r+i5u0jPrHE/r S+xiGci2Tw5zwEu6OjRMIyungWwJirzRLJKM1cNPqpbd7sv7g8OgKzxmJx9tUcyLm73x YZD8n9v/vujcQDCOXiAIO1IdDTGadf0kBYWsF6JCsM7DwH35KruCAIBBar0Ad2L+RhgL Tx4A== X-Forwarded-Encrypted: i=1; AJvYcCW0gBly61pM6mUsDt+jIdqge6sNXBEtHtvuoIvZXEJwyPb8CdM2E3grGGUIBdlZApfzvEFg4P1uQlhPIlQ=@vger.kernel.org X-Gm-Message-State: AOJu0Yy4o7VOtwCz0VMn7yS6CHxI/krM51QuCgwokNxOlV2M5YOapvT2 0f1x3SMt4w3/uAF9uHl5yMk1t13SqY0FAuYCmKTJXPOPWg9A7pOxn6nP X-Gm-Gg: ASbGncuxVOJeTSn1KjfELmRxNOdCY1X219y6+1uefJ5FRCEd5/SxLMNPd8lkk5SCcnM yeYq+jyuoQ7ZomZyoUGzIYTgu31drza6odfwq+lzlccZFvxQ4AywO4fJcr7ek/LkKJiQEIS7a8j 205Rkx3SUhojS/euKqTZKT+6igz1sJuGQPNAm87RGhAD078opF6c/1cxDzvak+tfnHuV+MPnSPM VZJOs4o31YHZWfqFICh1EYC/M7CT9eUGXiZ0LUyVHvudwh/TM/ubghADVipRl8qRiHUPv4Smmcn msPeOJ52YeUk84DCnDYEqr3yXjLZPkIIuk2s/lESn1MYBjCZSM6dETmqoITw5Qe2goSMnWIrFGn LC0Sb6XNy8H5WluVVtS8bPOzL7BGHJuQWUYg9N7+HwoQHzqCKof76hzZySIdpZUGdOauQxdcfvG 4A X-Google-Smtp-Source: AGHT+IE0ZzT2Ls3FLJQKvDsDE35NvUvpfAF/CKszp2PRAknfZulRv/lUTsOjo2MTaS5CdAlTIrrq4A== X-Received: by 2002:a05:6a00:26ed:b0:781:2ba:ef14 with SMTP id d2e1a72fcca58-78102baf1e4mr14490364b3a.25.1759200341230; Mon, 29 Sep 2025 19:45:41 -0700 (PDT) Received: from localhost ([45.142.167.196]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-78102b64cc6sm12378142b3a.71.2025.09.29.19.45.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Sep 2025 19:45:40 -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 v6 16/23] mm/ksw: add self-debug helpers Date: Tue, 30 Sep 2025 10:43:37 +0800 Message-ID: <20250930024402.1043776-17-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250930024402.1043776-1-wangjinchao600@gmail.com> References: <20250930024402.1043776-1-wangjinchao600@gmail.com> 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" Provide two debug helpers: - ksw_watch_show(): print the current watch target address and length. - ksw_watch_fire(): intentionally trigger the watchpoint immediately by writing to the watched address, useful for testing HWBP behavior. Signed-off-by: Jinchao Wang --- mm/kstackwatch/kstackwatch.h | 2 ++ mm/kstackwatch/watch.c | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/mm/kstackwatch/kstackwatch.h b/mm/kstackwatch/kstackwatch.h index 4045890e5652..528001534047 100644 --- a/mm/kstackwatch/kstackwatch.h +++ b/mm/kstackwatch/kstackwatch.h @@ -52,5 +52,7 @@ void ksw_watch_exit(void); int ksw_watch_get(struct ksw_watchpoint **out_wp); int ksw_watch_on(struct ksw_watchpoint *wp, ulong watch_addr, u16 watch_le= n); int ksw_watch_off(struct ksw_watchpoint *wp); +void ksw_watch_show(void); +void ksw_watch_fire(void); =20 #endif /* _KSTACKWATCH_H */ diff --git a/mm/kstackwatch/watch.c b/mm/kstackwatch/watch.c index f32b1e46168c..9837d6873d92 100644 --- a/mm/kstackwatch/watch.c +++ b/mm/kstackwatch/watch.c @@ -269,3 +269,37 @@ void ksw_watch_exit(void) { ksw_watch_free(); } + +/* self debug function */ +void ksw_watch_show(void) +{ + struct ksw_watchpoint *wp =3D current->ksw_ctx.wp; + + if (!wp) { + pr_info("nothing to show\n"); + return; + } + + pr_info("watch target bp_addr: 0x%llx len:%llu\n", wp->attr.bp_addr, + wp->attr.bp_len); +} +EXPORT_SYMBOL_GPL(ksw_watch_show); + +/* self debug function */ +void ksw_watch_fire(void) +{ + struct ksw_watchpoint *wp; + char *ptr; + + wp =3D current->ksw_ctx.wp; + + if (!wp) { + pr_info("nothing to fire\n"); + return; + } + + ptr =3D (char *)wp->attr.bp_addr; + pr_warn("watch triggered immediately\n"); + *ptr =3D 0x42; // This should trigger immediately for any bp_len +} +EXPORT_SYMBOL_GPL(ksw_watch_fire); --=20 2.43.0 From nobody Thu Oct 2 01:01:41 2025 Received: from mail-pl1-f177.google.com (mail-pl1-f177.google.com [209.85.214.177]) (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 1782026656F for ; Tue, 30 Sep 2025 02:45:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759200348; cv=none; b=RdNUneERexa7zRAM8zcqVqEKiAYL4782TJeSqI81p7UKzOCzz9/3R10yjijBCtb9DYdibYsQD8T7L8+G775hH9fm8CSCjPovqU7rgbCLjETihhCoj8G8AfzcYmHhfjTxvUfNSo4Jz38jEbngZ0cf/QCS+/KmOXg7T3hhPukebyE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759200348; c=relaxed/simple; bh=fq2Ne6eA5Hj+u/oZogdwy0lpJa+hkt/8IQwPQXp6BxM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=RqXXE9rGSoNAWit7jHFOvYNVP5M0WAMXQkWWQhJ+5L4ZbWlWNX03rhUd1t2L7mStj7PjMRtP5+dIzuBKd5zpCjqHHY040JCb6/KYZU18KpJ151a9PvH799IkAkQNLr5BxkBn/xF0+FrbZ2dgbVISURSb8AsSbDRGNKLJHKugWcY= 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=S3OCE1Qn; arc=none smtp.client-ip=209.85.214.177 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="S3OCE1Qn" Received: by mail-pl1-f177.google.com with SMTP id d9443c01a7336-2697899a202so45355305ad.0 for ; Mon, 29 Sep 2025 19:45:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1759200345; x=1759805145; 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=3Zjn9o91E8eMF6fANpWy8yJadTo2vfyIghwnTsVomDQ=; b=S3OCE1Qn3i6Mw2qE81obgRu0NwIi61Lr4Efgpvr+CcWW8G/74bp7n2rpGMKDOG22uc IHOuyNH5sQfPL/EsVktHvPR1H0i11elFSNrxxkgIgElq6QJZIQKV/WMsTB8JvPuVvYsQ MPEKEOjSAcV0/JJEnfUhD/L0tr2OsW4CeIZdC4mRxG3DF8zrIsWy0BzTYh3YzmmKjnEW HPuQQKoQyRrkJhoS0SnqKwF5oP6ZcXPNeiwoWXePWQMOCbKPBOECu4mAQLDpwnfPYgtZ t1/Q7vNOikuiFZWWsGTPcJAJ5RyERubmoC5IqoQTedFRQlOZw9+1MyiBPLKD3czytFno B8rw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1759200345; x=1759805145; 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=3Zjn9o91E8eMF6fANpWy8yJadTo2vfyIghwnTsVomDQ=; b=RnNcCa/AxiOdmNtW8iB7UOfJ8YAJ6glIWYZlxUWqUeFhl96rWsd95HQ7Hy/Fd7jtcQ w6e3OFg0q3gjC52cKL8NV6V5PGRA6j7iiGjVT3+Sm56eeYueNufMc64b3EbcPo1cg283 fJozZdRB1ljGg7G3vncFcJQhi51bgo51b4iWJ6SsIdYDQ/1xFu2F2Z5kuJkkue39jeKr 8Wy9RRQXWiyFZeMeESj3KIm5lcnixE9D6JBB26JHN94cJpVAImP9mYtBIJtHv+WYrvzQ J1rryyTmovCRiKEIhbarupNfYvNgFSNAL5gIa+TyAYIekj2tKRqVfi6aUHQfsVdChkcI c6YA== X-Forwarded-Encrypted: i=1; AJvYcCURmm0QP+9FN62dJ7+n+JS1/Dq18k5s3jtttp71zULAGZc4HiUh9CZ77YPRs+DyykCK13M3Jtg3ZgC95a4=@vger.kernel.org X-Gm-Message-State: AOJu0Yxg5mNyZRtTsBbIVOqSXoB8rfJyv7HE4FmiJAzq8wuLdgPpOUxd ePn/gEX5dKWi+k9dlgQLeq5yOV25ZTFO007MUiMP6oCDlVx1uK0FkM2i X-Gm-Gg: ASbGncsvB90v9JknJvjTy87tjIfFGERgyemf0/wRq6FT8L701GiS/BN7qsW6cDJ6XsM oWApiHiKZBwGg7dfYHHl/x1brxdbfysiJ8S6uwzkN8JF03NcigFn3BfN2415tu4/3wDcECiiLon 9vfoO9M2KM7wTFbedZF5T2uwvcHriK8OCtFwrA+/3JTlLkYb6UOgpj/7hsWvvxTLeJKbrhN+r4G 9zsVYo5xME5s8uklDs0SkKJr/ttlhasceSSq+dK5A2R4USlHJgBNg1jPuyUq875bbmTPclJp0zw bfnV0pu7l/K4ojrAWg2/bKkeCkjj51qCLC6DzpJ1/LUQ1SU53umHLv8v8BDp77vD46LsjxRb5OM RehbGxc4yoVTs3RdyQDc80Ncy3Es2e3YsTGJee2rMKWP1RYSdkFRCQeLwjuGiFv8PdKqiU5j3nT 7W X-Google-Smtp-Source: AGHT+IG/V+l4d2YJ6ds5JXx6iWxJNgpfbKQaTWJecBpgg+jS+5oh1BhPKfXY/R3RErss9TGYBDL6Iw== X-Received: by 2002:a17:903:2f4e:b0:25d:510:622c with SMTP id d9443c01a7336-28d1718d306mr31185225ad.28.1759200345170; Mon, 29 Sep 2025 19:45:45 -0700 (PDT) Received: from localhost ([45.142.167.196]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-27eea801b49sm118165465ad.23.2025.09.29.19.45.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Sep 2025 19:45:44 -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 v6 17/23] mm/ksw: add test module Date: Tue, 30 Sep 2025 10:43:38 +0800 Message-ID: <20250930024402.1043776-18-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250930024402.1043776-1-wangjinchao600@gmail.com> References: <20250930024402.1043776-1-wangjinchao600@gmail.com> 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" Add a standalone test module for KStackWatch to validate functionality in controlled scenarios. The module exposes a simple interface via debugfs (/sys/kernel/debug/kstackwatch/test), allowing specific test cases to be triggered with commands such as: echo test0 > /sys/kernel/debug/kstackwatch/test To ensure predictable behavior during testing, the module is built with optimizations disabled. Signed-off-by: Jinchao Wang --- mm/Kconfig.debug | 10 +++ mm/kstackwatch/Makefile | 6 ++ mm/kstackwatch/kernel.c | 5 ++ mm/kstackwatch/kstackwatch.h | 2 + mm/kstackwatch/test.c | 121 +++++++++++++++++++++++++++++++++++ 5 files changed, 144 insertions(+) create mode 100644 mm/kstackwatch/test.c diff --git a/mm/Kconfig.debug b/mm/Kconfig.debug index 24f4c4254f01..224bd561dcbb 100644 --- a/mm/Kconfig.debug +++ b/mm/Kconfig.debug @@ -317,3 +317,13 @@ config KSTACK_WATCH A lightweight real-time debugging tool to detect stack corruption. =20 If unsure, say N. + +config KSTACK_WATCH_TEST + tristate "KStackWatch Test Module" + depends on KSTACK_WATCH + help + This module provides controlled stack corruption scenarios to verify + the functionality of KStackWatch. It is useful for development and + validation of KStackWatch mechanism. + + If unsure, say N. diff --git a/mm/kstackwatch/Makefile b/mm/kstackwatch/Makefile index 84a46cb9a766..d007b8dcd1c6 100644 --- a/mm/kstackwatch/Makefile +++ b/mm/kstackwatch/Makefile @@ -1,2 +1,8 @@ obj-$(CONFIG_KSTACK_WATCH) +=3D kstackwatch.o kstackwatch-y :=3D kernel.o stack.o watch.o + +obj-$(CONFIG_KSTACK_WATCH_TEST) +=3D kstackwatch_test.o +kstackwatch_test-y :=3D test.o +CFLAGS_test.o :=3D -fno-inline \ + -fno-optimize-sibling-calls \ + -fno-pic -fno-pie -O0 -Og diff --git a/mm/kstackwatch/kernel.c b/mm/kstackwatch/kernel.c index 57628bace365..12b2f5ceb5d4 100644 --- a/mm/kstackwatch/kernel.c +++ b/mm/kstackwatch/kernel.c @@ -233,6 +233,11 @@ const struct ksw_config *ksw_get_config(void) return ksw_config; } =20 +struct dentry *ksw_get_dbgdir(void) +{ + return dbgfs_dir; +} + static int __init kstackwatch_init(void) { int ret =3D 0; diff --git a/mm/kstackwatch/kstackwatch.h b/mm/kstackwatch/kstackwatch.h index 528001534047..b7361d5d071d 100644 --- a/mm/kstackwatch/kstackwatch.h +++ b/mm/kstackwatch/kstackwatch.h @@ -34,6 +34,8 @@ struct ksw_config { =20 // singleton, only modified in kernel.c const struct ksw_config *ksw_get_config(void); +struct dentry *ksw_get_dbgdir(void); + =20 /* stack management */ int ksw_stack_init(void); diff --git a/mm/kstackwatch/test.c b/mm/kstackwatch/test.c new file mode 100644 index 000000000000..80fec9cf3243 --- /dev/null +++ b/mm/kstackwatch/test.c @@ -0,0 +1,121 @@ +// SPDX-License-Identifier: GPL-2.0 +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "kstackwatch.h" + +static struct dentry *test_file; + +#define BUFFER_SIZE 32 + +static void test_watch_fire(void) +{ + u64 buffer[BUFFER_SIZE] =3D { 0 }; + + pr_info("entry of %s\n", __func__); + ksw_watch_show(); + ksw_watch_fire(); + pr_info("buf[0]:%lld\n", buffer[0]); + + barrier_data(buffer); + pr_info("exit of %s\n", __func__); +} + +static ssize_t test_dbgfs_write(struct file *file, const char __user *buff= er, + size_t count, loff_t *pos) +{ + char cmd[256]; + int test_num; + + if (count >=3D sizeof(cmd)) + return -EINVAL; + + if (copy_from_user(cmd, buffer, count)) + return -EFAULT; + + cmd[count] =3D '\0'; + strim(cmd); + + pr_info("received command: %s\n", cmd); + + if (sscanf(cmd, "test%d", &test_num) =3D=3D 1) { + switch (test_num) { + case 0: + test_watch_fire(); + break; + default: + pr_err("Unknown test number %d\n", test_num); + return -EINVAL; + } + } else { + pr_err("invalid command format. Use 'testN'.\n"); + return -EINVAL; + } + + return count; +} + +static ssize_t test_dbgfs_read(struct file *file, char __user *buffer, + size_t count, loff_t *ppos) +{ + static const char usage[] =3D + "KStackWatch Simplified Test Module\n" + "=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D usage =3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D\n" + "Usage:\n" + "echo test{i} > /sys/kernel/debug/kstackwatch/test\n" + " test0 - test watch fire\n"; + + return simple_read_from_buffer(buffer, count, ppos, usage, + strlen(usage)); +} + +static const struct file_operations test_dbgfs_fops =3D { + .owner =3D THIS_MODULE, + .read =3D test_dbgfs_read, + .write =3D test_dbgfs_write, + .llseek =3D noop_llseek, +}; + +static int __init kstackwatch_test_init(void) +{ + struct dentry *ksw_dir =3D ksw_get_dbgdir(); + + if (!ksw_dir) { + pr_err("kstackwatch must be loaded first\n"); + return -ENODEV; + } + + test_file =3D debugfs_create_file("test", 0600, ksw_dir, NULL, + &test_dbgfs_fops); + if (!test_file) { + pr_err("Failed to create debugfs test file\n"); + return -ENOMEM; + } + + pr_info("module loaded\n"); + return 0; +} + +static void __exit kstackwatch_test_exit(void) +{ + debugfs_remove(test_file); + pr_info("module unloaded\n"); +} + +module_init(kstackwatch_test_init); +module_exit(kstackwatch_test_exit); + +MODULE_AUTHOR("Jinchao Wang"); +MODULE_DESCRIPTION("KStackWatch Test Module"); +MODULE_LICENSE("GPL"); --=20 2.43.0 From nobody Thu Oct 2 01:01:41 2025 Received: from mail-pg1-f174.google.com (mail-pg1-f174.google.com [209.85.215.174]) (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 12B3C26A0D5 for ; Tue, 30 Sep 2025 02:45:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759200352; cv=none; b=iZa6SK1rNJ9Rv+UuXk6ICqcMYni179cBjC1U93rGvlTt53oceWfF2yc0nDEhv8bk56zyfa2LrTuRGW/Feg65mgXHGtPgYMe6Y5IiNh8C9sP+G+kAqou5hQpeMFbKXQJgk14WE2Ahtymg1mbKy8lpJxrLHNqol/7POvF/HvHYeHI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759200352; c=relaxed/simple; bh=4AK69KqpFrfryQfFlxiqdszD58BNzBtZp9+AZ2x2szQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=BPlRHfL776yy+VNVWt5ARXcLdQnotHr7p7mtdV+xhXMoX1bO038I3RfXXh3pjzxVEvkqN/NyCDWJV2py2EMv1YkVth+SFnXU7O2HFq1F7tvqCWPAPJy5Z2VIqBV/w24C5P9LBh2DZZpHuu4kcoJVzSES9oQzRg33s1uPhNueSgY= 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=At/mkakS; arc=none smtp.client-ip=209.85.215.174 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="At/mkakS" Received: by mail-pg1-f174.google.com with SMTP id 41be03b00d2f7-b57f361a8fdso2437729a12.0 for ; Mon, 29 Sep 2025 19:45:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1759200349; x=1759805149; 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=OyJZmUduTn6h/ct8/Xe3ui1NubLI+U0SzVd7OlZC6q4=; b=At/mkakSsbThjvq1VCdPXFxgc5mr2Fvd+66tFTKnKNWJ940mtDYTlaR+Xkaj/EmdK9 wi8rNAwLTesILnSwinZ8hdOi5TzLATKpCnj2ZCaF1g5zcK4q6ZX5bXHXKc68S50U+VKs Box3x07QzH5mFRrR8nlbzIdKwCm64mWNMVQBIwX7hOBqSoESCxF5tj3+2OtiM2J/noaJ vG5rU87/uZ3RvtXT+9oxBnRYBG7tZRX07LPRingoyf0LuWZi0V6pasUfk+G1GM/edq9t a7YdVaO+64eySonZirz74eqyJx9WUlHl7kFcj4ddaL9PysIOy/dnGY2pga6shHm3h15Y nEHQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1759200349; x=1759805149; 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=OyJZmUduTn6h/ct8/Xe3ui1NubLI+U0SzVd7OlZC6q4=; b=vWndss2vODK+UnTCMlFZf4OlXdnI/CxUSLjyjmmqXQwfTHdCWve6UZCkon/a0C23E0 Q5VodcoBG/Q5HQkl3gzif71aUJP/RKoH/ZseUjuycdv6Y3idcTZKrFyMxMe/jlXiO9eq 4MSV6G7mWT/O5WO34/jDb679td23gKGBy1T0C9Kyt4tAKC3Hf//jqqLOIzkBnRaRdqwn Gd8IFiga/tBRcmmOujTd1W/sNjFFq+OuKIusd/ZWtJI28ajIHPxE8JYZdsJGUQ21sUFj flr826R36N14NSlJ8ZH5GUUULjdb+hkW1osMr8+Y5B8GbPtvhy9U04uvRkGUwpQj+Ikq 6pcQ== X-Forwarded-Encrypted: i=1; AJvYcCWCmh+/aW4R/h3uxEwFYoci/OlySwQmmDD4D3Wh2AJezAx4dj9UtImcRakz8B4iqPLEzuq2Vp3bskFDGVM=@vger.kernel.org X-Gm-Message-State: AOJu0Yz1QNXFOe5E9N3qDkVhKwjp4xZU+pn8l8o73PQuUgOCuKXY+g+I e9jsdF0TgWVr9qTmWD27nj1SSu3aDWkvPO14LAoz6/pJiNp/HAbGGQBL X-Gm-Gg: ASbGncsSWW8dCD7VPcM3qf231b+Aa/DerXWB3SDLE38YNNkgcDYfraZCf/Ie2wS6dyd Rtj//upyJ28MZUvD4ijhhstSSQe+JREyD4uLKncxJIwa3N2L1TvDeedWjmxAGBlYE/3ZkMJu3b/ XQwFM7U9eHdY8pI51qVe/FvRtJCa164Aq5lW4I5uGkkYIMPTShByy1Y5TZ3KILvNZenQfmIPkwg fgdATOl9v0CuqugIwAIEwkIdkfIVwV3p1jcGADESuTJwTsHi3fav1rzAeR2zVtZ95cLuFL+Dh4U n3EHY6R+pRf7gTxAdyXsIaLIhMNIPdpMDu7B4VgqFg7LczJXsg7yKAwsjCn3fuTIcORbpoaK1jP 9A516J33US6k4JRv7tuIKIPh6B2YnfhVAzFqUoNC938oMD2fphl2E9rg5FKd/i0+w4G9GHEGly+ sS X-Google-Smtp-Source: AGHT+IEG0ThZV7fyWTs1y7QMeQlbcUpJL85C4JXPKzErGd8yhJciSmW04rCMUIpToCmcRIvMPIF8Hg== X-Received: by 2002:a17:903:2352:b0:249:44b5:d5b6 with SMTP id d9443c01a7336-27ed4a920b9mr200539425ad.40.1759200349322; Mon, 29 Sep 2025 19:45:49 -0700 (PDT) Received: from localhost ([45.142.167.196]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-27ed6886c9csm145811695ad.88.2025.09.29.19.45.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Sep 2025 19:45:48 -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 v6 18/23] mm/ksw: add stack overflow test Date: Tue, 30 Sep 2025 10:43:39 +0800 Message-ID: <20250930024402.1043776-19-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250930024402.1043776-1-wangjinchao600@gmail.com> References: <20250930024402.1043776-1-wangjinchao600@gmail.com> 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" Extend the test module with a new test case (test1) that intentionally overflows a local u64 buffer to corrupt the stack canary. Signed-off-by: Jinchao Wang --- mm/kstackwatch/test.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/mm/kstackwatch/test.c b/mm/kstackwatch/test.c index 80fec9cf3243..012692c97a50 100644 --- a/mm/kstackwatch/test.c +++ b/mm/kstackwatch/test.c @@ -32,6 +32,20 @@ static void test_watch_fire(void) pr_info("exit of %s\n", __func__); } =20 +static void test_canary_overflow(void) +{ + u64 buffer[BUFFER_SIZE]; + + pr_info("entry of %s\n", __func__); + + /* intentionally overflow */ + for (int i =3D BUFFER_SIZE; i < BUFFER_SIZE + 10; i++) + buffer[i] =3D 0xdeadbeefdeadbeef; + barrier_data(buffer); + + pr_info("exit of %s\n", __func__); +} + static ssize_t test_dbgfs_write(struct file *file, const char __user *buff= er, size_t count, loff_t *pos) { @@ -54,6 +68,9 @@ static ssize_t test_dbgfs_write(struct file *file, const = char __user *buffer, case 0: test_watch_fire(); break; + case 1: + test_canary_overflow(); + break; default: pr_err("Unknown test number %d\n", test_num); return -EINVAL; @@ -74,7 +91,8 @@ static ssize_t test_dbgfs_read(struct file *file, char __= user *buffer, "=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D usage =3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D\n" "Usage:\n" "echo test{i} > /sys/kernel/debug/kstackwatch/test\n" - " test0 - test watch fire\n"; + " test0 - test watch fire\n" + " test1 - test canary overflow\n"; =20 return simple_read_from_buffer(buffer, count, ppos, usage, strlen(usage)); --=20 2.43.0 From nobody Thu Oct 2 01:01:41 2025 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 B7F4D26C3A4 for ; Tue, 30 Sep 2025 02:45:55 +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=1759200357; cv=none; b=LKuJ/yv/oTwSVz5gygH7Mah6ab4Q3dlcsbpLFbGSTbTfuhjSTui0m8i6iLV3tWc9Q8TS88zLbjywcExZ+avPJUbd4jJwofWbobEpcHAEttsDsgr38vzDt28s0kDAmJJWy99CBfIygw9z3Sd59XMYYdwQnxtr+zdh4bgKjS57TxA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759200357; c=relaxed/simple; bh=WUmvecag/bRJ9LbEABvkcHBuLoUzQ3sY4/EKuJYpRQE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=pMlRu4dxHEZtqjEFWV8n1tMa6u4O1YoOpDbfc7bEJ1dPlDwWAmaeG6CPR95RhjepCAlvWvo20PZcbK2/HGbiXF7L9KgltnraklgJRWFm/0zMaaamBzcUuZwL0ihJzsrqiFU64exSUCq7vpHuBN9lAyXlsrqkLq4IoyqM3QZIgAo= 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=UtNTcY6n; 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="UtNTcY6n" Received: by mail-pf1-f172.google.com with SMTP id d2e1a72fcca58-78127433a32so2409311b3a.1 for ; Mon, 29 Sep 2025 19:45:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1759200355; x=1759805155; 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=ANupiyfNlS++I01zMHP5Qbsc6Wgfn8wZLgNnwRsiWjA=; b=UtNTcY6nEyOkr6nfhHubQfmLFjQMmbWG9I/TLRBH+IUtB1rWBZQ/E61TFCjA5f6BnG NEzWEYOXZuup0kUOIr9fqcxL9+C8dX3J7CSMwq7n0WuJhmHDHdCUSdIaeuVgNWmiyaNz LI1rT27GDNqsCt728MSjQ/5vKlRBRCumScPxNQehpSvpsXYYJDkzYLmRnEaED43NGerJ wS3hNXB4Kla0AVzFIbcavTLQ09PwgqQQtMWasLR8+l5pNND2I+XcFwnm3xK5qVuvFBPw jFINLsNyqvJbEdob8KKtg8tZSLEye/gLqTcDRG3m+prja+73T/tpATIXOZlBtsz3/nR6 L/eg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1759200355; x=1759805155; 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=ANupiyfNlS++I01zMHP5Qbsc6Wgfn8wZLgNnwRsiWjA=; b=GUa6m+qjYrX6YWOVNscFudkzj+EYs5gzeId+5+g9n4IpSB5Bscjsuv7pIlxrUG6bgo 3K5IouHw1ACLabObV+8o8hOAhTGJti/QZSd/zMhWdFiO3GFcGfzKCn6/oAk2nZ1DZ1n+ 8cq6cJYZ4gg/3zKMs4AJSl2L/5MDPI0SxSLQav6QE4M6fLAsMD8qiMs36we/uNP/T+mN COEkEitoMze4yez74tQ+0k/vT0t+ntz0LpPUwsqItkm56z6NpCaXQrbHgx3j98HnU8lt U6I1BkD+4XSmQ7ylsIFeKPRbI5TxABat1tgggvpyQcWEVT2/4rDNw1lOfLnGacQQqpgV QDUg== X-Forwarded-Encrypted: i=1; AJvYcCWMtcM8JSoYODIqZcsg8f9R3fey3Y4qfNtylKFhLIBo0tVckTbHk7UOkZRrYOoIxo4Vv8c0HWBJ8d3mG98=@vger.kernel.org X-Gm-Message-State: AOJu0YzuOIjuh9D77ayis83//axEDdGoXfUfuZNwoOCt6XnRsyDZE608 Csj9CnziM6fP2VVftuL7YRQwjYuZ8tg8Qu4wJPyqgpcQHPIEywhmoRMK X-Gm-Gg: ASbGncvM3AWe4AuFkh5Uhdo1Nn/WY0KiuzQHu1g4vqHdW/D+FFS91DGIXDy3jNJdUxE h7o7uOC50yejQ9oeDv4It64GHQmk6SDIBs3/5B47MoeQwrUX+aARhuQfro5oxrSjg11vpGbxA7j /FHX9NnXQZkcB9/+H0+G27SiM1/aTvFSq/xj933EthrD7AridZtUc1HbHRQFdDll00m+YZRFz9Q WPk1M7JS+hr9lSHrmiqKixCFwvW8i6Xm9115HVBBANVHu6W0bDQ4n0KfDPBwRz7fWV2qu29hI8a /6CN/5Cqo8BdDhVgr1m40rLU2m/x7BbVUC6sCwKP8KQcolu16tIYLL1SSL0o+u6GeOAwA4hvgMt O1NdKNmsywaipQfRCUspSjTBRe4UtKxwNBeD6grAG1GvhCssPCmSws7VRSUFSNClFV3YdRVqXef rC X-Google-Smtp-Source: AGHT+IFgQx8Uh36EA0aXny7DSw1dXOgHQg+bo/K2OmzhGw1sKK8D6YsVYmNHfsV+5mgUHC/7blvjEg== X-Received: by 2002:a05:6a00:3cd4:b0:781:261b:7524 with SMTP id d2e1a72fcca58-781261b762bmr11615416b3a.14.1759200354649; Mon, 29 Sep 2025 19:45:54 -0700 (PDT) Received: from localhost ([45.142.167.196]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-78102b2ec47sm12565336b3a.50.2025.09.29.19.45.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Sep 2025 19:45:54 -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 v6 19/23] mm/ksw: add recursive depth test Date: Tue, 30 Sep 2025 10:43:40 +0800 Message-ID: <20250930024402.1043776-20-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250930024402.1043776-1-wangjinchao600@gmail.com> References: <20250930024402.1043776-1-wangjinchao600@gmail.com> 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" Introduce a test that performs stack writes in recursive calls to exercise stack watch at a specific recursion depth. Signed-off-by: Jinchao Wang --- mm/kstackwatch/test.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/mm/kstackwatch/test.c b/mm/kstackwatch/test.c index 012692c97a50..203fff4bec92 100644 --- a/mm/kstackwatch/test.c +++ b/mm/kstackwatch/test.c @@ -18,6 +18,7 @@ static struct dentry *test_file; =20 #define BUFFER_SIZE 32 +#define MAX_DEPTH 6 =20 static void test_watch_fire(void) { @@ -46,6 +47,21 @@ static void test_canary_overflow(void) pr_info("exit of %s\n", __func__); } =20 +static void test_recursive_depth(int depth) +{ + u64 buffer[BUFFER_SIZE]; + + pr_info("entry of %s depth:%d\n", __func__, depth); + + if (depth < MAX_DEPTH) + test_recursive_depth(depth + 1); + + buffer[0] =3D depth; + barrier_data(buffer); + + pr_info("exit of %s depth:%d\n", __func__, depth); +} + static ssize_t test_dbgfs_write(struct file *file, const char __user *buff= er, size_t count, loff_t *pos) { @@ -71,6 +87,9 @@ static ssize_t test_dbgfs_write(struct file *file, const = char __user *buffer, case 1: test_canary_overflow(); break; + case 2: + test_recursive_depth(0); + break; default: pr_err("Unknown test number %d\n", test_num); return -EINVAL; @@ -92,7 +111,8 @@ static ssize_t test_dbgfs_read(struct file *file, char _= _user *buffer, "Usage:\n" "echo test{i} > /sys/kernel/debug/kstackwatch/test\n" " test0 - test watch fire\n" - " test1 - test canary overflow\n"; + " test1 - test canary overflow\n" + " test2 - test recursive func\n"; =20 return simple_read_from_buffer(buffer, count, ppos, usage, strlen(usage)); --=20 2.43.0 From nobody Thu Oct 2 01:01:41 2025 Received: from mail-pl1-f175.google.com (mail-pl1-f175.google.com [209.85.214.175]) (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 4692E26D4FB for ; Tue, 30 Sep 2025 02:45:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759200361; cv=none; b=YomjvIkLxGtk2oiGGAhPGZhQoJ5IV2PGN5bXnTrbDeexXCmFKrVe1o59PKzUlka2jCxFGJuRpQQYfXNd+gd5RDkJ05Uz/AnXlbIyiU79CQXfNi/pIcKKoPPe2LSGLmHFnU9t6wU/6lo8T5xx1sFr3OJuLKmnqMPKXtKL6OnR37s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759200361; c=relaxed/simple; bh=fxWJKkmTlJVGhf37wzDyuZOWELAg09qlFO66bjAfLB4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=XPIdm8Jx8eJ6uwEuE+wLYlypVYywvryWkZHYh+NxPwRfo27Qh/8KXwctV7zRorhlYMnIVZmNNyrwU1mHqjumk35nAcZoCRB+Lrm2BmEhb/Z3bEM7BigfvWpxu7yPW4hULABTBkr9KPllnNpHIY6CnbfJdfarrU6bpXKqtqzhxy8= 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=U8CNtn4R; arc=none smtp.client-ip=209.85.214.175 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="U8CNtn4R" Received: by mail-pl1-f175.google.com with SMTP id d9443c01a7336-28a5b8b12a1so16376975ad.0 for ; Mon, 29 Sep 2025 19:45:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1759200358; x=1759805158; 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=wSXL/rVpDaFhkpWTVL2v5h6JspYJZAfxl9VpOD0Az0s=; b=U8CNtn4RlFwDL+Bu5RLENJnTv/cgcIZ1KYanSNGhHfhVeiWA5sn+4i4QC/y63JiFbd Z6UpeBaVFiySVJZ3eo8LLsh43/LEu9UQEcFQygbSyGabRKxrG1I2jHAwsv0B5UXRtp6C O6L+yA+nWDAfNWAj3b/vn+v9fAu4MgcIe3dO2UCgw0CfOi57uXlBvf76Yj7VULB+wI9+ L47GzsnCeXfH72g0ipzVRj1LhjKmvM0aZ8olFO7oTpVcSjFQzrK3t01ycsIxi1F9K2SG eq/QpqxDvWBwssAmMnpnDcmQZHp2SPuMKkOWC0toSSovuvuAQgs+SXtY7iBgvRx5tqqx 6S0w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1759200358; x=1759805158; 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=wSXL/rVpDaFhkpWTVL2v5h6JspYJZAfxl9VpOD0Az0s=; b=NBWNSxigE4iN6Wqhs/jXYsdVw+adCn1Pd4v4Tw+tN5W0LbWaINs4iMuZazgnuZmOLL ucuzI+djK+SJy2vAtrWDdRRMCyuXbXG9reLPcSAZNO+Jdik9FPt0oL1NyEFLXpzcE3ue T39U3W0+o/jSoGMIenysGPI8grEQEbRZabDzCCo2srcG6+Zk1phTWQSGlf8Q09mHb8fn 6DtSEpCn4AJWDBfwMNSWknxzAhw4MmNXFi+1+4mWksR5IXZ6iatD5tqvwIHlG6cxmXB9 muYd9He022IOBjN8Q382LXO40KHFpjHCrEa8yP4iYJEFoICUHymGIFvIhJq5GY1NDjF8 rTjw== X-Forwarded-Encrypted: i=1; AJvYcCWWZWDU8rCsi0cQqdBqVL1W6PvqKZPldZLECJYKQb3J2YM3HpKNbnVkHeRWkv0u1//RgmEdXup/dVT0roI=@vger.kernel.org X-Gm-Message-State: AOJu0YwTMXzWmb+LbeMHdyBpkjPFN2WoEZTKtLZvsdlQiqISHzKnrARA sSmB+gb3jyrEb6ag1WGAnNAT6PEX7Y4EBQx60GrdacDNBKWrFTrQ4KU/ X-Gm-Gg: ASbGncs42v0kDh+9hGOeg0ejyfeHpgVTQxLrmi8dayjtHT6EfQSs+HS68DLSY5m5qrG cekH1tReA8ouRcQrozv3CeForYb9KZGd7UWq+ubAP+1+ubbBkdDSzDkOUB43bW77ye3rIMHhCoX EjQ7ca5g4qTOJcOMcHw02S02VAA36CoG1fnecmLnw5UKjuZjzcOLznG8Gq9/hmluXCTHhWyNzXa M4hQ6I5VXWBUWyEetRfPTVTnLkvUeNWOnZ8iKP0b5BBfeP8R1zrH0LVJtBDyXjrIYZ16RBk6rH7 VWUTXbeKMaQAxwFq5XCRfJCu2XaxopWRBSTnrRObS/u5ggvVOgUb1iTS2kd5OB/QfuEk/eAVjWa H5o8mf+zNHurJwGbULJx4dtNbq9Esu1l1MtResb7EiiRGODW05XtZ0PqwnNILLk7vtw== X-Google-Smtp-Source: AGHT+IH6gM/KNPy+EKuwDpqrsR2PCtVeobdVuJ/I6iYU/PVMeQcdMhYmE/6vu80Fhzh9wbuUwcXL7Q== X-Received: by 2002:a17:903:19f0:b0:26c:e270:6dad with SMTP id d9443c01a7336-27ed4ae51c6mr173137795ad.60.1759200358349; Mon, 29 Sep 2025 19:45:58 -0700 (PDT) Received: from localhost ([45.142.167.196]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-27ed69ba58csm144532905ad.121.2025.09.29.19.45.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Sep 2025 19:45:57 -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 v6 20/23] mm/ksw: add multi-thread corruption test cases Date: Tue, 30 Sep 2025 10:43:41 +0800 Message-ID: <20250930024402.1043776-21-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250930024402.1043776-1-wangjinchao600@gmail.com> References: <20250930024402.1043776-1-wangjinchao600@gmail.com> 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" These tests share a common structure and are grouped together. - buggy(): exposes the stack address to corrupting(); may omit waiting - corrupting(): reads the exposed pointer and modifies memory; if buggy() omits waiting, victim()'s buffer is corrupted - victim(): initializes a local buffer and later verifies it; reports an error if the buffer was unexpectedly modified buggy() and victim() run in worker() thread, with similar stack frame sizes to simplify testing. By adjusting fence_size in corrupting(), the test can trigger either silent corruption or overflow across threads. - Test 3: one worker, 20 loops, silent corruption - Test 4: 20 workers, one loop each, silent corruption - Test 5: one worker, one loop, overflow corruption Test 4 also exercises multiple watchpoint instances. Signed-off-by: Jinchao Wang --- mm/kstackwatch/test.c | 186 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 185 insertions(+), 1 deletion(-) diff --git a/mm/kstackwatch/test.c b/mm/kstackwatch/test.c index 203fff4bec92..2952efcc7738 100644 --- a/mm/kstackwatch/test.c +++ b/mm/kstackwatch/test.c @@ -20,6 +20,20 @@ static struct dentry *test_file; #define BUFFER_SIZE 32 #define MAX_DEPTH 6 =20 +struct work_node { + ulong *ptr; + u64 start_ns; + struct completion done; + struct list_head list; +}; + +static DECLARE_COMPLETION(work_res); +static DEFINE_MUTEX(work_mutex); +static LIST_HEAD(work_list); + +static int global_fence_size; +static int global_loop_count; + static void test_watch_fire(void) { u64 buffer[BUFFER_SIZE] =3D { 0 }; @@ -62,6 +76,164 @@ static void test_recursive_depth(int depth) pr_info("exit of %s depth:%d\n", __func__, depth); } =20 +static struct work_node *test_mthread_buggy(int thread_id, int seq_id) +{ + ulong buf[BUFFER_SIZE]; + struct work_node *node; + bool trigger; + + node =3D kmalloc(sizeof(*node), GFP_KERNEL); + if (!node) + return NULL; + + init_completion(&node->done); + node->ptr =3D buf; + node->start_ns =3D ktime_get_ns(); + mutex_lock(&work_mutex); + list_add(&node->list, &work_list); + mutex_unlock(&work_mutex); + complete(&work_res); + + trigger =3D (get_random_u32() % 100) < 10; + if (trigger) + return node; /* let the caller handle cleanup */ + + wait_for_completion(&node->done); + kfree(node); + return NULL; +} + +#define CORRUPTING_MINIOR_WAIT_NS (100000) +#define VICTIM_MINIOR_WAIT_NS (300000) + +static inline void silent_wait_us(u64 start_ns, u64 min_wait_us) +{ + u64 diff_ns, remain_us; + + diff_ns =3D ktime_get_ns() - start_ns; + if (diff_ns < min_wait_us * 1000ULL) { + remain_us =3D min_wait_us - (diff_ns >> 10); + usleep_range(remain_us, remain_us + 200); + } +} + +static void test_mthread_victim(int thread_id, int seq_id, u64 start_ns) +{ + ulong buf[BUFFER_SIZE]; + + for (int j =3D 0; j < BUFFER_SIZE; j++) + buf[j] =3D 0xdeadbeef + seq_id; + if (start_ns) + silent_wait_us(start_ns, VICTIM_MINIOR_WAIT_NS); + + for (int j =3D 0; j < BUFFER_SIZE; j++) { + if (buf[j] !=3D (0xdeadbeef + seq_id)) { + pr_warn("victim[%d][%d]: unhappy buf[%d]=3D0x%lx\n", + thread_id, seq_id, j, buf[j]); + return; + } + } + + pr_info("victim[%d][%d]: happy\n", thread_id, seq_id); +} + +static int test_mthread_corrupting(void *data) +{ + struct work_node *node; + int fence_size; + + while (!kthread_should_stop()) { + if (!wait_for_completion_timeout(&work_res, HZ)) + continue; + while (true) { + mutex_lock(&work_mutex); + node =3D list_first_entry_or_null(&work_list, + struct work_node, list); + if (node) + list_del(&node->list); + mutex_unlock(&work_mutex); + + if (!node) + break; /* no more nodes, exit inner loop */ + silent_wait_us(node->start_ns, + CORRUPTING_MINIOR_WAIT_NS); + + fence_size =3D READ_ONCE(global_fence_size); + for (int i =3D fence_size; i < BUFFER_SIZE - fence_size; + i++) + node->ptr[i] =3D 0xabcdabcd; + + complete(&node->done); + } + } + + return 0; +} + +static int test_mthread_worker(void *data) +{ + int thread_id =3D (long)data; + int loop_count; + struct work_node *node; + + loop_count =3D READ_ONCE(global_loop_count); + + for (int i =3D 0; i < loop_count; i++) { + node =3D test_mthread_buggy(thread_id, i); + + if (node) + test_mthread_victim(thread_id, i, node->start_ns); + else + test_mthread_victim(thread_id, i, 0); + if (node) { + wait_for_completion(&node->done); + kfree(node); + } + } + return 0; +} + +static void test_mthread_case(int num_workers, int loop_count, int fence_s= ize) +{ + static struct task_struct *corrupting; + static struct task_struct **workers; + + WRITE_ONCE(global_loop_count, loop_count); + WRITE_ONCE(global_fence_size, fence_size); + + init_completion(&work_res); + workers =3D kmalloc_array(num_workers, sizeof(void *), GFP_KERNEL); + memset(workers, 0, sizeof(struct task_struct *) * num_workers); + + corrupting =3D kthread_run(test_mthread_corrupting, NULL, "corrupting"); + if (IS_ERR(corrupting)) { + pr_err("failed to create corrupting thread\n"); + return; + } + + for (ulong i =3D 0; i < num_workers; i++) { + workers[i] =3D kthread_run(test_mthread_worker, (void *)i, + "worker_%ld", i); + if (IS_ERR(workers[i])) { + pr_err("failto create worker thread %ld", i); + workers[i] =3D NULL; + } + } + + for (ulong i =3D 0; i < num_workers; i++) { + if (workers[i] && workers[i]->__state !=3D TASK_DEAD) { + usleep_range(1000, 2000); + i--; + } + } + kfree(workers); + + if (corrupting && !IS_ERR(corrupting)) { + kthread_stop(corrupting); + corrupting =3D NULL; + } +} + static ssize_t test_dbgfs_write(struct file *file, const char __user *buff= er, size_t count, loff_t *pos) { @@ -90,6 +262,15 @@ static ssize_t test_dbgfs_write(struct file *file, cons= t char __user *buffer, case 2: test_recursive_depth(0); break; + case 3: + test_mthread_case(1, 20, BUFFER_SIZE / 4); + break; + case 4: + test_mthread_case(20, 1, BUFFER_SIZE / 4); + break; + case 5: + test_mthread_case(1, 1, -3); + break; default: pr_err("Unknown test number %d\n", test_num); return -EINVAL; @@ -112,7 +293,10 @@ static ssize_t test_dbgfs_read(struct file *file, char= __user *buffer, "echo test{i} > /sys/kernel/debug/kstackwatch/test\n" " test0 - test watch fire\n" " test1 - test canary overflow\n" - " test2 - test recursive func\n"; + " test2 - test recursive func\n" + " test3 - test silent corruption\n" + " test4 - test multiple silent corruption\n" + " test5 - test prologue corruption\n"; =20 return simple_read_from_buffer(buffer, count, ppos, usage, strlen(usage)); --=20 2.43.0 From nobody Thu Oct 2 01:01:41 2025 Received: from mail-pf1-f174.google.com (mail-pf1-f174.google.com [209.85.210.174]) (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 DA2DA26F462 for ; Tue, 30 Sep 2025 02:46:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759200365; cv=none; b=rdAtLXvhFTzCiOs9b8Eg1Ex8Hk6gFSRrNbwJ/RvftsRV1IP6Eio+83ym5Q0IRrzoOCUynZt0wSA9NVBsXDoV9lnhxA9VROfmOWbf0Rzq7M8l1QnmbryqyxGHxsIb/0f+LeuYN14X85D41GFIYLE9qcca97iWNYdpucMCghHhkBg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759200365; c=relaxed/simple; bh=fx5MM9mgeadn4AlECL2EeIytilVmfLOb03DEtE9qwqg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=iJmpvBxcx1ZKnCIyO2YBP6bV1gPpst4xDLQ1UsahI1R3uJ9vudhEUq4QMOqTh5juDvc0pjHRSwgo7khmxlh30sYKddYnN00djCAUBU1dDIvN5zxQ0aZ2V0yoXhw+JfIJkRq1WQ6Cjz7pbcxxZ4FSYTfNZHACd7w+E4cVP3NGFy0= 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=O8FTpfIJ; arc=none smtp.client-ip=209.85.210.174 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="O8FTpfIJ" Received: by mail-pf1-f174.google.com with SMTP id d2e1a72fcca58-7811a5ec5b6so2801365b3a.1 for ; Mon, 29 Sep 2025 19:46:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1759200363; x=1759805163; 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=PODRMG2Z8bUUhx/yC1VRhywhZMIHoJSOmQZCJHqYhJ8=; b=O8FTpfIJF77/+l/7172sGlDYO/DOMo5RG88uwraCu875hTHNE0bM7ArPzbklo6ytFE zR9NVP40FJh3zKFPFukefT+P1Qdtkc6LZ1jvPjnjNMtj68m/urRKS5AlZCw/QBkqicul D1JcBQthKczeqPZs8T7bKuY211BpQIOnlX68p15YmiOWl8FsCvLqSznWkZ4df2PJ8Bzr wW+FN4iUeEV4mhIq+5aooFEYaK9kqrRcqLQFJ+dA5psUojE/v6IZKWCcKdyqvq6yG7Bb iWS1bGl4KItp8lQYgNeNyAzVuEsASVTJDn2AeYwaqo8md2Xb8YUbmi2/2TIB+w9Y2Mec P9Cg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1759200363; x=1759805163; 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=PODRMG2Z8bUUhx/yC1VRhywhZMIHoJSOmQZCJHqYhJ8=; b=qs2jAQgRGwqXnUEfRYr0++XqcpxacLLSiZH8Q8s/H7y+/VpyBHT/nUh11em1SBdtkL mav13/7jaIFYnDy853TxqWOdWGtGWPSrZdGsVBcX+KfaC9X3FrHRMV92CBNmUw+Kvzm8 QfgdNtb0PKQGNfIgLI0nIqepvTP8iNm/fsGeyl+U7oKaYiVwvkPgCR0Baq0qNw3+XVrM Bzr9Fy4+sZpjzULe3kpHhvnOywkpUwmsqBqJdK98IZ0AH1UnBkaxGNb3PpfiZ2xXwI9r 8FDDKgNvFuxq6SezM35cu6keSlGtSO1ZXkx5S9vakgalowZFQPSJo9j5wii9manXsDBE vHOA== X-Forwarded-Encrypted: i=1; AJvYcCUjLwRdnYhfZ6MUTbLEdeGzTIpmMzR3zKqy0Oh2morvsXOPiER8it2P2bEupgGjhb9nvc2rZIlHhFIQT0c=@vger.kernel.org X-Gm-Message-State: AOJu0YzTf5N6xq7I5SME3aI1kGXXtAB42cPXYFzTAb8dV2XfdQXzTQYB C7Uh7nq8StJY3xOICMJQhddiU/gG7GT2aF1vmRtpXfJSei3LCQvda52C X-Gm-Gg: ASbGnctlTLf4RVe1ejt5Sq4b23MIJfEDD15IS8o8jixD270eMp8OB2qxXP14xZH5MTH OB6Nlk4MCLfvCOPfPKpmZIIbuyW63OUc1SDdJ5I4cKqBEGtgaIc9awh1ROAYVh7jmpk/QDeyz4e 9uKnkE/tjwVoZgoSBV9R8cEIwwPV/FQWLEXCPXvTL4bXQVNmLgKz36oH957wO7qKqZ+O25nXLQ3 HaYUxYQTni2EU9EnQYZ371oQG3yZyhl8RyFz6AxkYmikmh0GKMa/tzIWqqSpomWrMXOtdmiVTFL HeEZUUNXwEM0ZR3hr47S09MsAJrOlG5PXguepzq72EHL6nzfJ5r2bmSGFu+Q4yKFIb7vkH0RyGu hx2nZrl+HfHso9Ocgt07mjd3E/ZLval+5uqbOoLIqzp37fOlNgWioLI9dD5hXK66N5i9qqtoRNX q1 X-Google-Smtp-Source: AGHT+IHP7Td3KbhlqylvVUhjonZ8jqxOR18BBallTWQed6L2+fSp22hmPw3ChS33nbn+ktPyuhPsHw== X-Received: by 2002:a17:90b:264a:b0:32e:64ed:c20a with SMTP id 98e67ed59e1d1-3383aa8b143mr3140082a91.0.1759200362962; Mon, 29 Sep 2025 19:46:02 -0700 (PDT) Received: from localhost ([45.142.167.196]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-338387099d6sm2786368a91.10.2025.09.29.19.46.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Sep 2025 19:46:02 -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 v6 21/23] tools/ksw: add test script Date: Tue, 30 Sep 2025 10:43:42 +0800 Message-ID: <20250930024402.1043776-22-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250930024402.1043776-1-wangjinchao600@gmail.com> References: <20250930024402.1043776-1-wangjinchao600@gmail.com> 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" Provide a shell script to trigger test cases. Signed-off-by: Jinchao Wang --- tools/kstackwatch/kstackwatch_test.sh | 52 +++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100755 tools/kstackwatch/kstackwatch_test.sh diff --git a/tools/kstackwatch/kstackwatch_test.sh b/tools/kstackwatch/ksta= ckwatch_test.sh new file mode 100755 index 000000000000..35cad036ecee --- /dev/null +++ b/tools/kstackwatch/kstackwatch_test.sh @@ -0,0 +1,52 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0 + +echo "IMPORTANT: Before running, make sure you have updated the config val= ues!" + +usage() { + echo "Usage: $0 [0-5]" + echo " 0 - test watch fire" + echo " 1 - test canary overflow" + echo " 2 - test recursive depth" + echo " 3 - test silent corruption" + echo " 4 - test multi-threaded silent corruption" + echo " 5 - test multi-threaded overflow" +} + +run_test() { + local test_num=3D$1 + case "$test_num" in + 0) echo fn=3Dtest_watch_fire fo=3D0x29 wl=3D8 >/sys/kernel/debug/kstackwa= tch/config + echo test0 > /sys/kernel/debug/kstackwatch/test + ;; + 1) echo fn=3Dtest_canary_overflow fo=3D0x14 >/sys/kernel/debug/kstackwatc= h/config + echo test1 >/sys/kernel/debug/kstackwatch/test + ;; + 2) echo fn=3Dtest_recursive_depth fo=3D0x2f dp=3D3 wl=3D8 so=3D0 >/sys/ke= rnel/debug/kstackwatch/config + echo test2 >/sys/kernel/debug/kstackwatch/test + ;; + 3) echo fn=3Dtest_mthread_victim fo=3D0x4c so=3D64 wl=3D8 >/sys/kernel/de= bug/kstackwatch/config + echo test3 >/sys/kernel/debug/kstackwatch/test + ;; + 4) echo fn=3Dtest_mthread_victim fo=3D0x4c so=3D64 wl=3D8 >/sys/kernel/de= bug/kstackwatch/config + echo test4 >/sys/kernel/debug/kstackwatch/test + ;; + 5) echo fn=3Dtest_mthread_buggy fo=3D0x16 so=3D0x100 wl=3D8 >/sys/kernel/= debug/kstackwatch/config + echo test5 >/sys/kernel/debug/kstackwatch/test + ;; + *) usage + exit 1 ;; + esac + # Reset watch after test + echo >/sys/kernel/debug/kstackwatch/config +} + +# Check root and module +[ "$EUID" -ne 0 ] && echo "Run as root" && exit 1 +for f in /sys/kernel/debug/kstackwatch/config /sys/kernel/debug/kstackwatc= h/test; do + [ ! -f "$f" ] && echo "$f not found" && exit 1 +done + +# Run +[ -z "$1" ] && { usage; exit 0; } +run_test "$1" --=20 2.43.0 From nobody Thu Oct 2 01:01:41 2025 Received: from mail-pl1-f174.google.com (mail-pl1-f174.google.com [209.85.214.174]) (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 D10E326FDBB for ; Tue, 30 Sep 2025 02:46:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759200369; cv=none; b=CocIQUCuQV6pvp4D4JuVQzoGJW903aeemnqToNqGGsTtzJczEwDbMyQcfWcn42DANQfO+IZff/bv7chFJGXOAjaJJ8nwxu0weX88BfIX/xUZkoYxYIGdtujh8/d417D8lVJ3IUd0mKNerSrLjq2nIRnojeEJPGahESbPokRT8kY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759200369; c=relaxed/simple; bh=fqSTZakucv5x/6mevb99A5bIyJAUPszvDZjEXujGW3E=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=oV0g6tesi1oPeRJkiLG6BMuIzGHJl56M8XZ+LqRiE2f/nJJkw5btqdlNEfI4e9Zczxdsn9hM1oqlJGxrDhkRsAYRKNeRLMkO/5k5gbAveWQuPx24oD/cfd1IuLQpkPjqftMrMOWxGrXPzrBjZopMlXPjoWlmOYzh7ynYY3wRM0U= 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=hwGkXK96; arc=none smtp.client-ip=209.85.214.174 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="hwGkXK96" Received: by mail-pl1-f174.google.com with SMTP id d9443c01a7336-271d1305ad7so70291725ad.2 for ; Mon, 29 Sep 2025 19:46:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1759200367; x=1759805167; 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=9bGi3tzoowdq7F8N73OupFeSpGLIzMxuMKRIXFA+k0I=; b=hwGkXK964jC/canEa9GRr+8Rz80k7tmoFbMRAjmWKCoy0wnhyb2pbJgh+CDiSogsnE kVYF4xh6GPJFlXzbukXYpYqaedYXSIPe8bTdG8/EtQPR1fn7GtMfZpIX1t/BqWDg4Cdi +IDutdGy9Lpnaaoe6P/8HAV1SNCnE+TookOrOUANCQw8pbWAg2rFtJ4OTh5DLu8P18Cv 0KlvfGcV6hKT2aCckGU/xhEyyCPUZKbRLMkchmDq1BlA4xj2b6gw0ci8XWzqtAOpyx+y XPQImQWclIvHxP+ZzhYxcYoTwJW2S3bGyepBhTSXdYd1OciCwnOAKjpN9so/mIAj4ciY fVgg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1759200367; x=1759805167; 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=9bGi3tzoowdq7F8N73OupFeSpGLIzMxuMKRIXFA+k0I=; b=jlOt/9Pr0owG2qqJZTgThtstCI5o1pSAzmcD4JkyN+IFAF53h/OLOr7w8lpPR81AG4 w0Mg6KuLNLDC4TzhTEs1xz3aoSisE8AUIoQtVXfGEhVu9RfZ7k8cg0Fw/ye5okRgn12m BRwc0w5yoY1Qq5R5ek1ZXXZCNn3pcwQvclRNvqaRgHnYEwl3mv+6d3XV6UIde9jFN29k VDoHQnaW2S+1mFW9xinD8pXzQU3gpFZ9zDl7YUnSXovcFaNoCTOUkez0HSTkgTML27yg fPYStGxdk07kqp3v5VQRtpFqI8F+eV3viMKjpHwAfbMpzv+zEJ1CHFChBtxs8jVef8Fz nRqQ== X-Forwarded-Encrypted: i=1; AJvYcCUviNu6xbdCn2W+OZ0n1TKQnvmHHk38fX34jggmP4x/82m7kyDr1pXoTOlscQ+KLkqmBINo4Y17NkEUatU=@vger.kernel.org X-Gm-Message-State: AOJu0Yxm7QAC3kC3ccxUVJQfQyX7bHbjRVQ5WfOWkenlcVrH49SoMd1M wgMW1yK8QCWArAi7VQxtqiMAGhIERO+cYf8g5mqVNvaiyt5s29Id54Qw X-Gm-Gg: ASbGncvFzPKAMvbL2AiQEt7qpwVmr3nwZcTDlTu+LATpYgXknfcRBxcA/ZI7Po9W+Eo qx0soinwnIxv5FAFzl7AC+vo3eQ8wblygIT5/xCfnm9pDNf0mYlMmi3UfLKZqrD4QvBsHWdt55u P6kjlbFMKzFDwaY6MlENLQpGRGUeY5ljIoOftubkpgS/3zKbHsG8u6xDgAIFGOemNooq8dZQmmn CyeEbvPAumGvewBRSUdraKO9Vv/yMf9fTnsEKSxbVsptA4KVdR3j3bJRKLLYXDcaWmh9zITjVLm MBSu6wblet7K/ojlFLh8M2YIuVjxmxhSnk42p1ErBKL8FeFCAAOCcTfX6g09xLeRnYt7PwtE0NS RXtOyUQdWtDjqjpns90rlWIXqq/IkPZWJbSS8kYcio28g+Ndd0cwCZ3Ea6HjqzxvvAvodZwMKPk 8i X-Google-Smtp-Source: AGHT+IFoiKVgZ7dg//OuhMhm/v5is/JKhf1lFey82Z71vebCWO6695PgeZ0Sr0qvIyrxcwzNDU9ePQ== X-Received: by 2002:a17:903:2ace:b0:268:f83a:835a with SMTP id d9443c01a7336-27ed4a64485mr174059075ad.60.1759200367052; Mon, 29 Sep 2025 19:46:07 -0700 (PDT) Received: from localhost ([45.142.167.196]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-27ed6881fcasm144484295ad.93.2025.09.29.19.46.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Sep 2025 19:46:06 -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 v6 22/23] docs: add KStackWatch document Date: Tue, 30 Sep 2025 10:43:43 +0800 Message-ID: <20250930024402.1043776-23-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250930024402.1043776-1-wangjinchao600@gmail.com> References: <20250930024402.1043776-1-wangjinchao600@gmail.com> 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" Add documentation for KStackWatch under Documentation/. It provides an overview, main features, usage details, configuration parameters, and example scenarios with test cases. The document also explains how to locate function offsets and interpret logs. Signed-off-by: Jinchao Wang --- Documentation/dev-tools/index.rst | 1 + Documentation/dev-tools/kstackwatch.rst | 314 ++++++++++++++++++++++++ 2 files changed, 315 insertions(+) create mode 100644 Documentation/dev-tools/kstackwatch.rst diff --git a/Documentation/dev-tools/index.rst b/Documentation/dev-tools/in= dex.rst index 65c54b27a60b..45eb828d9d65 100644 --- a/Documentation/dev-tools/index.rst +++ b/Documentation/dev-tools/index.rst @@ -31,6 +31,7 @@ Documentation/process/debugging/index.rst kcsan kfence kselftest + kstackwatch kunit/index ktap checkuapi diff --git a/Documentation/dev-tools/kstackwatch.rst b/Documentation/dev-to= ols/kstackwatch.rst new file mode 100644 index 000000000000..7100248bc130 --- /dev/null +++ b/Documentation/dev-tools/kstackwatch.rst @@ -0,0 +1,314 @@ +.. SPDX-License-Identifier: GPL-2.0 + +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D +Kernel Stack Watch (KStackWatch) +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D + +Overview +=3D=3D=3D=3D=3D=3D=3D=3D + +KStackWatch is a lightweight debugging tool designed to detect kernel stack +corruption in real time. It installs a hardware breakpoint (watchpoint) at= a +function's specified offset using *kprobe.post_handler* and removes it in +*fprobe.exit_handler*. This covers the full execution window and reports +corruption immediately with time, location, and call stack. + +Main features: + +* Immediate and precise detection +* Supports concurrent calls to the watched function +* Lockless design, usable in any context +* Depth filter for recursive calls +* Minimal impact on reproducibility +* Flexible configuration with key=3Dval syntax + +Usage +=3D=3D=3D=3D=3D + +KStackWatch is configured through */sys/kernel/debug/kstackwatch/config* u= sing a +key=3Dvalue format. Both long and short forms are supported. Writing an em= pty +string disables the watch. + +.. code-block:: bash + + # long form + echo func_name=3D? func_offset=3D? ... > /sys/kernel/debug/kstackwatch/co= nfig + + # short form + echo fn=3D? fo=3D? ... > /sys/kernel/debug/kstackwatch/config + + # disable + echo > /sys/kernel/debug/kstackwatch/config + +The func_name and the func_offset where the watchpoint should be placed mu= st be +known. This information can be obtained from *objdump* or other tools. + +Required parameters +-------------------- + ++--------------+--------+-----------------------------------------+ +| Parameter | Short | Description | ++=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D+=3D=3D=3D=3D=3D=3D=3D=3D+=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D+ +| func_name | fn | Name of the target function | ++--------------+--------+-----------------------------------------+ +| func_offset | fo | Instruction pointer offset | ++--------------+--------+-----------------------------------------+ + +Optional parameters +-------------------- + +Default 0 and can be omitted. +Both decimal and hexadecimal are supported. + ++--------------+--------+------------------------------------------------+ +| Parameter | Short | Description | ++=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D+=3D=3D=3D=3D=3D=3D=3D=3D+=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D+ +| depth | dp | Recursion depth filter | ++--------------+--------+------------------------------------------------+ +| max_watch | mw | Maximum number of concurrent watchpoints | +| | | (default 0, capped by available hardware | +| | | breakpoints) | ++--------------+--------+------------------------------------------------+ +| sp_offset | so | Watching addr offset from stack pointer | ++--------------+--------+------------------------------------------------+ +| watch_len | wl | Watch length in bytes (1, 2, 4, 8, or 0), | +| | | 0 means automatically watch the stack canary | +| | | and ignore the sp_offset parameter | ++--------------+--------+------------------------------------------------+ + +Workflow Example +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +Silent corruption +----------------- + +Consider *test3* in *kstackwatch_test.sh*. Run it directly: + +.. code-block:: bash + + echo test3 >/sys/kernel/debug/kstackwatch/test + +Sometimes, *test_mthread_victim()* may report as unhappy: + +.. code-block:: bash + + [ 7.807082] kstackwatch_test: victim[0][11]: unhappy buf[8]=3D0xabcdab= cd + +Its source code is: + +.. code-block:: c + + static void test_mthread_victim(int thread_id, int seq_id, u64 start_ns) + { + ulong buf[BUFFER_SIZE]; + + for (int j =3D 0; j < BUFFER_SIZE; j++) + buf[j] =3D 0xdeadbeef + seq_id; + + if (start_ns) + silent_wait_us(start_ns, VICTIM_MINIOR_WAIT_NS); + + for (int j =3D 0; j < BUFFER_SIZE; j++) { + if (buf[j] !=3D (0xdeadbeef + seq_id)) { + pr_warn("victim[%d][%d]: unhappy buf[%d]=3D0x%lx\n", + thread_id, seq_id, j, buf[j]); + return; + } + } + + pr_info("victim[%d][%d]: happy\n", thread_id, seq_id); + } + +From the source code, the report indicates buf[8] was unexpectedly modifie= d, +a case of silent corruption. + +Configuration +------------- + +Since buf[8] is the corrupted variable, the following configuration shows +how to use KStackWatch to detect its corruption. + +func_name +~~~~~~~~~~~ + +As seen, buf[8] is initialized and modified in *test_mthread_victim*\(\) , +which sets *func_name*. + +func_offset & sp_offset +~~~~~~~~~~~~~~~~~~~~~~~~~ +The watchpoint should be set after the assignment and as close as +possible, which sets *func_offset*. + +The watchpoint should be set to watch buf[8], which sets *sp_offset*. + +Use the objdump output to disassemble the function: + +.. code-block:: bash + + objdump -S --disassemble=3Dtest_mthread_victim vmlinux + +A shortened output is: + +.. code-block:: text + + static void test_mthread_victim(int thread_id, int seq_id, u64 start_ns) + { + ffffffff815cb4e0: e8 5b 9b ca ff call ffffffff81275040 <= __fentry__> + ffffffff815cb4e5: 55 push %rbp + ffffffff815cb4e6: 53 push %rbx + ffffffff815cb4e7: 48 81 ec 08 01 00 00 sub $0x108,%rsp + ffffffff815cb4ee: 89 fd mov %edi,%ebp + ffffffff815cb4f0: 89 f3 mov %esi,%ebx + ffffffff815cb4f2: 49 89 d0 mov %rdx,%r8 + ffffffff815cb4f5: 65 48 8b 05 0b cb 80 mov %gs:0x280cb0b(%rip= ),%rax # ffffffff83dd8008 <__stack_chk_guard> + ffffffff815cb4fc: 02 + ffffffff815cb4fd: 48 89 84 24 00 01 00 mov %rax,0x100(%rsp) + ffffffff815cb504: 00 + ffffffff815cb505: 31 c0 xor %eax,%eax + ulong buf[BUFFER_SIZE]; + ffffffff815cb507: 48 89 e2 mov %rsp,%rdx + ffffffff815cb50a: b9 20 00 00 00 mov $0x20,%ecx + ffffffff815cb50f: 48 89 d7 mov %rdx,%rdi + ffffffff815cb512: f3 48 ab rep stos %rax,%es:(%rdi) + + for (int j =3D 0; j < BUFFER_SIZE; j++) + ffffffff815cb515: eb 10 jmp ffffffff815cb527 <= test_mthread_victim+0x47> + buf[j] =3D 0xdeadbeef + seq_id; + ffffffff815cb517: 8d 93 ef be ad de lea -0x21524111(%rbx),= %edx + ffffffff815cb51d: 48 63 c8 movslq %eax,%rcx + ffffffff815cb520: 48 89 14 cc mov %rdx,(%rsp,%rcx,8) + ffffffff815cb524: 83 c0 01 add $0x1,%eax + ffffffff815cb527: 83 f8 1f cmp $0x1f,%eax + ffffffff815cb52a: 7e eb jle ffffffff815cb517 <= test_mthread_victim+0x37> + if (start_ns) + ffffffff815cb52c: 4d 85 c0 test %r8,%r8 + ffffffff815cb52f: 75 21 jne ffffffff815cb552 <= test_mthread_victim+0x72> + silent_wait_us(start_ns, VICTIM_MINIOR_WAIT_NS); + ... + ffffffff815cb571: 48 8b 84 24 00 01 00 mov 0x100(%rsp),%rax + ffffffff815cb579: 65 48 2b 05 87 ca 80 sub %gs:0x280ca87(%rip= ),%rax # ffffffff83dd8008 <__stack_chk_guard> + ... + ffffffff815cb5a1: eb ce jmp ffffffff815cb571 <= test_mthread_victim+0x91> + } + ffffffff815cb5a3: e8 d8 86 f1 00 call ffffffff824e3c80 <= __stack_chk_fail> + + +func_offset +^^^^^^^^^^^ + +The function begins at ffffffff815cb4e0. The *buf* array is initialized in= a loop. +The instruction storing values into the array is at ffffffff815cb520, and = the +first instruction after the loop is at ffffffff815cb52c. + +Because KStackWatch uses *kprobe.post_handler*, the watchpoint can be +set right after ffffffff815cb520. However, this will cause false positive +because the watchpoint is active before buf[8] is assigned. + +An alternative is to place the watchpoint at ffffffff815cb52c, right +after the loop. This avoids false positives but leaves a small window +for false negatives. + +In this document, ffffffff815cb52c is chosen for cleaner logs. If false +negatives are suspected, repeat the test to catch the corruption. + +The required offset is calculated from the function start: + +*func_offset* is 0x4c (ffffffff815cb52c - ffffffff815cb4e0). + +sp_offset +^^^^^^^^^^^ + +From the disassembly, the buf array is at the top of the stack, +meaning buf =3D=3D rsp. Therefore, buf[8] sits at rsp + 8 * sizeof(ulong) = =3D +rsp + 64. Thus, *sp_offset* is 64. + +Other parameters +~~~~~~~~~~~~~~~~~~ + +* *depth* is 0, as test_mthread_victim is not recursive +* *max_watch* is 0 to use all available hwbps +* *watch_len* is 8, the size of a ulong on x86_64 + +Parameters with a value of 0 can be omitted as defaults. + +Configure the watch: + +.. code-block:: bash + + echo "fn=3Dtest_mthread_victim fo=3D0x4c so=3D64 wl=3D8" > /sys/kernel/de= bug/kstackwatch/config + +Now rerun the test: + +.. code-block:: bash + + echo test3 >/sys/kernel/debug/kstackwatch/test + +The dmesg log shows: + +.. code-block:: text + + [ 7.607074] kstackwatch: =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D KStackWatch: C= aught stack corruption =3D=3D=3D=3D=3D=3D=3D + [ 7.607077] kstackwatch: config fn=3Dtest_mthread_victim fo=3D0x4c so= =3D64 wl=3D8 + [ 7.607080] CPU: 2 UID: 0 PID: 347 Comm: corrupting Not tainted 6.17.0= -rc7-00022-g90270f3db80a-dirty #509 PREEMPT(voluntary) + [ 7.607083] Call Trace: + [ 7.607084] <#DB> + [ 7.607085] dump_stack_lvl+0x66/0xa0 + [ 7.607091] ksw_watch_handler.part.0+0x2b/0x60 + [ 7.607094] ksw_watch_handler+0xba/0xd0 + [ 7.607095] ? test_mthread_corrupting+0x48/0xd0 + [ 7.607097] ? kthread+0x10d/0x210 + [ 7.607099] ? ret_from_fork+0x187/0x1e0 + [ 7.607102] ? ret_from_fork_asm+0x1a/0x30 + [ 7.607105] __perf_event_overflow+0x154/0x570 + [ 7.607108] perf_bp_event+0xb4/0xc0 + [ 7.607112] ? look_up_lock_class+0x59/0x150 + [ 7.607115] hw_breakpoint_exceptions_notify+0xf7/0x110 + [ 7.607117] notifier_call_chain+0x44/0x110 + [ 7.607119] atomic_notifier_call_chain+0x5f/0x110 + [ 7.607121] notify_die+0x4c/0xb0 + [ 7.607123] exc_debug_kernel+0xaf/0x170 + [ 7.607126] asm_exc_debug+0x1e/0x40 + [ 7.607127] RIP: 0010:test_mthread_corrupting+0x48/0xd0 + [ 7.607129] Code: c7 80 0a 24 83 e8 48 f1 f1 00 48 85 c0 74 dd eb 30 b= b 00 00 00 00 eb 59 48 63 c2 48 c1 e0 03 48 03 03 be cd ab cd ab 48 89 30 <= 83> c2 01 b8 20 00 00 00 29 c8 39 d0 7f e0 48 8d 7b 10 e8 d1 86 d4 + [ 7.607130] RSP: 0018:ffffc90000acfee0 EFLAGS: 00000286 + [ 7.607132] RAX: ffffc90000a13de8 RBX: ffff888102d57580 RCX: 000000000= 0000008 + [ 7.607132] RDX: 0000000000000008 RSI: 00000000abcdabcd RDI: ffffc9000= 0acfe00 + [ 7.607133] RBP: ffff8881085bc800 R08: 0000000000000001 R09: 000000000= 0000000 + [ 7.607133] R10: 0000000000000001 R11: 0000000000000000 R12: ffff88810= 5398000 + [ 7.607134] R13: ffff8881085bc800 R14: ffffffff815cb660 R15: 000000000= 0000000 + [ 7.607134] ? __pfx_test_mthread_corrupting+0x10/0x10 + [ 7.607137] + [ 7.607138] + [ 7.607138] kthread+0x10d/0x210 + [ 7.607140] ? __pfx_kthread+0x10/0x10 + [ 7.607141] ret_from_fork+0x187/0x1e0 + [ 7.607143] ? __pfx_kthread+0x10/0x10 + [ 7.607144] ret_from_fork_asm+0x1a/0x30 + [ 7.607147] + [ 7.607147] kstackwatch: =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D KStackWatch End =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D + [ 7.807082] kstackwatch_test: victim[0][11]: unhappy buf[8]=3D0xabcdab= cd + +The line ``RIP: 0010:test_mthread_corrupting+0x48/0xd0`` shows the exact +location where the corruption occurred. Now that the ``corrupting()`` func= tion has +been identified, it is straightforward to trace back to ``buggy()`` and fi= x the bug. + + +More usage examples and corruption scenarios are provided in +``kstackwatch_test.sh`` and ``mm/kstackwatch/test.c``. + +Limitations +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +* Limited by available hardware breakpoints +* Only one function can be watched at a time +* Canary search limited to 128 * sizeof(ulong) from the current stack + pointer. This is sufficient for most cases, but has three limitations: + + - If the stack frame is larger, the search may fail. + - If the function does not have a canary, the search may fail. + - If stack memory occasionally contains the same value as the canary, + it may be incorrectly matched. + + In these cases, the user can provide the canary location using + ``sp_offset``, or treat any memory in the function prologue + as the canary. --=20 2.43.0 From nobody Thu Oct 2 01:01:41 2025 Received: from mail-pg1-f181.google.com (mail-pg1-f181.google.com [209.85.215.181]) (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 D9BC3270553 for ; Tue, 30 Sep 2025 02:46:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759200372; cv=none; b=sgdCCRIjhAMSs6CF/p/LFDVyuF0wn110uQEv3WvfG3VANRN3x2P6zrU2SkoPg6/Hj2Jql51Q0+w2uDR2W9z22ixFSyqzjJHUBrCmdxAX5fzsQUb0h5UQhVsF/bqM1WKQjjnGI0MLucCgv3298hDaVBw3XThRdmAQuPWmIt8N+SM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759200372; c=relaxed/simple; bh=1x1tZkclSlUAFkeAbCTbg9ur9vKYhrQAjAn0c+iWPHU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=hvHO6j9Ubu6fLCvhDULQMONFkLsMJqe3IK7c4giUz1iyJ8G4qe/WNQAsg80p1TXZoLujf9Pbecou/iO5FCBHvbq5GG69u+0fA6vSx9pzsgLo/EG+2pYDIBT9vm7uQTH6CiaNdQbjYkdQgIdO5P/w/UWtr2W8TVaoJ/AgQ1hGpdE= 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=GD+28C8I; arc=none smtp.client-ip=209.85.215.181 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="GD+28C8I" Received: by mail-pg1-f181.google.com with SMTP id 41be03b00d2f7-b550eff972eso3586196a12.3 for ; Mon, 29 Sep 2025 19:46:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1759200370; x=1759805170; 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=6dXdR7Vr7GvNxroOAYy+aBhMqtIGh2YpUvjEzBf0MIg=; b=GD+28C8IUPvPybTav2nSS/vfj11laS+g6x4FMtRKDrg3QGJgVIb6VedaPqMxB3SpB0 3gTNvyiTrJIg6YqhoHZgmnXsd1WHyDJrUrPuAjVQLkuAHt5Ez8sZ2gbP1Q/Y0+8fkpnE w6rHB1gdgfhM5iJfg+xpCr3uT+K2D7kVhWikJum0aAbMyVnQClxJJDuIpPQUy2bEUeUb 3c/LPOFfuLI3+gzDMRGqmPn5AfOY0N9A2uDReaMBYHslN1Tp/vHVAwso7qTYFkFZd9ao 8fQKAYcL+5FuME8Ha8G1FwAgZ3TeTKWIbMg6nT8+BZGTJmos1M/W0pwoJ8rHf54otuNH xmWQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1759200370; x=1759805170; 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=6dXdR7Vr7GvNxroOAYy+aBhMqtIGh2YpUvjEzBf0MIg=; b=PHecaEJCE3fvfFpe+wMnf8L4Jnp/534oHblvGFoPDWszqGNeUuAaVHCynyEzH3QUnj ZiOlsI/jdvqQL22qtcLsy34ST2jd9zmQhDc7Iu1hGHJbIo8yCl2QMdB9WRaIRbPwfq1x oTdCvXT52RG0UNiR7nGo4GlQuoe3jJVCQ4dkIrcAc3R5pSOBbdj9FA1TG0GfzXbJ9TLb I5+XcoY8ZvAmQ17V9ryStY4W2LoKk+rzWarE3ApBpp41vF6li9nHcpmqT3MIZn4EivZx fB3mbo6l03RTAWHYFNoJ8exB0NP4out7kfWm6Nhy+ByFm8WRiY64mUcSHcTMD6zuhagj yY8w== X-Forwarded-Encrypted: i=1; AJvYcCVhAL6bRbNYa9rUbYziDe+0wytrWqHCzebN2dtXY+V/HYnwnJ8GG1h+z6JnoUFVA1xHdpf4Kkcjrb1ezsU=@vger.kernel.org X-Gm-Message-State: AOJu0Yw298AaIHmxRvDiR/8Q9tGA7Jut11mUQAgI9hDLIXrF93eAcj3w N0AHgyp5GomHZFUid55dwmK3EjGo/kvJR1eOMWg1irhIdlTP7eZoj2CR X-Gm-Gg: ASbGncvJCrCsD/kMmLsl/3+QAlCdvwZfH4XwILtQo/m8id4YMncywKTj7fh5c1x25Yp uqNUaE4VqVTdJlKzIRLX2DEzUZ3sySNSOq0UmMl3Ihbvu9ZGH6jYOCMtxEBKj5vBBnXpAYDX6qV sP0BnBhRAR06WqNNjf0v0URIBmYYU1mqNakrwIvWkgepBYxYX9NZjy7zKdUb7QLpMpfTjM1539m CFIJ0PM8rvSLvOyZWfuGAOMYclQJyC8vkj2FnJ5QJ8r8HA023FRvlTRFQDBeex9e1yR4S9IOQIh CTE53EgZ7IOAjDGa29j5TEHDnE+rkGQgWqn+c0GgNVEIied9qx9Jl3Qsd/rC3DLYQ3iiccoGVxt npcT+DgonMTp/xSu12UF7ItsinFh0musSy/xLXGOFOayCnoXTWzLXunuJtkaXK6MTwg== X-Google-Smtp-Source: AGHT+IEoEe43JjNKdWndUwta+OzzU/8noer3nQDRA4tPEoZN9FB7in6q7dddTrTKlJfmrNdEMUXFZw== X-Received: by 2002:a17:902:f9c6:b0:275:2aac:fef8 with SMTP id d9443c01a7336-27ed4a78d81mr138634555ad.38.1759200370200; Mon, 29 Sep 2025 19:46:10 -0700 (PDT) Received: from localhost ([45.142.167.196]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-27ed6715f0esm144277015ad.52.2025.09.29.19.46.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Sep 2025 19:46:09 -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 v6 23/23] MAINTAINERS: add entry for KStackWatch Date: Tue, 30 Sep 2025 10:43:44 +0800 Message-ID: <20250930024402.1043776-24-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250930024402.1043776-1-wangjinchao600@gmail.com> References: <20250930024402.1043776-1-wangjinchao600@gmail.com> 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" Add a maintainer entry for Kernel Stack Watch. Signed-off-by: Jinchao Wang --- MAINTAINERS | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index 520fb4e379a3..3d4811ff3631 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -13362,6 +13362,14 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/g= it/shuah/linux-kselftest.git F: Documentation/dev-tools/kselftest* F: tools/testing/selftests/ =20 +KERNEL STACK WATCH +M: Jinchao Wang +S: Maintained +F: Documentation/dev-tools/kstackwatch.rst +F: include/linux/kstackwatch_types.h +F: mm/kstackwatch/ +F: tools/kstackwatch/ + KERNEL SMB3 SERVER (KSMBD) M: Namjae Jeon M: Namjae Jeon --=20 2.43.0