From nobody Wed Dec 17 12:35:42 2025 Received: from mail-pf1-f182.google.com (mail-pf1-f182.google.com [209.85.210.182]) (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 A55962DF13F for ; Thu, 9 Oct 2025 10:57:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760007433; cv=none; b=SaXyGMBtiyOutL8usjJk2l7k6AhejUU6ApoiPktq9rtzaMi6SfLJgkOsO961gA3eDxvQehDcGgtzL7HUYJin2ifrdPvq5KA3mhfAt3DY0yPe4Tqmxpc27O6uMflpgjoIty8/l8iWG/9sBZdX7fb8T+lvn64/NelSb2xjmUyLIKM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760007433; c=relaxed/simple; bh=X7rbGcP88vwI8LXFWSyD4f0KAHbEZ/JYDGwMupozUWE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=esKp7UnIAILVRu9TJCg1ETcYBswJC88+Zxbj4LqJOGoa68tGuHkkRyqMPO9y05lnFRtlU+shIF1cK0H5O1m2UA9puUPKy2eYGROlY9X9jvaQ+UTj1hlkaNBPlU02B0gyOlYAItSMYT6uSgHFhCm8DbVaqbmpbk4WgTBYMmXnJko= 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=IQGY0ypD; arc=none smtp.client-ip=209.85.210.182 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="IQGY0ypD" Received: by mail-pf1-f182.google.com with SMTP id d2e1a72fcca58-782e93932ffso746994b3a.3 for ; Thu, 09 Oct 2025 03:57:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1760007431; x=1760612231; 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=IQGY0ypDoDmlx7f0L9hk00bKMK8i4qC4rvDjN7oaDI0RpeEe17+92UYg8T0+uqhmBn fT/jtMB0yYm335nfbUOT+bJdg4MKO/GyXtq6/cROq6vnLQM7kP/zZPbuIL64RUM7Fd9b qWVV47xvVDoksZE/6Zu0pi84EI2ZrM2Jbv6UjWYR5DvF8QdQS5E7w3qWofECEfZ6YqlR xvwx1wBC7TTiHAi/+ptDPaAajCSEPXcAp1Lts2hw+niN4qXy/vSalIADpnURnNqRhxIl lBnxelkkxXhNX5bWJGsfeVU/mg75RXgsSkixOYxptB1eCJFUbUYtPqs41x5DutH75DbE thBA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1760007431; x=1760612231; 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=TUq8bUwdYLFVT/QAYHhPfofxna9CXOIrw2x1aewMr6ucktXc+GCt6rR8O4HxOg7SZd SPe/D2gYrxuQcgEMOFbaiFA2CExZ6UEALKsSg0gIXCPsQ+iOHUbT+eUbfNPeZ8Uze/k6 Q+vW7JTbeCr2AK+yuqUnlRm7xfZjWzUz5DGLGQlft4nyWiPy2kKGgWa11WftP3mx7MOg llbAKQO2BiAGpMz9Jpo7ViAAzRQVhtbE4efQWTqhwFhJCVesxg9ySL32wSQ3qUkO2U40 2YBiUfgepGyAYDK6MzR5oxblyACzuZA/0U60pP5yYGVmZtx5WYNBo+S4qFIKKow2d/9j kj4g== X-Forwarded-Encrypted: i=1; AJvYcCU2ot+c1Jff6u6XvJgnu8NtNQCJDAx+XpJ5Z3rb+EkToQ5iI2RPERr4ZhZpwELoUl0aDDQQVEwRInmeG/I=@vger.kernel.org X-Gm-Message-State: AOJu0YxUhEEjyuG3t6udwo4bQyaLxRWwMssjrY8lp1NXWEbrrWJLQ0ix skxrGhDqBPOnzXuwPPDpPFLPEHI1N1LikLv2c0fKS/J4dkB9EeLkCUNM X-Gm-Gg: ASbGncv2F64sh3uTIH/7EtS2YvF95W6t0O6ZzwHUHg8sIzLsVRMikY7kC095besATAQ EOrz5NMdNDBjnPDNLSRlKH7wIIki8WNLhE/y4WqWfZYSJsphFDNGxJ64XkIYWRY7vE7WaZx+GM0 uw6uljo49TSa33FvblzMnUR87/IzDxRlO6I/DbclLuWIgoIYdheXdGXAyxFX6SX/varrM284Vht Gh7k1x50weaBx2rbZLSz5TiPgER71rmah2FMgVS8WGQ34l5EwUA653n6GP/E7NVyVnIT88+oofZ jNLqdq3IXFtibA+artUTwbN1lmuUH0YD1UZlHsg451Y6m8JldTFwUxs+kfiFGlHNPZovJ69xtGF g/yWF/G6CQrsDs7XrbiUAPFTYBKhA8BF50Z3NhAHb2cKSh9Ae3dLbvLUCst8t X-Google-Smtp-Source: AGHT+IHshqX+A1UBtsFjq9ppqRSHMn4X/cwBt945tWHGnCo2CaDOAkzF5ffG9Jlb6C7BXt3C9t6MkA== X-Received: by 2002:a05:6a20:2584:b0:2e5:655c:7f8f with SMTP id adf61e73a8af0-32da83e6319mr10105263637.46.1760007430823; Thu, 09 Oct 2025 03:57:10 -0700 (PDT) Received: from localhost ([45.142.165.62]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-b6326d3af86sm6576895a12.14.2025.10.09.03.57.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 09 Oct 2025 03:57:10 -0700 (PDT) From: Jinchao Wang To: Andrew Morton , Masami Hiramatsu , Peter Zijlstra , Mike Rapoport , Alexander Potapenko , Randy Dunlap , Marco Elver , Jonathan Corbet , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Juri Lelli , Vincent Guittot , Dietmar Eggemann , Steven Rostedt , Ben Segall , Mel Gorman , Valentin Schneider , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , "Liang, Kan" , David Hildenbrand , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Suren Baghdasaryan , Michal Hocko , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt , Kees Cook , Alice Ryhl , Sami Tolvanen , Miguel Ojeda , Masahiro Yamada , Rong Xu , Naveen N Rao , David Kaplan , Andrii Nakryiko , Jinjie Ruan , Nam Cao , workflows@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, linux-mm@kvack.org, llvm@lists.linux.dev, Andrey Ryabinin , Andrey Konovalov , Dmitry Vyukov , Vincenzo Frascino , kasan-dev@googlegroups.com, "David S. Miller" , Mathieu Desnoyers , linux-trace-kernel@vger.kernel.org Cc: Jinchao Wang Subject: [PATCH v7 01/23] x86/hw_breakpoint: Unify breakpoint install/uninstall Date: Thu, 9 Oct 2025 18:55:37 +0800 Message-ID: <20251009105650.168917-2-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251009105650.168917-1-wangjinchao600@gmail.com> References: <20251009105650.168917-1-wangjinchao600@gmail.com> Precedence: bulk X-Mailing-List: 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 Wed Dec 17 12:35:42 2025 Received: from mail-pg1-f179.google.com (mail-pg1-f179.google.com [209.85.215.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 A15062E03EC for ; Thu, 9 Oct 2025 10:57:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760007438; cv=none; b=CRoAtZi8nXHVg4LmjaR/D1Ak4vMYsVzLN7PDGmEje1sF7ZK8onULqWFRQqWMjMY8ZsmwmwOZQ8hSplKt5etjoSbHZQxMtPUhZFlM+gxPFqQHFhr5KCqvykvNWBj6gNjAmqPowFdv+qkrvJyeAAEHpQLZU6o7RNcemFRZbieQECg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760007438; c=relaxed/simple; bh=ZEq5LCeeZxdZtY+a+kvZMIoWs2Mzj+sOmq7f1LtT1gE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=qL4smqxRQZX64vHgG8+2AsH1xoY8NukI2H5V5hr6rSJ/6uqrPgsgnDBigVnH42KEHXKTksDAYV1bIJQRJsTlaRAFwaGtEfRq6i7aIS+u2ekaHYYzYWbONJlv8WubBTfkeOBGM8s/N7WpFlHfyzMFaHkmdZ2q6616WdUnpIPC1FU= 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=b4Pp6a8s; arc=none smtp.client-ip=209.85.215.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="b4Pp6a8s" Received: by mail-pg1-f179.google.com with SMTP id 41be03b00d2f7-b49c1c130c9so496117a12.0 for ; Thu, 09 Oct 2025 03:57:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1760007435; x=1760612235; 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=b4Pp6a8sJa2n2qbeytpIz5f3NA41jueaqkOCK4dO/3SkRa/mkKIrszTCewtb9m1VLb nQ1TaaSOh9Ur23oJyv8NPwu2GvohB63qYmrD/tBwJDqKPNTURSvtPigdYglPHpchnuXR ggVIquQ78qxY6UziF6il6ugvescs6JyhxQFGS+xktMD1GSOksGVSpNntyv8YLNfgdT0h 7idHSXMxt+oTelQbZbnOGwt5BH4Qdn+PDksw1YDErDcZlJiuIUbuM7hNRU7L/QkmTovZ ZnV38Aiatc12psZ0egrAHK54zUtPOfExPWXeKE7rZnuoWpWFp3kZXXEdD69UhOY1C5Ic 9BCA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1760007435; x=1760612235; 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=gPUzBIX+nfAs+YAbeP7Q7FVvIzV2Rzymvw1ohwGEL6rXrwz+zl0z7G76tqjc7LlEQm zBlqEHGmeK3Vv+SKeh31cgRCWjMdUpYUCJ4djuGQJojtlmT28F0pRVsGv/KSYnPv9ZGj JjIhE+KCcHPUU56q0xlLd3wbACb/I4Ssw8AlomdHZOH2gn3a6EDsJjCD1Y07pMlE6/4h kV5S3bejyOHM/f9c/3K1etYqgiehx5NYJl+GHlfSlEmGl+ZW1PA3qNtCqPzV5p+Ab3tA gfx8Q+wUyHS3QRQu7yCf3IRss74qXDY7DfOajmZ9INk1v6ISyeZu/e+henBC0SfSlVfl HJXA== X-Forwarded-Encrypted: i=1; AJvYcCWSLx3dQBBlJE1LStuKdqzuA1jN4slSkeIFUxmSebz+xL1TfOhlzsYbSxiQlnibxWkc+l4jKmzwfRlEHNg=@vger.kernel.org X-Gm-Message-State: AOJu0YzE3/ckGz0hGkw42ayMoocoxGhxJALqMN/NxMgE6m5rMoNyWdtH 82LA8+BpMwYzTiWBUFTIbL28Oo2ONP1kQRtGTjWdFtDoaMOp3TSR/xc1 X-Gm-Gg: ASbGnctH/zRiTTriYQxGlaMHdvefYpuKmlzhZgWlb3lBJn/I9fJZbDmc7CPQrjxgxSF 5+9H1tuk5Fi+q7hI+fCLF8GXb9gchGZ6T/TkEDX3290OZ/nKY7380Pwq3EpWR9k71xZrAkYxU4O S3EXz1XeHa9LLJdQpfk2y0XgKTyP8tojyMP95Nj/kHgehBqne1QkN6fnLYP9AcV7Ih1/kcBTqym nMc4ZrcJTNErwl+o957ekHq24DpT4Tp+huxSQSXJ6Z/MiXXhHvVzu1xkYFghEOOQAp71S7tY+qh 8RwWQ000Y7edlKNMMtjlhxYnm5bLfNB/2Z98SKmkmJy1akG5PmUteUiifC3+7rbD1JgmhG7QcO+ 7wGoI1jtov8rJUMsQTUPIL/Z/RQy0XlcTg+jD6yLJlW22GcZBiHrfXqgqToYA X-Google-Smtp-Source: AGHT+IEE3niJRONXV0Bm+xhadUZIixrOrMgOG5awbVzvEtTxP46vMAiWCgHmPSj8i4UN21ZLnxO2Nw== X-Received: by 2002:a17:903:2c06:b0:27e:dc53:d239 with SMTP id d9443c01a7336-290272b547bmr83465905ad.35.1760007434817; Thu, 09 Oct 2025 03:57:14 -0700 (PDT) Received: from localhost ([45.142.165.62]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-29034de9febsm25266445ad.7.2025.10.09.03.57.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 09 Oct 2025 03:57:14 -0700 (PDT) From: Jinchao Wang To: Andrew Morton , Masami Hiramatsu , Peter Zijlstra , Mike Rapoport , Alexander Potapenko , Randy Dunlap , Marco Elver , Jonathan Corbet , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Juri Lelli , Vincent Guittot , Dietmar Eggemann , Steven Rostedt , Ben Segall , Mel Gorman , Valentin Schneider , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , "Liang, Kan" , David Hildenbrand , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Suren Baghdasaryan , Michal Hocko , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt , Kees Cook , Alice Ryhl , Sami Tolvanen , Miguel Ojeda , Masahiro Yamada , Rong Xu , Naveen N Rao , David Kaplan , Andrii Nakryiko , Jinjie Ruan , Nam Cao , workflows@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, linux-mm@kvack.org, llvm@lists.linux.dev, Andrey Ryabinin , Andrey Konovalov , Dmitry Vyukov , Vincenzo Frascino , kasan-dev@googlegroups.com, "David S. Miller" , Mathieu Desnoyers , linux-trace-kernel@vger.kernel.org Cc: Jinchao Wang Subject: [PATCH v7 02/23] x86/hw_breakpoint: Add arch_reinstall_hw_breakpoint Date: Thu, 9 Oct 2025 18:55:38 +0800 Message-ID: <20251009105650.168917-3-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251009105650.168917-1-wangjinchao600@gmail.com> References: <20251009105650.168917-1-wangjinchao600@gmail.com> Precedence: bulk X-Mailing-List: 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 Wed Dec 17 12:35:42 2025 Received: from mail-pj1-f44.google.com (mail-pj1-f44.google.com [209.85.216.44]) (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 150912DF153 for ; Thu, 9 Oct 2025 10:57:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760007441; cv=none; b=L7M2W0lCzsj0gSmFWtEsQ4SKPggV2RYxL2US1pAbYKEWXJMx7KFe1BL6jgEtleYbK/wMfbdDIxLSVsqX99f7cqDwCaMPo5V0uXyx09NVhHAyV6t7FgEV1r3IME71t+0WWyOdkI3lOLdJ6R1fz9oy0/zoH2gQbyyMI/JJlpBoTPg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760007441; c=relaxed/simple; bh=nX8M+4wLqDNsj44hk02fNEaF/gPIR5p8f+vD+YBgTKo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=TGs6Romd85K/B5WWhy5ub+57Nnxqmt1orvjtmSibf4kQAefxT/shjA1tDUNBs/c96Z4S1HUYVbpA7FHuTGbbqDBNoEVmiLXqBM7+r5pwVwkE1TuJDQWR70jKEjv7fXWgruMp9R0Uv+X0GCa9UvydWVYm5NYmE+TBYHgp0DlKELE= 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=S0aar/KY; arc=none smtp.client-ip=209.85.216.44 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="S0aar/KY" Received: by mail-pj1-f44.google.com with SMTP id 98e67ed59e1d1-33226dc4fc9so791502a91.1 for ; Thu, 09 Oct 2025 03:57:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1760007439; x=1760612239; 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=VjBqC5OmraL0dv+F2ewe7IKGLAdUyg9AVVWKAy3m9Vc=; b=S0aar/KYRoKLFek7zhZ83xVSoBqtfMdEu6sFznYU2RZiap+v6i85AXy/FKDIGZXGtY 9Wl11MoPeTccbF87ecu6YUoQzbhWN27sgy0pnR2jDxZSV9MUx4vIKEQK+7QaWvjuFwgm xRExP38vZiLn+Qlo+WBLVMPrdJ2CZ7d0NSfBLkuPcibOcidTevsmobgkxX6FCqgq0Alk /9tqyBcE6r8cFzEbLcId1nB67cWsLWdnkLBHvywqnoaCw2QqQxtCbCdm+WmxBuvrrhMc rvBJoASjdZJ27VDP+Db0pkREJWokNGoX+QJ8ACUF8lJuHPLKodZgrtvlJQRMCFgSXQlQ FCyQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1760007439; x=1760612239; 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=VjBqC5OmraL0dv+F2ewe7IKGLAdUyg9AVVWKAy3m9Vc=; b=askDIAeXlLO8cE3ZEP31iyzZoXyXDsmzPnlQLJ3usjMj/y5n0WR0R4clgWp4YV2O0b jxhwCbYSJIjE9A0YIraoT16HhgG1bAQXZ2YsXQVKqtdRNXQEwcHbL8U3cKDX/zOganpA 4qEyVIw2Ll/cl76ACEnyPBn+otIGGUFA3HlA3EwX4l3KmIgM6NnfuwXCn5vU+By1sS9q E3geBY+uGYQ+tZThMEJr9n7WEwK2ab2m8G4egxagRGnXkuotO1ROltpTrKSgpz8yeuKG SczJ5tMJtkWSXD0b/2fKc+gDiUBbHvUui3615syBqy13Zo8wj4eUcyjdlvux3jTma4ah jc5Q== X-Forwarded-Encrypted: i=1; AJvYcCVRy7d+9UJ74Xt1lAHvCh97PZ6mpZx7oGsM+acw4nE9IZNvCOcQzTQ1Jk+93XcbV3c6dlX1GROX1DLG7M4=@vger.kernel.org X-Gm-Message-State: AOJu0YxTKIpVE2TCiH8iIytFjEzb3Xyf3s7YwQ6+eBTG48E4a4SabMEN auwLa5uiRYXnGUejeg/ZJeV5IhBbwCHvuynzgzpxiMwG2f5vrqUAenjA X-Gm-Gg: ASbGncvJQr7Y36CkVGPmftHkvSMyn0bRMkiUXU/N77SauGmn2gSvTEqDtxDgXGperH3 ol81ubHKYzq5vw1K7yY12s4X4kEZgrh847km02Q8W5yH/LjopuBp731b952rr+aA6j2JrSyxFZz wNM06cxCkHdUYYetOxGeGrH+N0ee92aSEHIX4HeHuLsS/K9hI+SBLtV0bEpEJjaTaCJ7VE9wBxU szjDmH8FXOENwrDpDPj/I34omxWsBuQlFGqBElmUqRLKh1+jvqMNRIwN5044SVHfqTXN+BfOjB2 7th35CNU22HS0M1/NSBbcQIEJGRsJ0azDYw0kmS+T7wbT3Pc/nsRQ/oktExPw1enS7F0lPs1uDL b69TZkPSSER+X7/xj8/vNy9Fo/c59260b2iwc9iErYVpECS1qZVK+hEwtQVqO X-Google-Smtp-Source: AGHT+IEogDfWqn0ZNEJ5cmEpJkuR1sQjiPvyx+m6nnseZ691SX5q+dGPfB0lT/XnvNq5vU0yxLx4cw== X-Received: by 2002:a17:90b:1e4b:b0:330:72fb:ac13 with SMTP id 98e67ed59e1d1-33b51125511mr8955062a91.5.1760007438929; Thu, 09 Oct 2025 03:57:18 -0700 (PDT) Received: from localhost ([45.142.165.62]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-b62dd50c879sm17747604a12.17.2025.10.09.03.57.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 09 Oct 2025 03:57:18 -0700 (PDT) From: Jinchao Wang To: Andrew Morton , Masami Hiramatsu , Peter Zijlstra , Mike Rapoport , Alexander Potapenko , Randy Dunlap , Marco Elver , Jonathan Corbet , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Juri Lelli , Vincent Guittot , Dietmar Eggemann , Steven Rostedt , Ben Segall , Mel Gorman , Valentin Schneider , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , "Liang, Kan" , David Hildenbrand , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Suren Baghdasaryan , Michal Hocko , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt , Kees Cook , Alice Ryhl , Sami Tolvanen , Miguel Ojeda , Masahiro Yamada , Rong Xu , Naveen N Rao , David Kaplan , Andrii Nakryiko , Jinjie Ruan , Nam Cao , workflows@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, linux-mm@kvack.org, llvm@lists.linux.dev, Andrey Ryabinin , Andrey Konovalov , Dmitry Vyukov , Vincenzo Frascino , kasan-dev@googlegroups.com, "David S. Miller" , Mathieu Desnoyers , linux-trace-kernel@vger.kernel.org Cc: Jinchao Wang Subject: [PATCH v7 03/23] HWBP: Add modify_wide_hw_breakpoint_local() API Date: Thu, 9 Oct 2025 18:55:39 +0800 Message-ID: <20251009105650.168917-4-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251009105650.168917-1-wangjinchao600@gmail.com> References: <20251009105650.168917-1-wangjinchao600@gmail.com> Precedence: bulk X-Mailing-List: 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 ebe08b9186ad..bb4e4907c95c 100644 --- a/arch/Kconfig +++ b/arch/Kconfig @@ -456,6 +456,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 9d034a987c6e..ef5b31158271 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -245,6 +245,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 Wed Dec 17 12:35:43 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 EEB612E0B64 for ; Thu, 9 Oct 2025 10:57:23 +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=1760007445; cv=none; b=dYhUW0iAxZgD6TvgrnDacLEe9McMuZ6322PZ0qInYsmnXMNOxWsPOhTmEqtMVecpCGTPQ6EMhDC32BJtHfChuGKjIlV+M/R8iREFzmZD9BdW8PvZ8YxGtmKo81racdED0vTo1ecT266XvyaZn/98Q/G5J9XMG+1Nacx0LdDORRI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760007445; c=relaxed/simple; bh=Do3nnjeUWGWoTOUsDG3S1B+MUUsKTfHEQU/uiqiZ99Q=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=UoaFwKaUP1fFV245y6AaP9UdjYFPE/pVqu3HO8MLUtECKLLmdOE80qHfDWtwYNGpOjnVwxt8HYJ+Vna4mAWhKhX1s+IIGof4owGk0PSb5wq1y/+yTue6AcO5NQA4DG5xqzyEG6OaNPZMRe+ylNVKJ8LXWY92GNix10zVIMlViQw= 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=K+xF2JDZ; 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="K+xF2JDZ" Received: by mail-pg1-f177.google.com with SMTP id 41be03b00d2f7-b609a32a9b6so486288a12.2 for ; Thu, 09 Oct 2025 03:57:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1760007443; x=1760612243; 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=GIQpLOg8aMQquhlHBEOSk3mXNexjDr9DRSMTRRGj0hA=; b=K+xF2JDZqmN029K8yvAViYFeaZp78RAJNvwyWVErHepIxGIU/8oNZMYPgpQ8Dlb/h2 ujIAEl+0IdhqTB2LsAzP4PNKrhV/Fl2by8k+2O2+bxOQTw3+yWIeEpYBnxrGSCq6pv07 xa98GJHD85WGnob1tltKlu83Hm6sqi6uHrQzjs1SLkvEKwD3uHjW6MEHtSqQ/2x9W1Iy 8DjoGO65dQLRuyE+P1ARfIIUvp7JF9hJCFVYF1sP2oEzdBxyaTnUYslX9oU6bWn5ANeX RheP+AF7ss2kuTKTuqc/KlHJBboFmgTkeCaCDmNoaR2anQGZZB7pnyh+uwFMc+eMwX2q LXuA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1760007443; x=1760612243; 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=GIQpLOg8aMQquhlHBEOSk3mXNexjDr9DRSMTRRGj0hA=; b=Ki9Q1GpoIh756l5y3lnhguM/x64IbILficYHZE/ysRljhjcCZWNmkreWWiqNJaVyms txART9jsv6vVZV1MBCXlLzpTPvICQBrszdzmpFpgrXxrAmyffXiwnxgn5JBEXBd4qMGd xQ5Kep/iEbqg1nikTKHa56Fftg7sxv4AzPQzZ6gNOrsAWzptQgk6JihkLju5+UQ5RMw7 MPhe5VuGptM9Iimwj6oCFhfaYCBQCDHE7WE8yle+C335Eu4itg5QRx2x530QiSdTmDaR rLuFGUQu5eshKpeeAMX9zXh1pp7N8g1B7nvaWqFG/XJ1XYenjySR8Y+0aM04dSpyQR3+ 2Pkw== X-Forwarded-Encrypted: i=1; AJvYcCVnZtUQFY67slvaNX6hOTjHpqEU9bBemV8yknPwldYyV76vWOT4It2VM+18ahjBtaA5pmymueI/+5QCSig=@vger.kernel.org X-Gm-Message-State: AOJu0YwHrovjMtx6Zeg3pAwwocZDBzsX/SGW1IZWhCOhyNePkz99nJFA 7HDDASoDndvZQ98gENEqa9k5l02ByUC5vcvcw+aKTPfdZyfV6GnFVgDi X-Gm-Gg: ASbGnct596o9Gc5+2OhWF3ZgvU3CtuWND51uIuEuO53gG442+PlivkFwOxK5QQERxM6 JZUSFyyrJSv2FsIA99IeZJxjVUfYXWy52kqhO1tYVccvdsXw6Dd09SPJbz6OphfuW3zRyVkLU0k txrBHxcdmedmimphBwqPinjPzYGiVF4vf0IcaoUmHGeCCYbr2ALeBo53R0Z0X/Vdo9Rtws238dJ 9rClI5S7hkwwM3dbhcpq5yRa8c/pEmCt4N2dU3f6A/kE3z0j+5Cu2WdveOxrH3LZTZvqcfui5Cm Ju2y/1pXwiNaUt8b5qFGL99wC0tf3PwChcNDTbEhY4xViNcFPaIGTCnBmLha/+A6n+s1NYZM//0 fTj5ushZR7zLx5384IiBQVq3JRLlHe8q8+pzL3jPtUYI0/fTb6BmWcsVClmKn X-Google-Smtp-Source: AGHT+IHPDBs2nQEEtOyd+SrR9P+qllZOyEoDd+ZmfNYqYrv5SYPcJPc74F2vXkjnYFPY0AXGIsqkQg== X-Received: by 2002:a17:903:9cb:b0:267:c984:8d9f with SMTP id d9443c01a7336-29027266982mr95235515ad.24.1760007443143; Thu, 09 Oct 2025 03:57:23 -0700 (PDT) Received: from localhost ([45.142.165.62]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-33b511135a3sm6722720a91.11.2025.10.09.03.57.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 09 Oct 2025 03:57:22 -0700 (PDT) From: Jinchao Wang To: Andrew Morton , Masami Hiramatsu , Peter Zijlstra , Mike Rapoport , Alexander Potapenko , Randy Dunlap , Marco Elver , Jonathan Corbet , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Juri Lelli , Vincent Guittot , Dietmar Eggemann , Steven Rostedt , Ben Segall , Mel Gorman , Valentin Schneider , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , "Liang, Kan" , David Hildenbrand , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Suren Baghdasaryan , Michal Hocko , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt , Kees Cook , Alice Ryhl , Sami Tolvanen , Miguel Ojeda , Masahiro Yamada , Rong Xu , Naveen N Rao , David Kaplan , Andrii Nakryiko , Jinjie Ruan , Nam Cao , workflows@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, linux-mm@kvack.org, llvm@lists.linux.dev, Andrey Ryabinin , Andrey Konovalov , Dmitry Vyukov , Vincenzo Frascino , kasan-dev@googlegroups.com, "David S. Miller" , Mathieu Desnoyers , linux-trace-kernel@vger.kernel.org Cc: Jinchao Wang Subject: [PATCH v7 04/23] mm/ksw: add build system support Date: Thu, 9 Oct 2025 18:55:40 +0800 Message-ID: <20251009105650.168917-5-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251009105650.168917-1-wangjinchao600@gmail.com> References: <20251009105650.168917-1-wangjinchao600@gmail.com> Precedence: bulk X-Mailing-List: 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 21abb3353550..4d45fb69116c 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 Wed Dec 17 12:35:43 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 6AF862DFF12 for ; Thu, 9 Oct 2025 10:57:28 +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=1760007450; cv=none; b=cFrAqCAr0sT5Dph9IlQazI6yGM2D1kbYfG9O7RSWu9/S0LulEs0bddF08qb4JU0cTsjr19o5Jv5zcqJxmBFq6jPfx9qz6xLOGT5sU4m08eT2LMfjokVg46NgYCsy8OYK0+tBvENVE/o5jT8HEveiNaFrAK/T32R0KDjGjSIA3ng= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760007450; c=relaxed/simple; bh=Feu6QMw0Ju5Y4dTxQ53cERWbV/8rWQzq92gPB2aNeXU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=d3BTzMNFOcZ46txS/A+waeJlYzoHxW97zyrc/DXI03Hc1Wfn1SUEN7ctTA3+93BXfkt+/ubhUideealqm/ncX5Ut8PcRJDPQ02KBW75Q2rhSUINbdVR0IIyjE1ZSQ09EYhITZkXKPyA6uZN6a5uCKKy0KmeuyAV2GvMUOsFCU84= 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=G56hNKhT; 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="G56hNKhT" Received: by mail-pf1-f174.google.com with SMTP id d2e1a72fcca58-7835321bc98so825924b3a.2 for ; Thu, 09 Oct 2025 03:57:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1760007448; x=1760612248; 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=G56hNKhTVqlrLSQagJwbpIUpqBD1NQqQll4D2cdAUXqZ5kkDJPbsW7mcktPw8396HW RJv9YOwhkaVBi+ettvyVrv3AbKa5L2gnRQAPrGD2aOkW0KA5oXOJP4PxRqbds/NxH2XW d2MGIxOc8BQ/X+X/MhCJY1TMyiEt7hGS5pN7E1rNsfD3PSnapLC82ZVLdBIglhvJed5c /VIKL4FX/9HMVqcwFoRvAM/nCxQZSptGrbrFnqeo3Yyl9fL9fvSvHVrFhYFRiIVJawzJ 4vurhCd7CW0bX83n8hkmR5TiEXIolC2vdXq+OvzNveOqcNlnp3sYftaf00HrZ4eC2biB ce3g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1760007448; x=1760612248; 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=aHCT2uULc/g5ZaZ9NOz110lKvDCA9a/wEKH1e5sy3S3Cx7pPAImIUs7hPhGfPy5Kgs 0LrzTxI9X/XjqFnfxg6R4w8vTYxzQp3WQcVm/n9s2Pc2eWa6cBNqN4qiiYKfuTsZ9eAf 6dQozIWqan1dUIF2vcTEnbPk/Yxfm/CSoG+gQ6uLESkjVIEbUpnF0rFxgpvpJscMqkX6 3XW69w+ITIBpxIvfVos+S8HLIA5paMiokyDGskzedhBXhsR7eyh+8zRAm4G4QYXWQQbA 2f1czW+ObpTxGZJqkDRaqDK0JgWUVdnFHHRTaQc2FoybSXBKeTupEGzR0BL3eMo8xkdG Mr4g== X-Forwarded-Encrypted: i=1; AJvYcCUvAOUdtFjda5bEsi52UbD02EGSqB8hHDKyV/6JxYzZwAAclWES4+LpsiZ3LBcsqumlRF8wr+BM/8JA09U=@vger.kernel.org X-Gm-Message-State: AOJu0YwhSBYkgCoradzq4nXNT+U0MKjpGYh4WW4w98Hbk69jaxe3lZo1 N0/rG6cYUyqHRhAPpbKrgw8+ubZicQOJS1Y6bpdOZKGN0jOq1SwwHpmZ X-Gm-Gg: ASbGncuR4MpdZcyERHvhKy+TjTi8SyUM1Lmz2oPZXqO5QhlBJffrpGxFiQ5YyaalgzC LJsvh82KyO316M7IVWsQ06FwxGV9Zj6jeXfwu3c52LW7AF7+vgJc9BqeWLYtwnf2GUZUj0XrVBh PGm6TzHJ/M6dPHVRXR9g9okTmGXLzjqGsZb4FwmyXnwEeWJlYVjGanXZX39D+SABeEWNkVcTo3w Us9qIB67QyjuREam00J1IF8bMwLuJOmnuklTeykxRQGwYkH/qfj91sWsFDDDkzbK1sUG8WN/h9w NZ496UySCdaNjalWEHOFHcJVu20/dtIR5QZzENnpAFdBJYEFp5kkFFRN1Lg90mdIpopF8hL01Iu H10PAKUUS+XwVkdMluZxamHy59wSxwg5lVKEhxm/d//DWcu4CifDBMljpc2g3 X-Google-Smtp-Source: AGHT+IGWNtwgxrnJqlblecBPueROlKrcqfaFV5OES8QM1cCcFtVSEQ+YPcggBPgem+pzIyfM0P8xmg== X-Received: by 2002:a05:6300:40d:b0:32d:b925:74ea with SMTP id adf61e73a8af0-32db9258839mr3446528637.11.1760007447507; Thu, 09 Oct 2025 03:57:27 -0700 (PDT) Received: from localhost ([45.142.165.62]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-b61ac27c74esm18963329a12.33.2025.10.09.03.57.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 09 Oct 2025 03:57:27 -0700 (PDT) From: Jinchao Wang To: Andrew Morton , Masami Hiramatsu , Peter Zijlstra , Mike Rapoport , Alexander Potapenko , Randy Dunlap , Marco Elver , Jonathan Corbet , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Juri Lelli , Vincent Guittot , Dietmar Eggemann , Steven Rostedt , Ben Segall , Mel Gorman , Valentin Schneider , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , "Liang, Kan" , David Hildenbrand , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Suren Baghdasaryan , Michal Hocko , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt , Kees Cook , Alice Ryhl , Sami Tolvanen , Miguel Ojeda , Masahiro Yamada , Rong Xu , Naveen N Rao , David Kaplan , Andrii Nakryiko , Jinjie Ruan , Nam Cao , workflows@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, linux-mm@kvack.org, llvm@lists.linux.dev, Andrey Ryabinin , Andrey Konovalov , Dmitry Vyukov , Vincenzo Frascino , kasan-dev@googlegroups.com, "David S. Miller" , Mathieu Desnoyers , linux-trace-kernel@vger.kernel.org Cc: Jinchao Wang Subject: [PATCH v7 05/23] mm/ksw: add ksw_config struct and parser Date: Thu, 9 Oct 2025 18:55:41 +0800 Message-ID: <20251009105650.168917-6-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251009105650.168917-1-wangjinchao600@gmail.com> References: <20251009105650.168917-1-wangjinchao600@gmail.com> Precedence: bulk X-Mailing-List: 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 Wed Dec 17 12:35:43 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 E796A2E2EF5 for ; Thu, 9 Oct 2025 10:57:31 +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=1760007454; cv=none; b=hghamrbotOqtlOIrylne2uDmepN/hm2iraLz0QuZxs8GtsAIQZA7mylmkCB4iO2TkQP4ALfbNAfZmmfw5RXFW6Oh8P+xamiKS4B9FASokyQgILPxEYvbjF9jh73SNVPFdnUJxVrC9SuH9DPGbN/z3LCt6WqRdxu5KjqZ9f3eVPM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760007454; c=relaxed/simple; bh=NKGG2Deka0iYHCcjeICKwSp0xNn5UzCtr+YC+OdIklo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=mprucSqOkTsjYfWOuyfs6M+LArAW62/mnoZVhgFBSU0gZKZshPS1xUvgm/4HR3I5hUFzgCx2A3l67rZF5ja/aPjui6MBAxXemdPlnaAmTnvCqxHwC/otG4iSm91Ko8c+Z+hfDW4rSlajCAcmnJ3Hw4slGOlDjkeYJ6GsDo9H4jY= 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=LXHTNKgo; 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="LXHTNKgo" Received: by mail-pf1-f178.google.com with SMTP id d2e1a72fcca58-77f5d497692so1021353b3a.1 for ; Thu, 09 Oct 2025 03:57:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1760007451; x=1760612251; 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=LXHTNKgosUSW+7X1A/knIEUw8nawmbiW+vMod9d6PBb9ol+VhEcyvdq0MAAj2GiQcO l/0TiNHHD5GpIWNvctZhcmOprxjWwaXM1WLZSh9bqoBp3lOunUTfXOT/tKKfMwitP8gt 4WePfccxFztdRIxFUKrYcJL27US9EXJ0sQAH/2htsQwKKXJdJ1HvLYJq29PAV7+YDniL 1PGHvl/DCwpA+J0cFIse0UO8C/T10iyfoz9VP4LYJLQi9hOS/mEi23CLQuGPbgkRJw9G s1M9xMOY3akdl7X/I0XhReV0YyOBwuORU86dqgg/RRk8QjQcrw+AejQRTeiFDarpy+XH i/sw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1760007451; x=1760612251; 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=JTdZQzl6/ZgO5fV1GirkrGSe8jWmkXgrMnBI8M7OuSBc2Z1zdbdqq3yfIgFcB9Xkfb F9tTOgd5i3iFwKWlNWbbbgDV7hzzrasaJ4MsKnewT/syoZwgZVyZqqL10yD67fJtVcWY XLT3toXjJ9fayl2IUzq2jpNGLreQf9Uus2z/sDF4Aac3xv5LLR2fPMY9Z2F7bFKVnq1v jcC8Imc1ra7LaEaYfGvZx5JPb76YkODgT7tquXpmHO4+EDUMMze2jXDZjkX6kwq25oQk IbY0bEK0xZnGjVQBWZt/eiKEVF6Qho222G2c+j+Wllqeq5qooTI0djtt1SvobA1qz9kf To6A== X-Forwarded-Encrypted: i=1; AJvYcCWzCSqT7sNHcnlYJKRIPqLGfnwlSgqDXltcG6ry1KF6w70ErItvkfB+QmJItNZF/HzxTyJr89l7woSK8io=@vger.kernel.org X-Gm-Message-State: AOJu0YzlyyzrZX3VjSL7ecVwJZxsXtddyyM1N3xViVrNdyRJf9M777px 1sVtI5j5LLOnixibKU6Pz80MmQnExPFhdMCUqLgB1dp1eK65aFe8Ej8b X-Gm-Gg: ASbGnctV17yhyEklOmKXDN+pVQy/bAsuggRgCCmK4fdRcNlyVMHleTyT4DtqnlmT1FM gOiO76PwvcIQol/uLyY5wovEJRh7UWDCWUeAfbT93VhGXKWvOPjiYLrndq/m2uBqE/E5ovl/aPs LI8I1RpEN5xIlhn5B1M1pSX/YpJk1WYp3AkB+Y5sTUyrmpAE/ijJzrG4dNsY4c0veK+314olYJu JxvKu9wlEEQmiHYjDbbIXg/e7ZV4yi2P6T1AwC8kTl9fAIGT89O3xyRxpSvrqdN8oFNqjgUOYAW e9vKU8dNjG/AYqznRU+K4sKRHCqS2zKzjWKUlsCtT0bIIktlamKzXZgXkgXHzV32Cnou8ZLCC6X s+C4LC5E4LJMZ/FT6qFEm4aHlV3PUwhRHbS6tJr42l2OWwGmMBT3J6FlsHCou X-Google-Smtp-Source: AGHT+IFHk/BtBSKimaKQm5uYl91w8zgkVCHa9z7abhTtJzmBXj1LTCWyaE902ZK//m0NEMBKQHd4Bw== X-Received: by 2002:a05:6a00:4fd0:b0:783:7de9:d3ca with SMTP id d2e1a72fcca58-79387c1a74bmr8499688b3a.31.1760007451210; Thu, 09 Oct 2025 03:57:31 -0700 (PDT) Received: from localhost ([45.142.165.62]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-794d4b3d866sm2531315b3a.11.2025.10.09.03.57.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 09 Oct 2025 03:57: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 v7 06/23] mm/ksw: add singleton debugfs interface Date: Thu, 9 Oct 2025 18:55:42 +0800 Message-ID: <20251009105650.168917-7-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251009105650.168917-1-wangjinchao600@gmail.com> References: <20251009105650.168917-1-wangjinchao600@gmail.com> Precedence: bulk X-Mailing-List: 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 Wed Dec 17 12:35:43 2025 Received: from mail-pj1-f46.google.com (mail-pj1-f46.google.com [209.85.216.46]) (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 040792E62C6 for ; Thu, 9 Oct 2025 10:57:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760007458; cv=none; b=QBlbK9GFTXYinF1iuyF11P5nrKEfXCqZ2pDKICc5R+gyluRBy+gorv46wn/NZbrHSUITjq/FzpgoqSFjkTUhy1Z91SxmoNu7MrVfETFjAgmIJYsYagvtT/EfUO57yTaGNuw/ZAtTSOrb7Z7yXwou2aHP/CXm4vu48R7fJKTYNy0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760007458; c=relaxed/simple; bh=nvDFxA5+kzzGy254IQd/07joD3bGnycuza2xxZ+JqIE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=oK5eKoQ/JpARq9oD/n//oaeUWeqzBFQY/JCZUwpaJRDANj2B29DWezHNlcANJo7Au+fquVq4FD0/SuXmozu9KRXbfSWIcOusnDN5R5nFCJaLLBOnSHIwTy+ydyy7c6L8oTdH4cnAhjfpA8umEJADdHYa49fHR/FBoOCyImHQFqw= 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=Y9ISfsas; arc=none smtp.client-ip=209.85.216.46 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="Y9ISfsas" Received: by mail-pj1-f46.google.com with SMTP id 98e67ed59e1d1-33274fcf5c1so958902a91.1 for ; Thu, 09 Oct 2025 03:57:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1760007455; x=1760612255; 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=Y9ISfsasCCtIs06k7SAorawKk7CU6wlYPqtH/S/Nsvt88EBa6xCfDMhUz4EYP8QapA g2/4KwXps2dU+ncJwK80GttoBkJTvB15Yf4d/0jWMxB5nA8Q8Y619UD7m4AK7p8tonnO D9VLgyBa2ChqdkzZ8ijsQii2RWZnZ/icCrfDg5M3KXzZGlu3oRwd+z6mCEBx+rAZwftN GUdknLnGg7Z4utFvSdAn0J6yC401cfSqC4Nb2lKdBJ5keCc6AtU9QbuV/6Fv6ChJij4E 8D1cJ9lc0cs0GUMBE2CXjt3gRBvMk71svaL04UmdccFHa0hh4H9hmGKa7X4DBB80RfUt OoFA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1760007455; x=1760612255; 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=pMTy+XJZNP1Nua6zKlWUk+CsvuDsp6RO5PTZdiP4wYN4K5OdEbra0tc7UaxbEhbQRf ZTzqy9hRNzm3h0gXS5z1oaMtyKK6wB8EOWjXn1thqn3ej8tgSS3yZEPDYUNCi7kMqqt1 Nh7G4UTbu2JT3f4lR3j65vWx/hhGUUyPM5XBSN36W1AldsvH0zDpbHVdtrEqvTywR51G p76ctJKpc8kg8ozO1D5n5WrYCJeaenCrz8C/EqZOd3KUqvD8NPiq3KAGg4xWNZM3sIzN 09psspR93BcU2fd/YVObFn9TM6TfKOzDz0jjXrGo3F2T4fDAQ3JCG8teQc08OFOEZ1+F 2PSw== X-Forwarded-Encrypted: i=1; AJvYcCW0+GwVsJkZokIPSAldd2vqJFqRF3a9CnpU/otig0dgdwlOvBSR9ineyzv+bUY8Xhz73Qs+otHkQdSHEz0=@vger.kernel.org X-Gm-Message-State: AOJu0YySmYe23BSX2oltCACLZixAx9Z/1MtUYMwRVuF4gY+j9i/LvfKc b8KYcT2d/53tpJP92+wN+4c6++8HAhHX0wx9BXaXH+rtl7FpeUY4Hiby X-Gm-Gg: ASbGncv06uY2u/jCpxSotHgUrgOp4+35HoqFwXsXEvR8Ed4zrCCOH7IBF85G9jnfSVY 6dJIuZrrSTlGXG4nDIdDXvtQz2IrFBxJHpgwIKMM9HfQoMxa52E4bFvi8XB3NlVKEJMSO1Io2rA 5Et+/un8VpUBXAoOVEmgb6hF1CuZV4oogYJjv19/TLqAQSDLO/pKUNgtG+E+KsuR2saFW3cyAFH wGkrwD48r4SjWO3SblaxQmOuCF47VqPZs1nElH8T+T89rB2B3BYrXdiDBd/UJZx5eMj6DPYh57v 5tXIbS/DI7c60HY6T/cz86Rr/HqZgckIQ5F0hA1Wfl0cBjW/77CZ+kYl3E1wwZJr/+vbcfTc17w +zmf4zseolijrq44DN92YdwhgZajcxbugLrwoVz9TayBRjPF83LOQbTzJLVSw X-Google-Smtp-Source: AGHT+IFC13odZspSVqGRoywijSg0VBbkFQPkMFOijqia9KTXZKXwmvUEM0W1W0I7XOEEhq8lnQYbLg== X-Received: by 2002:a17:90b:2249:b0:32b:cafc:e339 with SMTP id 98e67ed59e1d1-33b5139c4f4mr8493028a91.36.1760007455151; Thu, 09 Oct 2025 03:57:35 -0700 (PDT) Received: from localhost ([45.142.165.62]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-33b510fc5e6sm6727834a91.6.2025.10.09.03.57.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 09 Oct 2025 03:57: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 v7 07/23] mm/ksw: add HWBP pre-allocation Date: Thu, 9 Oct 2025 18:55:43 +0800 Message-ID: <20251009105650.168917-8-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251009105650.168917-1-wangjinchao600@gmail.com> References: <20251009105650.168917-1-wangjinchao600@gmail.com> Precedence: bulk X-Mailing-List: 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 Wed Dec 17 12:35:43 2025 Received: from mail-pf1-f170.google.com (mail-pf1-f170.google.com [209.85.210.170]) (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 3300F2E6CCC for ; Thu, 9 Oct 2025 10:57:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760007461; cv=none; b=UxJtSWObwBaH0a2srvCVK6gW3sBkfSG9cszCShdvpbgY76/PZBlgWnilZ0qmRfFIt7djSAI0S7ktyVz5QXcBo1+Qm7EEpZ3KBZiF+Yod7QMLlClXMlRj0q4P06Zu/7OOV4XS9Bh7u/6wder2UluqrLUJs7zPiJ+ZTn82kPoUJZQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760007461; c=relaxed/simple; bh=9SDUPEZSlMV40T53tfVBMh3pQptZtl+KprWlK44Wx6c=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=T0z9K4hSuPsVwhqx1f+sp24ep/c7MaH79VpulytQJrbhwgSC2JEcvzVb5ksiKl05blBLixZnHplLtN7fzfKyACC5EYtVPsd4HicYQ+O2Sv62qkE6SyHFRC5DMgoDx+SAZVu/4HuCMc83rJfA5wTDI+mzXQCS9PgAgOHfHXr8hUw= 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=U35YTGR1; arc=none smtp.client-ip=209.85.210.170 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="U35YTGR1" Received: by mail-pf1-f170.google.com with SMTP id d2e1a72fcca58-781ea2cee3fso793651b3a.0 for ; Thu, 09 Oct 2025 03:57:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1760007459; x=1760612259; 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=U35YTGR1XOw3Ox8Pl6Kjxy5ADSNVFT1SCGOzkwKooy6BBPrkchhq3AXydXskYQaRCW 5mgC0HgsqO1m+WKxJkjWjHotEhsW9znpzgI2ar7sKwyyG8nzBBEMfG/0OEoSH9hEv+Py 37mlt+O8C5R1KhfJwS2igzBWrQZu5Ls8w0e03JLTImEXg/ImzTadvfqynNMGUnRvxxlF 4Nfu0W5rjBILkUpqIdv/B5vqNVIQnMOQvpIZ1jd4MTKMXrMFn+RQMPtQiRd1EuzJcyyJ PgxIYOsfSAhOtPRIuiDu4Vv9wzfbj1c2jto3sxsMejwJDZIX0Q7v7RlvlgN79p4IdRXu yqbQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1760007459; x=1760612259; 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=KOe8SDsuI7jljxnyTKqNhHkgDflVoETkiw3j+BMvT7bL48O0/cvz/TzCa2GpZikeW1 5a6QFPagz/AL069WVI7U9B9a2glmPj7N6UsyYxYWM4rWhjV0cK587sEsqNb6UHyPCDq0 C1e5WrB/+dQpy7R+6J9uAJkBuTdSPrvI3EvoPME/8ihEljosT0cPowEbTOQ4ZsyqoOJW YUAKTXT3w0m7QV1X8eMROMJCHkfrMAFusnmewpb6pkLMrUj4Dvzxi6JHU1WLM8a+rJ8m FGQ1+fTGaULQqB2jhVX2SuzGsPjq19DqMI4a/63w4bQHlhJDqNHLx11TYKSa/aFzbpTC 6boQ== X-Forwarded-Encrypted: i=1; AJvYcCV1OprSFk70BZgfqflB0hzDFthtQgREeq6Fgblx57C2CZ8YDbaI64MQwmuVE62p2s8r4oQ0ve8k+EZQKGU=@vger.kernel.org X-Gm-Message-State: AOJu0YwmUGwVS8kmMGaHwCgW87HmN5XlsfcOvR1+L3rz/Ayo+DTtA7EB jAYm+LXdp1VaRh7pDwUTbKYLO4ei/CPGJNF1ntKN/ZifS+l9w7rLg3q2 X-Gm-Gg: ASbGncspv6gf02ZjuQ5o8QcoKB4mZ9VeAiZB0IPhHtG5jsDh23N8fAqU/gfsnuem1jL s61hxSkcLqVjfE/U9x8GNuRjCrybQnpVFSzBxz8+m+wQJgt3GR6pQVt69bj2Q90nerkxaae+ijB tA/SyauSgfhVhsWyO4WckCSjU4XeIrFEHaI9Cm0JaXtkxFGA/tI1N5VgYfSGwtRMhA1Rwx2kohO Y6J0g7GPKJthGI1R5uR/IK1PHVFcP83u2huvnfDbShbuBk/L+0ew0XnnqLfUrN27vblnXtt91ip UX8eU37kL/FP78vqSoAOG0L1braKlWUFCe8U8cryHGaHdYLn5mgK7/0nnGcGWzM7ThFrXBhE8rx Tkmajfi6oYSgH5mUk86hjvuSZoHe+ivoryUgi6pYyZiaac9cGm7wKsfd8ElZT X-Google-Smtp-Source: AGHT+IGScwOqYQkzfr1btEBby7JhcFialvxPDnR54idjLQKUQn1BKVR6wxkZwyfRnUOrnLGfKhhFqw== X-Received: by 2002:a05:6a20:4305:b0:2cc:692a:3a30 with SMTP id adf61e73a8af0-32da8154253mr8702045637.13.1760007459212; Thu, 09 Oct 2025 03:57:39 -0700 (PDT) Received: from localhost ([45.142.165.62]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-b6099f3b041sm20710766a12.24.2025.10.09.03.57.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 09 Oct 2025 03:57:38 -0700 (PDT) From: Jinchao Wang To: Andrew Morton , Masami Hiramatsu , Peter Zijlstra , Mike Rapoport , Alexander Potapenko , Randy Dunlap , Marco Elver , Jonathan Corbet , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Juri Lelli , Vincent Guittot , Dietmar Eggemann , Steven Rostedt , Ben Segall , Mel Gorman , Valentin Schneider , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , "Liang, Kan" , David Hildenbrand , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Suren Baghdasaryan , Michal Hocko , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt , Kees Cook , Alice Ryhl , Sami Tolvanen , Miguel Ojeda , Masahiro Yamada , Rong Xu , Naveen N Rao , David Kaplan , Andrii Nakryiko , Jinjie Ruan , Nam Cao , workflows@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, linux-mm@kvack.org, llvm@lists.linux.dev, Andrey Ryabinin , Andrey Konovalov , Dmitry Vyukov , Vincenzo Frascino , kasan-dev@googlegroups.com, "David S. Miller" , Mathieu Desnoyers , linux-trace-kernel@vger.kernel.org Cc: Jinchao Wang Subject: [PATCH v7 08/23] mm/ksw: Add atomic watchpoint management api Date: Thu, 9 Oct 2025 18:55:44 +0800 Message-ID: <20251009105650.168917-9-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251009105650.168917-1-wangjinchao600@gmail.com> References: <20251009105650.168917-1-wangjinchao600@gmail.com> Precedence: bulk X-Mailing-List: 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 Wed Dec 17 12:35:43 2025 Received: from mail-pj1-f50.google.com (mail-pj1-f50.google.com [209.85.216.50]) (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 282312E7637 for ; Thu, 9 Oct 2025 10:57:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760007466; cv=none; b=aTUqNODitasRTzDlC2TL9bcuLFwFAkQaQZYxCCrNgJ7/mcj1IRKE5woMt4kkHz0hoQdIwSo4F8BL0FwCELhiDrwYGs8fhWYZ0tS7EiexSmZtkmxehbuUDfaXgx9gZ6VEaNZSbulf6ZXuYUvC4I6fvtEUwwR39KK8JbIeYJ5SPgw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760007466; c=relaxed/simple; bh=0RaB9b3mDxARpzNAU+b9+OM/53UguV9OX02ut00avNs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=WBHYFfURQ9SrAH6gu5l1+PeiNsTgHXF2rPAKgfADKwrMOkH4RCYNvyaRsys9MPGsz0tfe+xrw7C65COBXzCBf4m7ZzYYi/zr/tCxosP4uYuhRGv6s6DXIhsO+7YaOmboKj68+3q5eDBowEkkgVGnCd2YCSdC3VZdR5qdEcaLaj0= 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=A/5C61gR; arc=none smtp.client-ip=209.85.216.50 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="A/5C61gR" Received: by mail-pj1-f50.google.com with SMTP id 98e67ed59e1d1-33b5a3e8ae2so508837a91.1 for ; Thu, 09 Oct 2025 03:57:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1760007463; x=1760612263; 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=A/5C61gRN5+BtVe0oAtzwEP551cuqM59naP4sL5MXsMQCW4ngR811ENWiTChuESkq9 AKKX349RReYymf1WXkgbqaDRoo9YK9Qs3AVvTQ7RTwLwv/1jMMUWfDxhByVdS0XWWyd2 Dck+cQ8kxIYa8GE3J5yQhPzuN10gaO6HMeKK1vB1zROXfjEvPqClPc0mEFusJYSvGPoL /bUvnZGxuAro6Uyfed39BMglJFBEKKbB9umLgImQGGmHpaMHIAJ9Qe9jVI2MWuk6DHh1 fAP390fwSUMADEQympYscpO13ucL5iil1xi3uWMEr+5N8bGOeNuBfP4MAFwN5v4f/RS5 0pOg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1760007463; x=1760612263; 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=ihi66fJgGzm8e7h/s/uNAzgUgdrSLGg6CFzy8lrjULwmZ/5V+OKklSqftfqbGQYgNX EwTzP+62z2ePQnyArFAt9vQqTc/xxKmz6rIJ1oQc9r8CizTsZVQrmVC+py0eOaZuHaHF p3xf5k5sNKGx5L2dMNZBGsq77K3JGKqbaFSx6Tooe+oDk+bsX2FFit/t+F2E8dnK4RAm v6RUMcU48+Ub7ajB9Cywj4mvWmuQsJ2Ai86CwkiRnHEutXVfL5lTG/CPp50S2b5UOJ+j 6biIrYi/zGi8YAu4Z9v1VEF3aCfV6or+/KGBNURbtIuUc5VgSF6izGgPWlOT4tyHNVig V+DQ== X-Forwarded-Encrypted: i=1; AJvYcCVnHjE4L4Xf8bWtl+pHICpQElB/mPG+w67cHEKy90NKPZSMXs8WpYhytj1hZpR3bps9O5ygIjR9jNLeDxw=@vger.kernel.org X-Gm-Message-State: AOJu0Yx1SCbEFiCFidJeU+y3Go8xy25sLkG8Ef2zwOipcCWZJilg8pgp zEQRPYI98c+cwReCiLfspH/o7nHHl3dReAJARgsSI89lzA1CEksEJS/+ X-Gm-Gg: ASbGnctuNoSehWeAT0LA+h4GksK60bWF8c7eqKOFFknaHtQXQWFgsDVddDywjHC9r8k b6JPnADCToVt5/bh3EjPBKkQyIfFo2Ljg1YvgzQpEiKcRZfhfhThq3eagb7IGdmF+ZG9WyEMhxv +YNMvJzAkFeKqEF0Lk87CdutGXWKUJpLUDLqzt7n2IG7KnYzefAXM6oLEWeT8wSRG3t5W0uVXuV M2C9J/JD9+sAZ7OL9Q9gCLWt+AohYUMUxQZHIUrSvPu/EKb7etDBRsTV9Sj88rq5mKGBH3d37IE EPIVQuYoXCB3T26/ME3uo96Z9jid59U4qq//oaJfjhomPPEI5QSruQljZZJjEI2hOY+Gb1dLqRe acJtcFNZ9oKFePFifY+dxO0vkfL49b/jKjXZrtyJOe5rohETDu0HqCP/8nPAT X-Google-Smtp-Source: AGHT+IGh87PYrVHyXpdGI3lpiqctQ3hOQgwGz+QU0SKFptl527HtAxTN0ZxVB5GZOA/u2hsAdulJlA== X-Received: by 2002:a17:90b:3e83:b0:32e:23c9:6f41 with SMTP id 98e67ed59e1d1-33b51676ef2mr8250254a91.5.1760007463200; Thu, 09 Oct 2025 03:57:43 -0700 (PDT) Received: from localhost ([45.142.165.62]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-33b52a4f8bfsm2196325a91.10.2025.10.09.03.57.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 09 Oct 2025 03:57:42 -0700 (PDT) From: Jinchao Wang To: Andrew Morton , Masami Hiramatsu , Peter Zijlstra , Mike Rapoport , Alexander Potapenko , Randy Dunlap , Marco Elver , Jonathan Corbet , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Juri Lelli , Vincent Guittot , Dietmar Eggemann , Steven Rostedt , Ben Segall , Mel Gorman , Valentin Schneider , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , "Liang, Kan" , David Hildenbrand , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Suren Baghdasaryan , Michal Hocko , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt , Kees Cook , Alice Ryhl , Sami Tolvanen , Miguel Ojeda , Masahiro Yamada , Rong Xu , Naveen N Rao , David Kaplan , Andrii Nakryiko , Jinjie Ruan , Nam Cao , workflows@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, linux-mm@kvack.org, llvm@lists.linux.dev, Andrey Ryabinin , Andrey Konovalov , Dmitry Vyukov , Vincenzo Frascino , kasan-dev@googlegroups.com, "David S. Miller" , Mathieu Desnoyers , linux-trace-kernel@vger.kernel.org Cc: Jinchao Wang Subject: [PATCH v7 09/23] mm/ksw: ignore false positives from exit trampolines Date: Thu, 9 Oct 2025 18:55:45 +0800 Message-ID: <20251009105650.168917-10-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251009105650.168917-1-wangjinchao600@gmail.com> References: <20251009105650.168917-1-wangjinchao600@gmail.com> Precedence: bulk X-Mailing-List: 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 Wed Dec 17 12:35:43 2025 Received: from mail-pl1-f180.google.com (mail-pl1-f180.google.com [209.85.214.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 C7F6B2E7F13 for ; Thu, 9 Oct 2025 10:57:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760007469; cv=none; b=maZKtWDoJny0u2rSyrP1pno8a1/UVufu6fg/mdNECjifr76hKvxtHzjCKaFhlLCXFmVLY3+EO47JpYql7e2ET1BtlkdtmtOcV7b7TWjqKXRXVW1aJsN64r9l/d9vXD+HuaXdlxUOwCPhIn6VEXqbOqSVFxZdHbAMn/Vu2BRIvrQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760007469; c=relaxed/simple; bh=EtuMaKP8CWfi9pjY9FcQGV9HEHi4WtiOKMPT566R1T4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Zsb8FuXDgjaUvSEWqBqheHfouv+UyAiQCYVcppg+WZat6SUb2j7qbULgDmRtR2TC52fVNsvEBA6LSPsdG/Cy72ffUUPe54RwZ+SxKB7HEKW2+Au3R1FuQ66Xb1++iotXPigw956K4Iq6ZD4MSCxpvtjFC30cE5QMoTzZySQd6hc= 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=XRI7WsQw; arc=none smtp.client-ip=209.85.214.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="XRI7WsQw" Received: by mail-pl1-f180.google.com with SMTP id d9443c01a7336-28832ad6f64so9176005ad.1 for ; Thu, 09 Oct 2025 03:57:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1760007467; x=1760612267; 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=XRI7WsQwvZLRMKH5k/2XVLyYjc1kYwTmbZQzTQs8ddME9gWi62JTPN0mJ4Wk7gzncb H36oPPlE+4GhxeIVK5rg5OyWOuAkOI0zpWmNs014z4plCAHGhaGjth1J/9DG2TAE+d6S 6QOYykAuyE24tlsPs2LNsEwEUMpiBs/KZSaR/akb+NiU0MbV38ySbdtbttfHv54v+JX6 /jBM440MshBnrVW+Rlk0KneqVWtUtWPbi8/fk6RwvI86WWBDD78jDfGzYZE8s4Eu2ZVK beZZi3L58M1MOPyDcrgQyViZfFIFoUSrKQWPOLkFARHotNXzR1lzfmB+MF7HQXsqA7ey AKcQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1760007467; x=1760612267; 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=XAZOeyJwssRX+RbPJFVDifdwPm9Pp7MqIVSITTixbcw+b/rH65WMwB463lmaKtXy8N ig+5pL6DREW8pKZbYitxrIwKNekZUFdoE/snyOHy2LJmhjzS/tYD5Qff2549YR/16jf9 9JYJmhEC0apURsrqg2VoUHLbCOWWdrSszOsJK7btDsshrx5xJpeIs01htF1RlcESgnOe ilk8qxwfEwMxUHeGkEYTZNnTr2a2NcSqP0DmcD3bMCCJ+lFlwfocbN78OJBGWC7h7aEN Q27vNdoO6g4wcuuftELGsyiMmX+qLEmKVWJkABycq1aQy3F8qI9AA4+N9FqumTi09fUV uzUA== X-Forwarded-Encrypted: i=1; AJvYcCXohJ1uDV9GwQwLb8dZ5+X97vdJP69FLeudOGOaAf4Q6opNk/hp6AMmQMgV0Yqio6RmImD2/JlTKlcK2gw=@vger.kernel.org X-Gm-Message-State: AOJu0Yy3v3Qrpz1uJSoo0VZ8umjUoD6pj3RAj4W168pdUV4bSZeWEj1u HmsYgkQSh6u+Xe9EStNwx7ICBtBpcGBXgZQyKTCC8B/i+SopW4kKCgW0 X-Gm-Gg: ASbGncvUmMylvLC7cjpcYNbzv7RBA08Yy3Hjz82DogzfkWS5hu8ey2kDMrZ4USxAGJh 8fIwrYyhE6lanVycza05cs6RDDJgRI84ZjhGvrtMxHa1v5DPI0PJnRHT1Fa3tw4+r5jopIvqIti //Fv+MnbtXijNhVrPIrfkS6+pVhDMzukmxGmrqOND/dJstLl9or3sd/19wA360Cfys/0v8iDbAm Pm9yTnqS3QPD/Sy4Qyqd8+YeeByz/UmAd+yVtSJCgQ4lgeedqYSd2Ukv88d3gsuoEIOyuT+uMt0 gWIqsLTFNT+PMqpjWwDQLYjDWMX8yNu5iKqYExZ6fwaxy2I/rL0pulC1MI/r1T7nLI6QvjcQ2oT oKLsWdMaMmXK0hiaAY8mWlOFpHmVlDVv2Z2iHnRLbXn5i3hrqy/UuUpccXvSu X-Google-Smtp-Source: AGHT+IHmVcOaWg336t/VgG0OW//aKmE7YjCOwXVIZ1hlLa92YU9803QfIvNvqjBNePbfTO+flKLHUg== X-Received: by 2002:a17:903:2342:b0:28d:1815:6382 with SMTP id d9443c01a7336-290272e3ed2mr91929215ad.46.1760007466971; Thu, 09 Oct 2025 03:57:46 -0700 (PDT) Received: from localhost ([45.142.165.62]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-33b5137dfa9sm6632975a91.15.2025.10.09.03.57.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 09 Oct 2025 03:57:46 -0700 (PDT) From: Jinchao Wang To: Andrew Morton , Masami Hiramatsu , Peter Zijlstra , Mike Rapoport , Alexander Potapenko , Randy Dunlap , Marco Elver , Jonathan Corbet , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Juri Lelli , Vincent Guittot , Dietmar Eggemann , Steven Rostedt , Ben Segall , Mel Gorman , Valentin Schneider , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , "Liang, Kan" , David Hildenbrand , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Suren Baghdasaryan , Michal Hocko , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt , Kees Cook , Alice Ryhl , Sami Tolvanen , Miguel Ojeda , Masahiro Yamada , Rong Xu , Naveen N Rao , David Kaplan , Andrii Nakryiko , Jinjie Ruan , Nam Cao , workflows@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, linux-mm@kvack.org, llvm@lists.linux.dev, Andrey Ryabinin , Andrey Konovalov , Dmitry Vyukov , Vincenzo Frascino , kasan-dev@googlegroups.com, "David S. Miller" , Mathieu Desnoyers , linux-trace-kernel@vger.kernel.org Cc: Jinchao Wang Subject: [PATCH v7 10/23] mm/ksw: support CPU hotplug Date: Thu, 9 Oct 2025 18:55:46 +0800 Message-ID: <20251009105650.168917-11-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251009105650.168917-1-wangjinchao600@gmail.com> References: <20251009105650.168917-1-wangjinchao600@gmail.com> Precedence: bulk X-Mailing-List: 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 Wed Dec 17 12:35:43 2025 Received: from mail-pj1-f45.google.com (mail-pj1-f45.google.com [209.85.216.45]) (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 ABD8C2E8B60 for ; Thu, 9 Oct 2025 10:57:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760007473; cv=none; b=t4wJzDNUlJczxrYmXyTKXO4gvMup9Gm/wLBNZMSkMLzIDGa+okRA6Yg/2bacn33sM6tEchGNqSE+sVTC3FZ7wQXqXY9B8I2ylgeQ0H/4F+iNdwD8U23pHRAQyeHygHOyT8rYPFccVXuP+gtDx3h4aDRG5D8JfQ0LvmivmpfwOzM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760007473; c=relaxed/simple; bh=zK4RWkz30MU/OH8jEOTvGZJj2/7wnecqVuCjoc5/aOM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=tSSoz9Y7widBnpuvxGA0kqTFvXnaiue4794peSLPkiKDhPjnrL0Z0Vorgy6FbZy4AKSdxlrjC+pm1fHL+aKOwmE7Hbs8zuJRg8NAB0DEILMPrGZzFii89dzNOULj4ATSf5jIzqD+kprEn/apdRXm88XUO967jI5aCWbUXTNYRCc= 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=OUQKyRWS; arc=none smtp.client-ip=209.85.216.45 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="OUQKyRWS" Received: by mail-pj1-f45.google.com with SMTP id 98e67ed59e1d1-330b0bb4507so792813a91.3 for ; Thu, 09 Oct 2025 03:57:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1760007471; x=1760612271; 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=dPor1AiTaHON3BhVq+NCy46wTls72eqNmMOTROEZDIU=; b=OUQKyRWS4NogfY8BKn70Mh5zqkNfWaMf1ej46t3EeqmhIzH77wL3IrQoFcmsSnNt8T oiJf7v6AZzNxPpoZ9mOwkWbowmLLclVGMWt+yqVfDwiTTeJ5M4GlRqfXof8NWTVMwoDm 1s3uXUTMLqyoKoCtjiocVkkszgMND+F9C38eoorWaZZuRGfJ9gR1a9B3dth8Fsx+RFo3 XOxOaROnb5dDAQZBhJzWSXPAyV9j5gThTCUjg8ajdpyL3bMf4a8daEOamlzNMBGBN7Ca HIT4pHppqIROfYf2ua2k+b6fhhBg1OwSrYmJTaP6rkgM/8Ivw1onylWTQnfrmRRNwbHe /ZeQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1760007471; x=1760612271; 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=dPor1AiTaHON3BhVq+NCy46wTls72eqNmMOTROEZDIU=; b=UC0BylRBMqU+seEEIK7F8ONulB9KH6di6NG4FMl5QHJmtDXCzI6p7zq3GC6FZ6L9J6 e/XfB2AAVPbrhZY8eFoF7OtCmANwIGDMOYbANmJn69LxA53DU7MexHb0dSeOdw13I2NG zwAJlHEXqf6auHQTkCVQPTYdG0jK/w51twDaDZxl+JUYO9toWFevE876YmxEQOqsOzYp Q5kgVqnaBVEmPV9oe0t2BRDvoqZaNWWKdO7hJIsZN4QCFM/r4Rz9hBEzXZPCvXWkvOnJ xq74g0+FS0VzEP2xmM7K/C4A1RyQxtR4nVduDmTBeJSKLgevYiGTmOLTwoDtH0JxgDdJ g8Fg== X-Forwarded-Encrypted: i=1; AJvYcCVbq6QYGeTAvBtzxGAf3EGQsQ6easPZClWmI9+n6Qn+9TqyEbqWRDJ9nRtIyVrkPfSEduMxm/SecFvPCPc=@vger.kernel.org X-Gm-Message-State: AOJu0Yzy5ChCqGDPJSYzVtDwbQ9YIV2W6rJR78jQV9KONYR7scsLfu/4 cnAd7r+IrmJO8Zp7INE7UpjtZZC+cdt1NetzaW7+CwRR2QgVkKZsNaC4 X-Gm-Gg: ASbGncttWy4AuhTglpp4lvashjKZh+TorhUVjWRIOa0ucykzq6wcFxqQjGWidxnY9CB WDND6GEmDXyHhkIhzw32NBKh6i2UpEdkXSV5dv/0hi0wu9G2TqWyhodZG45GyLNQPnDpyYG5DZY j9bDZOkeQyXjYfDX49fsY0LxTqbjZkP3w4ulUEHWeU++4dXIat9QRW3kgUMPTL5vsEzRwbJqCF8 GbxlT6yS/f7fab+cy6oz/2oiW1Vcxpr4CtNrBc0QGAv75HIE8K2HKLcJkx/nGnxAY5kYK1iGbFA /LSYaaVrgYNSusD/80Z0QkGcuMrjZq4oc/pSYMfiz7dmfEbCl4WZadFqpweX8MpG9XP5pOmtmV3 ByQlrKwrjSa/JrsyYAdjpf2chhn8zmzNV37UYE2Y5bq9h06E0SbnoX1E/L3YX X-Google-Smtp-Source: AGHT+IGfoiP7FyJn6BgVbF1cW+pirt064OXDV5hiE6L+A4G5ft0+AYVVqaDAH6C+gBiZsXo7qM0L8w== X-Received: by 2002:a17:90b:3ec1:b0:335:2823:3683 with SMTP id 98e67ed59e1d1-33b5111491amr9148774a91.9.1760007470702; Thu, 09 Oct 2025 03:57:50 -0700 (PDT) Received: from localhost ([45.142.165.62]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-33b513926fesm6702757a91.21.2025.10.09.03.57.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 09 Oct 2025 03:57: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 v7 11/23] sched: add per-task context Date: Thu, 9 Oct 2025 18:55:47 +0800 Message-ID: <20251009105650.168917-12-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251009105650.168917-1-wangjinchao600@gmail.com> References: <20251009105650.168917-1-wangjinchao600@gmail.com> Precedence: bulk X-Mailing-List: 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 cbb7340c5866..707b34f26264 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -1487,6 +1488,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 Wed Dec 17 12:35:43 2025 Received: from mail-pj1-f50.google.com (mail-pj1-f50.google.com [209.85.216.50]) (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 D9BB32E8DFC for ; Thu, 9 Oct 2025 10:57:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760007478; cv=none; b=nosFC6VpShJOL50Ng2K14QJpGvTC/C1Qdr6fvqwN+wZdoCzcBGsDcjSjNJwfAIQHuF0OtdnCZmBQYvbjPhiSGVVj1Sy+/XBuQFzTnRvaBxva48bM4wuCBmLGjZ+R5VKA7QSXMOATFIKTQbtfqCRma8Qe+8tcHlibzz8wU7/k3ig= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760007478; c=relaxed/simple; bh=fgMlahiCQseGsOMwUDeQip37398eJhQex5YpJdEa4RY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=dkS12sptJdFlymWLZgijx2d1Wp5iTnzbK5iJCPv+0s/XRZ+3pOqsmL+joa/ceGYZJ3xIf9LRntmaX4MBVa92AvlUJII8+eZupi8cwWOwmVihkWvcJAKEOOOXkB4KrENQRzPx/CHk4SpmNMSG7pKUdX8e00iQ2EhL0trQu/1hqhs= 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=bBaI82Mu; arc=none smtp.client-ip=209.85.216.50 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="bBaI82Mu" Received: by mail-pj1-f50.google.com with SMTP id 98e67ed59e1d1-32eb45ab7a0so944595a91.0 for ; Thu, 09 Oct 2025 03:57:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1760007475; x=1760612275; 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=bBaI82Mu1Gm9EbsCGujOT3z5dNCSgA/zOK/B47EgLJLBiudpscHV4WhPiWoKR5Uc1Q ipfyop5GQ1b96oKKrRZWGTGx9lDsWMhEck8YY+PZXAwmlxzv9oCv38ew7+jJST6rcwQN o2PXUHQ+ubERxmLQLpbJ7JNRg+s4jWKTmFoHU2+M8eXZUzWGODwNziKOViu53LpXw9Cm oDkvt92GQt0NFArjfTAGvaJnIwz+iaw55K0F38Szmt++SR2Iju+lY6aj8Lf9AtnhjkFS DLvqEny9j/kemdAU3K2iTaqezOZ93mTxywCRNoVPKYBYl0dC0yl8E1lLDrORsAmdo+3T y44g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1760007475; x=1760612275; 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=L70gQYlUiStdxS9Vcf1jOybUM9uCTEdcatuJu/hcr3PsZwTmVVLmlRCU8GpfGsbv1u r6TVc/xDHhGL3CcKMCc8TQoAxP4aqiMW+8u8b9dpBNbZxNMlQ5/gqpUjs3rvDKSqR93N LfRaKFMGahtQdCBBuwfuN6sxp434r3RVJWoH/RTA1ZTkefZZdsdzn8iXAVxgo29ZnFJv Gu/2X4+Dq4pZmP2cqWxFm2YYYaeiWyGF7l2xrQxQfnt7RfPahDfQyZjz1FpBy5a6k21p itVclFYMvcBaBlGYqw4e7inpgnu5/iZ0g2v2RzLkNmTtbnB3eSoB9CQHxQ0FnwS4NcEu KVbA== X-Forwarded-Encrypted: i=1; AJvYcCUNu2A9enSCijXDXEI5Hy/RH2/xSRblZYe4bkk9UoCLArL0EpkbZYcvVkPeIQ5n/dgA0MXG1Q4wjX0JAqA=@vger.kernel.org X-Gm-Message-State: AOJu0Ywbyk9swTn0A/MW1aT5OFNvI7BAexxEQYs+7ZU3lbfIqM/BzNPy yhnmehABQWBRItrAnojzrCd4rHhoScIOuvtUDsPijMcW0yXCoMJytnQ3 X-Gm-Gg: ASbGncs578zSLCPlPHnGDgZJICUCF3O+EZafsa65+YFTEv6y3oClf16g/PR37muZIsi 3l5DdZJtM2H8xll//muCXmf6iKCaLAwW0F06jZxxGNZD1h00c/83WHwh/LmVhXklOhxFIlbul5w UI2s3S5iJ2otkV8b0Lt+gJEkqVLKczQjQrrydWvHnPMcG9cjXI3JA3xdaHqHwg6DewgBnH4HRqg AIhj4qmDsDiBaH1rmKW31ib4JcEZbovJxblw+52BKCTsEjnQXh/E7MfA0fbTyL0r+woxt70va18 VsbrykeWiY/XJULSr6bhi8UztYj2Y22veehlqSxrCEYOFxPnnTeWOF/ZWeonZFZDJ33RPDOw7Xg WMeXzL52PO2shj/3s33ox5iGIpuAFrSzKNRtD7OaHv4FNKInRTkYYi7iwUlFt X-Google-Smtp-Source: AGHT+IE9NnpcMWupwlw2d16VoEQWRKCqW2Bel2NYXvT1Gf2U7ZL3QTEBs97P3B1zPpdcUzC3SQMjYA== X-Received: by 2002:a17:903:acb:b0:24b:270e:56cb with SMTP id d9443c01a7336-2902739b362mr90085425ad.27.1760007475016; Thu, 09 Oct 2025 03:57:55 -0700 (PDT) Received: from localhost ([45.142.165.62]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-29034e1cc53sm25234015ad.46.2025.10.09.03.57.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 09 Oct 2025 03:57: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 v7 12/23] mm/ksw: add entry kprobe and exit fprobe management Date: Thu, 9 Oct 2025 18:55:48 +0800 Message-ID: <20251009105650.168917-13-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251009105650.168917-1-wangjinchao600@gmail.com> References: <20251009105650.168917-1-wangjinchao600@gmail.com> Precedence: bulk X-Mailing-List: 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 Wed Dec 17 12:35:43 2025 Received: from mail-pl1-f182.google.com (mail-pl1-f182.google.com [209.85.214.182]) (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 DE49C2E9722 for ; Thu, 9 Oct 2025 10:57:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760007482; cv=none; b=rUtqpGHmFmUKoHS9X+tunzhUB/MKzWUoDy8eKn3LQvlfMRJSfDxz07pFvq7bdgwoTmNiN98x4AVPER61S/QRQRouXeiP+gvfwea8R49jW+gUNKRrvl3AOfQydqcOBV8jfqx4/IlumoUo68hdUIqpwGuucEA+5vlTTxQNZAoayzg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760007482; c=relaxed/simple; bh=Sl2YI7Td/C9YkkJpnWkOlkyn4hvpDBvdNr6f7stAoSw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Jsu3QnT/s4hKV0LEF7F6bMtwVMTE9sXNJIOfOtEC5dhDJak+4O/d9TIDkJ2D921RtfgJ2i9AUhmxS+t5M8IpaihKWZA2EsEQ69L2dITt/qrUp8GC0SX1xZbVP1iGQCfL88OxQIXmh3/6GxLifF83Bk9XIj+2OGhSPeEaCm+J9tg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=juDZE3fu; arc=none smtp.client-ip=209.85.214.182 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="juDZE3fu" Received: by mail-pl1-f182.google.com with SMTP id d9443c01a7336-27edcbcd158so9307395ad.3 for ; Thu, 09 Oct 2025 03:57:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1760007479; x=1760612279; darn=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=juDZE3fuAX+I71mGgblMjrlNwLFHW0pPbgZVNZ+JFhzjUZ9tgoqJV5JkZm5siA/pna 6r2utRoYV47eo/pRwxjWfcdI5fsB4PnUlckv4VAmbgJYgkT02zT3DjrIr573TZlXmuW1 r1KaVxjdzsEVQgz0XiQzCDBEkOSjwBCkVB6P+J1RDDIzW4tsg3nugCQi6f/BHuMmtj/Q l8g6uVKpZAye7HGXb0gAqUVAlQ6Uy7rVUAIWCDxuc7Ap0bBjLYLqBDKOk8Jk4qq4KceL 9NsAmURK0+f/CkQIMJUuoPGZqR4MSpMNQ82eQpkgt/cJbLEUt69i45WGsoJX4QLcrG9s nlAQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1760007479; x=1760612279; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=sX4DcHmKN6k6jLli4BcDyPNAsEAGb3ORwL+dRbW7euA=; b=eFyhUxx6CH4hwkdyfYbUyDXJUdgDIf83qSWzzOBCtggtay9gYclPTrCVSMM6/XajLT g2+VPC+InxjnpXGOyueaCEFbci34gD1Q18wXr/y8zrbxHq2/2hOvuyAjtl7Y9ZK+t1gL JAX/GRmmvd7sbANvlbMoQsdeF/KUXxhyjDVoV9HvTs2QpH8xCQlB2zBwboqQlKzGWdhz zuJ/YebtNIW5ts3dqbXjRaQVlP+RqLsQfaD56OwGJlNxt92RLIuJMe+65R/D+8UXRJ+u K82q2i14f0Fwf6y9JHsH5qdj2xnu4vmUq3vhcw14xasImDY8Tgw8ul6msk7ytQ5sH3kz UXaA== X-Forwarded-Encrypted: i=1; AJvYcCXlGy7iYhJMnqAHtQ48olJaaYw8TTV9VVoj/i6EWQBi2p0YghLbeSA65bdcuIFUjfy02MoyF1PyW2fTyEk=@vger.kernel.org X-Gm-Message-State: AOJu0YwJdBTimP8zMklK5r309VvV1MjGvwbzlSLcOBszP0LznXjmjjEI BXx8MpnigrGEN308EtN9W09R++YIyedLztxk6Vr6mr7QdADVqAmtCF6E X-Gm-Gg: ASbGncs0V6OqM24lM3DK79L2aq+WIhj0U0NOw7m1EUJXGvZGLbiWKtWW9juUd93+0Sl yVED2Bvz1YtKdthABGKyEq/yecP8dbYh4uj4P5TwqHocX+8Fjejzj07Nf9jpCuFfLwvqWP9LuTp o7RCyr+ULQFFXLUwJ0HpAy6Yj/C84BD/ZkbGhm0VyuiVaNJrjmhB+jKLexo1cKEw50vCTn9J2gL 7Q0NcXqTV0w0dqx9OkfoyK/tNNTYlRtqJ59RckYtkP5g82oRpqnnxBH9DJ12yCxvipgRea5jxyO MhG6gwLfhTDvEO3x1o9QyUu2Xx29zy2Q2CLah5WxyzmK5n5Ytfbu69k8SV3kt7PhDVp1HMCNUXi DLZu68JENbGJsnHrMnCn5i1V6cRnk3VOJNXFS8tjY7vrLE9/guvt09mLzWXN7 X-Google-Smtp-Source: AGHT+IG5Zi/tUWgv5fo5AJbJybfMI2YP3J2uv0Uwa+Uo4jUypcFGg1/JcKwmQEdKeq8TaIbn+u9v/A== X-Received: by 2002:a17:903:2a87:b0:24a:d213:9e74 with SMTP id d9443c01a7336-290272dfbb7mr102338975ad.49.1760007479177; Thu, 09 Oct 2025 03:57:59 -0700 (PDT) Received: from localhost ([45.142.165.62]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-29034f36408sm24973055ad.91.2025.10.09.03.57.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 09 Oct 2025 03:57:58 -0700 (PDT) From: Jinchao Wang To: Andrew Morton , Masami Hiramatsu , Peter Zijlstra , Mike Rapoport , Alexander Potapenko , Randy Dunlap , Marco Elver , Jonathan Corbet , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Juri Lelli , Vincent Guittot , Dietmar Eggemann , Steven Rostedt , Ben Segall , Mel Gorman , Valentin Schneider , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , "Liang, Kan" , David Hildenbrand , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Suren Baghdasaryan , Michal Hocko , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt , Kees Cook , Alice Ryhl , Sami Tolvanen , Miguel Ojeda , Masahiro Yamada , Rong Xu , Naveen N Rao , David Kaplan , Andrii Nakryiko , Jinjie Ruan , Nam Cao , workflows@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, linux-mm@kvack.org, llvm@lists.linux.dev, Andrey Ryabinin , Andrey Konovalov , Dmitry Vyukov , Vincenzo Frascino , kasan-dev@googlegroups.com, "David S. Miller" , Mathieu Desnoyers , linux-trace-kernel@vger.kernel.org Cc: Jinchao Wang Subject: [PATCH v7 13/23] mm/ksw: add per-task ctx tracking Date: Thu, 9 Oct 2025 18:55:49 +0800 Message-ID: <20251009105650.168917-14-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251009105650.168917-1-wangjinchao600@gmail.com> References: <20251009105650.168917-1-wangjinchao600@gmail.com> Precedence: bulk X-Mailing-List: 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 Wed Dec 17 12:35:43 2025 Received: from mail-pf1-f182.google.com (mail-pf1-f182.google.com [209.85.210.182]) (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 AAAE52E9EC0 for ; Thu, 9 Oct 2025 10:58:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760007485; cv=none; b=YPCgvuNZ9dX5M+/kRSkyEYwU7eoTN21dwavQWv9aCT9901r2kILOAK6QU+Ff7UAXCbDHQkXeE1NZWNqDjh5FJfhZkj0GhOFLPF+IIDzVY00oNY7UqZORUHCrOzXZFFDqIoaQBu5OwQ0WFL/YfgM6mPPU2VFrrZHrAhtrx2CwjPQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760007485; c=relaxed/simple; bh=ye1IFedT6QyfAsl7NnFp/ScKqi80nwnk9udpC+1GQaI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ISnSWqdS0OpPUC9YjN6wAbhV7QLC5g4bwET4bmzS/ybfwFbhEAz+3s2XFmrckAauzI+fKNEmOxEJRR4tbI3WuPDihGJbW20M1OoqOtCZotyMO01CVPyJ1Z7NSP4HGUsx4MUCpwcDjshKZxfKEqGEMmgdu1wkF70a2wDLeaVTUic= 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=LdKRLbWe; arc=none smtp.client-ip=209.85.210.182 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="LdKRLbWe" Received: by mail-pf1-f182.google.com with SMTP id d2e1a72fcca58-781010ff051so593450b3a.0 for ; Thu, 09 Oct 2025 03:58:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1760007483; x=1760612283; 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=LdKRLbWeg/b5DVlAqapHePmhvK9AG0yeiBom5D9bMCoIXu8P8c+Umy4sT7Kah1pDbI e1Rcp9JcDySTjznRdaxIei5/6B5nvO6zCKs+nDWrNiSPrNGqrdeTWCZv7Cu19ecN0mhe hZH3WFQTCOJJD1nTm7vvBdsNvVjxR2ln2aeSjGkELI7oeB379UefLEDPhsuQc0Hzx3Ta 26DCv+2k5pRPudddjUObqT4W6QcbK+ux/K3Z6CBv3WK9eyIOKaqTTkLC8xmMkbWLQeNN kcIxQfdmxd3mDrgLy84H4OnGKkhX6Ct46oqGyW3u5jrdmjedHtSOaMjBjM9dmINe8BSe jNLg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1760007483; x=1760612283; 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=YlhkzaAKdrFj8zYiv4TGI98zzjVg0XV/qGquDr8l2sRqigquMMp6kRlNoq4ZbdljwS w54c/r7Nc/+NMQaWC5TkbKHxPAjY3ekNq8IqKM2qD0frAAvdOgjiSQEzJwIB/1V/XT1h iatS5XEDvq+Aqon+9voE+9hVuIIvY4aCwwIVScvSfGeXCE8BFsH8X57/f3EtxiLG+doO 0n5CNWOUp2qeyZHQDNbRA2a8k3lN6rDkLOI832NmUgIBCO04m16Nf9k5+IswcV53VvgT XCXJ5h+YOMhvj7TCgvyQBlW4bUXibf8w9K1oI2/8iDyrPIHoLQ+MQbc5rxT6jMAl+QOF fHFw== X-Forwarded-Encrypted: i=1; AJvYcCWIJUwMQhrn0j61GCXmSCZoZGegfSQ5f0sP3ALvHWwBCGvJKwFjZFjS2eYohmI7te8OyJrVf3HC7yOVj1o=@vger.kernel.org X-Gm-Message-State: AOJu0YwUFgjsbWqg7vbxGRdGDEmxgUUX5I8BQdCr0rKrCb+GcIAA980y ydZ0vfN2sJ1nHnOwPNfPBgND41j5W5euRFatzQTquyq93VlhaW0TIbA0 X-Gm-Gg: ASbGncudTvV4b9nM5UxepnQXJBIpq2wpmKbd+Vl8wUgeUDd1lw3Zu1BPjq+nzGtLjGw tCe7pV+UGY5ZiHAo49M7JZscWPFsMzo5h/JThfQxtUceyNF3Yu2btXDvPCchwZ4h/Z87EiZeOf1 pBwrQ5vFKCXfPyilU52NEXXnjmfIOcR9kQDADPmogSU5m3CycwH0B4bgWO8qATKXYz7QV4GWZC1 nUfPwgjwxH/ukbUEpSceH1vtNPUzNrtrOg2Jkaoaz5HkkH6IqbWYsvYe4xnFWB6diRzyNA0Dkp2 O4mjbBNt8H7hdCEBrxK0mqt23OvL3sC1foiGB3ENlPMSoqgXZK+FvEKdx649NUWvpnlmnAPUyhU xGkyykbnvkc/RdBJB6jWuYsMKHabrMkIhGUoEWGnBg2kBQCUyihd15QkKulCLlUt9fsXp7g0= X-Google-Smtp-Source: AGHT+IGV1mxHWu3pQaxCo2GAVbKHGeNdLDqI1po/b05L3G5Ejn51+25jeUHtC8qpbOYN5GwS7DtIXA== X-Received: by 2002:a05:6a20:12cd:b0:2f8:4558:ad9e with SMTP id adf61e73a8af0-32da839ee26mr9375118637.33.1760007482826; Thu, 09 Oct 2025 03:58:02 -0700 (PDT) Received: from localhost ([45.142.165.62]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-b6099f3b041sm20711876a12.24.2025.10.09.03.58.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 09 Oct 2025 03:58: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 v7 14/23] mm/ksw: resolve stack watch addr and len Date: Thu, 9 Oct 2025 18:55:50 +0800 Message-ID: <20251009105650.168917-15-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251009105650.168917-1-wangjinchao600@gmail.com> References: <20251009105650.168917-1-wangjinchao600@gmail.com> Precedence: bulk X-Mailing-List: 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 Wed Dec 17 12:35:43 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 35F0A2EA178 for ; Thu, 9 Oct 2025 10:58:07 +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=1760007491; cv=none; b=YD/q9O5kNbKP1cHdKEe79h43kPs2ATY4Y9D5amfYAl2a68ZyxWkiYCrE3yfmcpR40nP1OGHoEbgp0MB5PRoq9Xa/xY4Wr2VtglN3CWmXHRxJx2tcWTxp27R/la/b5SeVGp/ZymXcTHy5mHlKaw+ec61w5cpWDtUIw2Wu+/Ne1qU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760007491; c=relaxed/simple; bh=jb47W2mefivkhEZpeuyQPhjnJkRHRCJ2NscvV1apXQg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=S7c6ix17Oy1itkulGUZg8DOpWjw+wkmHyqGJ6q+VmOsA++pyuH36IeKwIJksS+q2CmOLPjtD5XTaaI2K3PpwhIYRXIWVD31y4Pr2DgDelP7ffyIPOTMdKE6DPOqdRV93MLgFSsUq+Gea4sN8ueocnjRBZG450PHhCjFi21HzrxU= 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=BcxnklMX; 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="BcxnklMX" Received: by mail-pg1-f169.google.com with SMTP id 41be03b00d2f7-b57bf560703so521792a12.2 for ; Thu, 09 Oct 2025 03:58:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1760007487; x=1760612287; 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=BcxnklMXY0S1nikXs8Pkm91y+PNuSzZyHikRCaKEHuMr5ix4y8kphhrxunKpwrJYdl dAdi7tRNY5bsvaY7esYI2tRCz8S1W+jDni7obTYASTK8T1ZPWsLP1qXR6pNidAKw0eI2 wV5lwdWHNqCYgpt3bS00s+xHePICE8i4Aa9TTuX67P7YGvP8gmgKPmYhBX5+I8Hzk01t iS41WM6ySQC4q8VQk8FyNNr980zejO5HpzHBc1RjNSColYAozKZSnjFQ7XGE+LLe4Ody rcqnn3nIwNKyGSiiWOvAAUy5OWg/5TtRSjh513Zx82fsDN41lq2oH2F0HNX13KxxHACf G0Ag== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1760007487; x=1760612287; 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=HozhkvKZMX82mPj45P56536nvbUsM6Xcx5jUTlUwyJsxnm7avsOudmrn5tcfOiT/Yf +24tgGIlGvGxjCIPgO/sBJHl7UyJjkF0UsuFlclGZljQ6tDo/91wmn344fJjaIF1moj/ aW2hihUBM4WxIa8ynMziPCbHSjkf3LcAM4LUEbU9KlUZYvnaKZkGxcKnLvBxWoaYTG23 FdRG11Wznv6rbydTsHY8+Ay6sgKaJ2ZPKh2/tt8+339DcCopKprMRzqyVYHAVVJdm4Im BGOno7WnT3vZMC343LylNoMXW9k0Q5G8AvFiBAxOIU+ac1zjleryMzz0jC7i/qpcJ2nU MggQ== X-Forwarded-Encrypted: i=1; AJvYcCVY5YSPqleafFhwakCs3a/hePCzLTt3wRj/MhnBKo+pgmnSwKhXoTLk+WiyDqK06IVfGsfaWkFcVdDkQeI=@vger.kernel.org X-Gm-Message-State: AOJu0YyMnaMDc2Ptd2R5Ogoyw6mZ5FLI4Bufjk1GB+rWmLoEJ/Fk7JsZ vJ1aUV/pnitjrr/nk/oPTOuNmgexWthpKdtxW9MTXWGs3kxYl/a18Za5 X-Gm-Gg: ASbGncuu9BTpyGvGZkPzwij1mgaVkOXnbf0vk0sVY2KOeXUt1ud9OK6S7xqkkIg4PlG SrLwuYYKJUceYujmXGDjcolTZzXPIOQ4BpRZLYtAEVugLWxdQw+RMRlv1C+RpVz4Hmk3BacT0Bx TRzOw5B2SFne8GJ0Pe4Kjz1ubIboENfSs/1tVK3Das1UZOInnfB8YI7f7dlutbyQpR0bTBQCfiN ZH7R2e2mr3CAy4ywMJP11EtRT42Lpbch9+mXZy14SIuWy7FO7SE5+OyPxIENXS8He9tWMk/8UcD JS05Z1FRBkCwfpjsC/Go2Rb9zaX/Y7FecrK/brF/y4ht8sTaXZAHZ3/r1/2kDhYh4fYb5rwFjf5 ahFiN+vwMi7LP7ul5apkhJMveVKsFPF/U3nzCedND/S0UmOiLUvxr6WDYeHBDp63tMfTGlfQ= X-Google-Smtp-Source: AGHT+IEEjbaanbFet6ymw5rLaG4ER6hS8x4PnRfmIgvGUILNfBcq5r77DsCvwjAQjB7po7/MVjYJ6Q== X-Received: by 2002:a17:902:e94e:b0:270:4aa8:2dcc with SMTP id d9443c01a7336-2902737c5e9mr92201005ad.19.1760007487406; Thu, 09 Oct 2025 03:58:07 -0700 (PDT) Received: from localhost ([45.142.165.62]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-33b51105813sm6628595a91.10.2025.10.09.03.58.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 09 Oct 2025 03:58: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 v7 15/23] mm/ksw: manage probe and HWBP lifecycle via procfs Date: Thu, 9 Oct 2025 18:55:51 +0800 Message-ID: <20251009105650.168917-16-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251009105650.168917-1-wangjinchao600@gmail.com> References: <20251009105650.168917-1-wangjinchao600@gmail.com> Precedence: bulk X-Mailing-List: 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 Wed Dec 17 12:35:43 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 135B92E1EE7 for ; Thu, 9 Oct 2025 10:58:11 +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=1760007494; cv=none; b=m16M2HfUrcgHMcGsqkhFk2YsEFdRhwO0Ne913hbQLTugBDSg86vY4lyQCoRLF5uv1NR2hlRhPQ+3DVzcSYKiBnz7kc1HI1rLDGS4YiMw1EnMu5yCHCZjwZ6U0oAhkzXTe4ExJLaRKcq2HnbqgpP5mkqKR2iFn2m+V4XcZGfrPcs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760007494; c=relaxed/simple; bh=zgbvGJBSx4YBKNkqO/qzz/La9XfnZ3vAatfFaQMoL7I=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=lduR0jiGUmhIcJrSSpu3gZcniOOKOgx3nSeW7S3/DrPALMTdOXuVZFozwKhlT2IhMZSrIe2Y03EVQSQAlldXLSFNdnT6HczszBEZPOHuU2piCnZFhuwoEeEX4GnaaVpeOKe5eqzWiZtV5Fu57rqizHXKp3McqsrnAuj6KAzHsTY= 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=E7UOdQI9; 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="E7UOdQI9" Received: by mail-pl1-f171.google.com with SMTP id d9443c01a7336-267f0fe72a1so6095045ad.2 for ; Thu, 09 Oct 2025 03:58:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1760007491; x=1760612291; 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=E7UOdQI9HCnZcw4uCetsJxxVnlzNoFrHiMsDTfSUoAXhW6aJCYrojh5o2cwPO+4iJR et14Ixf632iUBv9LvIqZnu2d9iQOwf6q0NrwMPKrS7K/bx+lySw0wTQWP+F5DjG6WVPL mxO8wb3CF78iEpYq8TmQTtdqCOrvTrUz1PCu4nPMEu6QBYt0CO/oDp7uh9siSqXyqxdb MlEqW0uunkBftyJ+7zRH7O7abltplnEWfErQ4Usdx4d1OphEYablLyAPRuthU7E2dT9Y z/hf5TTOC4meR8c6BqmNZy4l3MXqn583hylrwkECpYZd+/c+PSEc9pakAVxlDlm2NOKI u0og== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1760007491; x=1760612291; 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=Okb2LdFdO24jBFHY8jZNw2bdQrJtS4mq/syXFmVvb/to41O8Ee5jk5cFKI1FpHevr1 zrxCkChOTRkS1Yld19NWBD1nGj/Frdf/qrTDfEn23ekfsPjo0BGx0SLVi0ss8ZfmMl1V ct6Wgbx/r4cPJUayLVWlJw0K0s6PQz6vfAvEl5pPKdORPLon/aiFE6Wbs8lGxEfjie0/ uAl56rxbVgf+X6Av6pglsin8H3GBn0vpF3dlMlit88CxKt9bneyTFB7soR3LQb/0rRXc 0IHM30AqPL4KOldam4WMvkXCr2NhmmzmS9xKfEaIHJg817ZXsrsYM9R2bzNC++1fL2jq 5V+A== X-Forwarded-Encrypted: i=1; AJvYcCXdOSHFkOzLCenv6mHISuC4oxfacBIikOgVukPel9EelZDXpcafwIBn3mAiJ4zwznGxVyP9idUI7CeoS2s=@vger.kernel.org X-Gm-Message-State: AOJu0Yz6kt3ewqJ475pFLyaYkmGgextRAj1wqQ2PNBkMUy4myVCkgtaB Ff5J3MNWLgNu2cM0+c98CpF73nrT8sEkXE9FPihVx2A19ASZdjzHMwr8 X-Gm-Gg: ASbGncvC2shDwHYOOMUWhbZ6y5vV1JGz5VfIoxvXjTjCYAV/5595wBI2q/3EzIihYi8 ClNyp7ArssNd+8TA8FRaEy5nTUJm0cmW+Cx2H59L4zjfV4ks1apa+jEFkKTTGo/3D2W4XXV+j/9 tH8DkvPptlqZ8zTAImYee3CB0Iv4w1nJNzbFZMFL/b0WgewTCFVVHYvYuGJX+RAKxH/lVIQMI3O bz88nBSEgu3Esi7PCy3Awr46nKbqE0wR1f0wNZTssNviQhoV1M+C3cvKi8gJNT+3nE5ZsbcrPeH 8i1IMoXKPF+MuyiIuPrxLgR7vBvb7mdDRdnCEE/c1oOhWoHlMdd1hcbVNMoomMTNLtAIagckKiM 5bNWBo7HygPUqa96CJyhZNL5qfCqSKfXPyrf4xAdpYLhxr2UMGbMTHWFLtr0w X-Google-Smtp-Source: AGHT+IE5mYvqRuQZ+u7IQ0srPI8O6QG8ywmWS1iS+UAE48zG0ZozJL4ZlmLiRWALZX5JRbD2vynFcw== X-Received: by 2002:a17:903:2f45:b0:27e:f1d1:74e0 with SMTP id d9443c01a7336-290272b2bd5mr92577745ad.17.1760007491218; Thu, 09 Oct 2025 03:58:11 -0700 (PDT) Received: from localhost ([45.142.165.62]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-b6099f7ab4fsm20659266a12.44.2025.10.09.03.58.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 09 Oct 2025 03:58:10 -0700 (PDT) From: Jinchao Wang To: Andrew Morton , Masami Hiramatsu , Peter Zijlstra , Mike Rapoport , Alexander Potapenko , Randy Dunlap , Marco Elver , Jonathan Corbet , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Juri Lelli , Vincent Guittot , Dietmar Eggemann , Steven Rostedt , Ben Segall , Mel Gorman , Valentin Schneider , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , "Liang, Kan" , David Hildenbrand , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Suren Baghdasaryan , Michal Hocko , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt , Kees Cook , Alice Ryhl , Sami Tolvanen , Miguel Ojeda , Masahiro Yamada , Rong Xu , Naveen N Rao , David Kaplan , Andrii Nakryiko , Jinjie Ruan , Nam Cao , workflows@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, linux-mm@kvack.org, llvm@lists.linux.dev, Andrey Ryabinin , Andrey Konovalov , Dmitry Vyukov , Vincenzo Frascino , kasan-dev@googlegroups.com, "David S. Miller" , Mathieu Desnoyers , linux-trace-kernel@vger.kernel.org Cc: Jinchao Wang Subject: [PATCH v7 16/23] mm/ksw: add self-debug helpers Date: Thu, 9 Oct 2025 18:55:52 +0800 Message-ID: <20251009105650.168917-17-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251009105650.168917-1-wangjinchao600@gmail.com> References: <20251009105650.168917-1-wangjinchao600@gmail.com> Precedence: bulk X-Mailing-List: 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 Wed Dec 17 12:35:43 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 E0DDE2EA735 for ; Thu, 9 Oct 2025 10:58:15 +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=1760007498; cv=none; b=WsPgKG+/EV1ftjsh2TWBm2FKLAxZYtUA4QiIhzBubk/yTX4Onj8ux5KCQPgLZMFxQFgpROG4QoRqlpChhe/gTl1rmsOV9t9VnLY776lrrJF1D7buPHT/yv1hFYeITC8Qw+CjdERKZSVuzbHpDf2sQ0VrzoFZBTM/roymM7HTPwI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760007498; c=relaxed/simple; bh=fq2Ne6eA5Hj+u/oZogdwy0lpJa+hkt/8IQwPQXp6BxM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=O/A6ufYvowtFYnLvkMbBs98CxEkSDHvz9H6nApVaV5tuOEBJQiB8/yEDVRIKmZacfyrlQposot7ne99j4Ykc+DkEH/pd09ychcvbOhg6V6pekvqbSGVhJzY04qqk/z+wbmWZ7eS9i/W+7dePDifYF4PR/pGdAmNSAsJJOxAMJDw= 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=H607T/AS; 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="H607T/AS" Received: by mail-pj1-f47.google.com with SMTP id 98e67ed59e1d1-32ee4817c43so759814a91.0 for ; Thu, 09 Oct 2025 03:58:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1760007495; x=1760612295; 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=H607T/ASE7Rnz5qYGOMgNyEpgE0IoFctC1NLPgLpgD3P+Pauoij2McYLUavZ/jIn0z +DGvavMPvaigtGVCquwQmFa8nqBeY6zrtimuHUHu4Bc+msN8M6sTOEXYtUpTyot4ubhx 7+/uHXZAML79IuQvlMt7RW+h7rygUJjnrEuQHhepCi8rG0AQ158RP2fQ0evWdk1Xh//8 TS9P/RZ16TkPNLqN+dbOTDDbA//PcPCI0/PgPo2/n6CvguCgfimcdlMtQEkdeioh/r1m du4ZogEBQPBn1rr7KtwRMTJdILBdq2kysOfEIvCtkU/HK8oHzyrp5F9wlpDCyaiMfuyd 1UmQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1760007495; x=1760612295; 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=sPU0JOgafjfXH7Ac5jwbpLACJdbSan6Gxi5Emv6Up/eVigZN7gwVjJVemT+Fa+V43z wgJxP8LavlaHnaqvtVPoGM/I8VXla4PG4IQJCiG8s1GVQLWy5NBZbH/Pqg24ZXpHeInG 0At7xiySoGvlYlTeplo4alyTwti4Bj5PhtljBm+xXtZrR7BsKIqOUlTOVvlwuXOggzQ5 ZdB8tJWwkhZc/hzP3cFBc6rQY7+G3lePcdrp8s0XYPnNaHUXaGPgULejg674utWglaoc pkHou58afM5b2sgm2Xi0Sd6sIgr9yjnMe+eq9sDDANxkh/C21OIF6/dgM2Hy0gSImnAB QwBQ== X-Forwarded-Encrypted: i=1; AJvYcCVp49siJCtYup/tTAlxezCoudEpmz42/tvJIKPscRvCVNFGyBvh6oLkafkVOy2mJGS99qGCilj0mCcc6H4=@vger.kernel.org X-Gm-Message-State: AOJu0YwU7w8THvUZYVyPIV61RwHs0/lhq8cQ74Vd9tn+H8I/WxGflnLw AYZmumV8bBep5U6HZR78HLyQ3ybJ5hQv5FXEvywx/NSz8/ST+0V8posh X-Gm-Gg: ASbGncuqloElQQ7CcCUxjOGlAkOSQhfQlqpKR1el1UceBqfwLapYJLxXGI8hUsBXsIL sCYp5CIH8g+wk9cc6MUyhCwFo+ag2gOrHlt+X8V4aYCMnwQLo+3lmrAYHNDFosYmD/YaZni1Udf zukxqclFGfDQdOc6eX2xrcxKkeL4pCeJvWYmEzgIcp2AiwSwtbmfnEnVRzv/NPXvUC/k1cwDsm+ rELAadGrz+YgOkkD+ELgNeBl7QkF7QIwit5FM1x88vMPontA6HD3D01ChPgGqitwP/PmGr3JDsW IM7f/d+5wTUeKWyyEmlN6H/b3nTB0doRXESwU9UEa94SORYktmzjfCu80OEX3GX0fJBquMma2Up KI41LjPeoBsO/W8zRrmNZyml2o6MBKJaiNDmPoX6j6A4MFD6PAB6wgCK+BBDeGPzQuqmnmX8= X-Google-Smtp-Source: AGHT+IEmLuap8ugWBv16A9DJeROmcKQpeqK89dicn1ex7O52mvV1jyxIgbB9ToaVJaHbTj90CsCHAA== X-Received: by 2002:a17:90b:35d1:b0:327:c583:add with SMTP id 98e67ed59e1d1-339eda5cf24mr16255407a91.6.1760007495079; Thu, 09 Oct 2025 03:58:15 -0700 (PDT) Received: from localhost ([45.142.165.62]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-33b513ad555sm6898776a91.22.2025.10.09.03.58.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 09 Oct 2025 03:58:14 -0700 (PDT) From: Jinchao Wang To: Andrew Morton , Masami Hiramatsu , Peter Zijlstra , Mike Rapoport , Alexander Potapenko , Randy Dunlap , Marco Elver , Jonathan Corbet , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Juri Lelli , Vincent Guittot , Dietmar Eggemann , Steven Rostedt , Ben Segall , Mel Gorman , Valentin Schneider , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , "Liang, Kan" , David Hildenbrand , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Suren Baghdasaryan , Michal Hocko , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt , Kees Cook , Alice Ryhl , Sami Tolvanen , Miguel Ojeda , Masahiro Yamada , Rong Xu , Naveen N Rao , David Kaplan , Andrii Nakryiko , Jinjie Ruan , Nam Cao , workflows@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, linux-mm@kvack.org, llvm@lists.linux.dev, Andrey Ryabinin , Andrey Konovalov , Dmitry Vyukov , Vincenzo Frascino , kasan-dev@googlegroups.com, "David S. Miller" , Mathieu Desnoyers , linux-trace-kernel@vger.kernel.org Cc: Jinchao Wang Subject: [PATCH v7 17/23] mm/ksw: add test module Date: Thu, 9 Oct 2025 18:55:53 +0800 Message-ID: <20251009105650.168917-18-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251009105650.168917-1-wangjinchao600@gmail.com> References: <20251009105650.168917-1-wangjinchao600@gmail.com> Precedence: bulk X-Mailing-List: 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 Wed Dec 17 12:35:43 2025 Received: from mail-pj1-f42.google.com (mail-pj1-f42.google.com [209.85.216.42]) (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 8B6F82EA736 for ; Thu, 9 Oct 2025 10:58:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760007501; cv=none; b=F1+4Kn7Rn1A/3G3VelzqsVRZfcv33mpUwDkhx8L86/A55Vd/K4v8Yz7grH62c3HF32xPqq7pAvbvoLJCdVr8qdsBn8x5wy7/kAnBxKouNyr8ZIGbEZ37e0klOK48xQqRuJ63LsoHUx8G+JuwosHCJ21jE2htcFhLkI/ytBJTZ3E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760007501; c=relaxed/simple; bh=4AK69KqpFrfryQfFlxiqdszD58BNzBtZp9+AZ2x2szQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Cf3p81tlpZ6qOhWibckA+e5C/QJ7xNTkyjEqRQBrdmogInUMx+hvJbIOJ+lkRmr3XkQJUVUdsrC7NkjFyXsw6ljfv8gqf3ybqwQBC+p5+Clpt/IMTaUy4XHtw303+o8E5edQGo4+veCx99aspdpA4NcXXiKYiq2wOoV1BxTv+GQ= 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=VdWYKoln; arc=none smtp.client-ip=209.85.216.42 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="VdWYKoln" Received: by mail-pj1-f42.google.com with SMTP id 98e67ed59e1d1-339d7c403b6so945241a91.2 for ; Thu, 09 Oct 2025 03:58:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1760007499; x=1760612299; 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=VdWYKolnA2VTOQLsUhqiI8EXk+CP1u6RrwI3eVOpekmX+3AvkvGi/86eZSDVMaiF6E LhPVwN/o4orn1jYNogeBjD3GqYverSjNm/6GwKCAjAFtKy+axBlw4R8VGza1M6V49HI/ zZVYZVZ9BXGy6ddGsFVotUPWyO/97JSRcVVjUN2TwG2Ghp4+ltsA8AGvNhMeF+A1Qaqp DMg730YWzmowZr1V7SO1jdL297D9nb8t5DJlyF5XgJKA67aH90J3nXRJHR97iCTtpD+R d+3E5JOgdxaAkeMYF3uKHx+1P7o46tBoZWzJj6NvFaTIWLJVhby2v8nvgjWZnMrURikS puXg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1760007499; x=1760612299; 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=ld1itCnNWFsMNXES4G23EV8K58HTTzgZe+m2d/EbUDEjF96PcSGt62bugRna9Hm/x/ B4HKBGzORt5J3uubs/S1LmyBvnH4eYj4yJnrSBo6ixDox8rvqOXgoHbZ82+Pp4svxQq/ 3aiVdeB3JM4ZNkOTNZGgDEiPeftZkNlLXqZJLv0IZNIX5uZ5rRN8Cajfd6CBIwyq/QGI I0MkIQd2++NoLgR/zoWwV/IrJOIEbz7qruorXeyGVRxEPOQfjX/95HCM+yMfkkkbY2x/ kBORG5Xr7JrobJftr04F4SQfoAoEZI3pvRDbtPTto2PeWFAzXtHU9czfvJwwwgu7BbSC CUIg== X-Forwarded-Encrypted: i=1; AJvYcCXfkWgpxoi6qOFfmq9eXgdjAnm4JS9VKLD98YUuArehEKbKAR/timsDKmiJKhsq5qFvSc2AItEX7NpUr/U=@vger.kernel.org X-Gm-Message-State: AOJu0Yw5za1LVFIeV0nQTmafgfWsCDiPhPYBCeFd8+czmpWKJoJZ1g9P gYZkmtKEYhd51oNleBdqOMA7F8gGj8D0Bb5vrChuyl7D6ftjmAaLruE2 X-Gm-Gg: ASbGncu7zonR6AxZjHQNg0hvM7rIa3Ce+zjNfKiVofghUMNhcGHCypuYH4F9YaWN+f/ ehVHgVMk/7HSMZdKG485wJTbjFlmvt+l2eIT407nkv9v9W8heofIS5JaLPxhIY8asYZ0QxzS7Y+ IQ1Ce2lfox5zgOfRozzx6rcr1wGzzsqq98YnCPCTylAR3q/A5Bd7t1jgbv8bevp7dB7Zme3CV6y VeuxrXZflkzwTUOv8NAjxvCSBSP47ZzdukkNx2XCi4LqY2clRMUdZvQhIytxGb9UnXXiONWgcIN mQszWCsnPq3fXAtyZSs77ZeauypZd5rAQ/Md3rBghiZ8rmA7k7vpAylzhAooTB8j0niVK03IPHj ofemeUG2xLSNmq0z1UN518z95Ibj4nVYe6OCQHlFtYRkHNNdNFOjHDsB9e1oNiuJCh2c4dG0= X-Google-Smtp-Source: AGHT+IF7XK4PU8M1yAqeyUxzKM38g7FsehoBLZ3eJ3Xub26Q0OuA6NSoqSKwX8dJhtbar+wuz4p6HQ== X-Received: by 2002:a17:90b:17c3:b0:335:2b86:f319 with SMTP id 98e67ed59e1d1-33b513eb68fmr9866604a91.35.1760007498698; Thu, 09 Oct 2025 03:58:18 -0700 (PDT) Received: from localhost ([45.142.165.62]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-33b511135a3sm6725691a91.11.2025.10.09.03.58.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 09 Oct 2025 03:58:18 -0700 (PDT) From: Jinchao Wang To: Andrew Morton , Masami Hiramatsu , Peter Zijlstra , Mike Rapoport , Alexander Potapenko , Randy Dunlap , Marco Elver , Jonathan Corbet , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Juri Lelli , Vincent Guittot , Dietmar Eggemann , Steven Rostedt , Ben Segall , Mel Gorman , Valentin Schneider , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , "Liang, Kan" , David Hildenbrand , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Suren Baghdasaryan , Michal Hocko , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt , Kees Cook , Alice Ryhl , Sami Tolvanen , Miguel Ojeda , Masahiro Yamada , Rong Xu , Naveen N Rao , David Kaplan , Andrii Nakryiko , Jinjie Ruan , Nam Cao , workflows@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, linux-mm@kvack.org, llvm@lists.linux.dev, Andrey Ryabinin , Andrey Konovalov , Dmitry Vyukov , Vincenzo Frascino , kasan-dev@googlegroups.com, "David S. Miller" , Mathieu Desnoyers , linux-trace-kernel@vger.kernel.org Cc: Jinchao Wang Subject: [PATCH v7 18/23] mm/ksw: add stack overflow test Date: Thu, 9 Oct 2025 18:55:54 +0800 Message-ID: <20251009105650.168917-19-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251009105650.168917-1-wangjinchao600@gmail.com> References: <20251009105650.168917-1-wangjinchao600@gmail.com> Precedence: bulk X-Mailing-List: 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 Wed Dec 17 12:35:43 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 575D22EAD1B for ; Thu, 9 Oct 2025 10:58:23 +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=1760007506; cv=none; b=NUwG036jIEENp3F2qOoIZ8d4oBQvxlDSEzXnr37lFTmcUqIulm88C10ZnmsQ2tF6Y6mU9xRTIarDoqtgc1LufG3FmbHlj8arr6N7qzKTLNwj5lNytMyeC+f0UJUPxDTnSIKw4PanjHIBFuaN1HuFsq0wGB1SdxKumdv5pz5K+Mg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760007506; c=relaxed/simple; bh=WUmvecag/bRJ9LbEABvkcHBuLoUzQ3sY4/EKuJYpRQE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=RRgWUmzB92NiitULhgOGEMF+F65SFu4uZQtm5bS3tqT2I3LI/4Xcu2VEmzPxpYzBFeKATE6HyR+isapR11PQBeQ4+6/RoSOFI+Mu6DsPs13IX/+EfHkLwD/G9zI69NGS1eUb08nocuy/1IgJ5ySaGhlgx3Ftj5PiW9ZzIGDy5hw= 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=LdyPi9xM; 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="LdyPi9xM" Received: by mail-pf1-f173.google.com with SMTP id d2e1a72fcca58-77f1f29a551so1122050b3a.3 for ; Thu, 09 Oct 2025 03:58:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1760007502; x=1760612302; 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=LdyPi9xMf0sABMXQbkJkxOyOHY1pmx92/10n9G7R2kH8tbO5DWwG5Viwdzo+5YUEtp npdE+fGvIdaHiTgyEA7wsK16gCtyIZHxj/qHN/nFIb69mbwr8vPV7VC4K0cLmLBFPKFf slVJxE+cRafJLgXAU//jcRlxGvvmsEYlzto4Iup6JtkTb8WQ3s3TYSLpzDWXbVqnbyVm mfILpsPXKyHGtD3C1OSqkzV7Fypd82SNCILp6RrJY/VjbrS0tc6VNj6qyewTRRr52wCw Kh42cNJd37U9CpHK7+XnpwDKIy+ANb53c4EF2t9/B8BTakyTNOQNKWyRcY0zmf2xwD59 3qPw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1760007502; x=1760612302; 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=NqfKusGDz6wKnP0ULqJ/ERycKpYDVIzXv3hRaqAlFnCqSQ1z0Z6E2+ez5LVJF2KdGK OdqmK3J4IhxCcb9z9XtjZRtFFGU4y8AQDo7SROIrRlHnm1W3M2Z6qFTgxoLIfkwCRxWb 5vMlCXpQ4kUzJ2ERZFqNjCrUcyv2A6atyNN29AmA7awCKj2muqBp31mkcrY/qTowHj0n XSUi97AFSCgYNjcqo8Xc1YYyO2ltmseB3SMqBD4vd4Wbt2Ss8muS2PxRz5w/a+zWpUjp gV8UMgPwlGFnggGXYn0GxSMyEHVQc+cljXa3ZEPzZ6xvvGOv5VmAfvb8LQQnC3wPZim8 GiQw== X-Forwarded-Encrypted: i=1; AJvYcCVmrCtOJl8cClpLuasI9izk5LbGqwXEF13RhxVKimyOrRhAcJCXNgmSNvsjkEp7Q+apBxGeEX8F/PGP7Dg=@vger.kernel.org X-Gm-Message-State: AOJu0Yx6GPKceXYt3bTwHh0FD0JuiN77jMpQtQCD0eCyFAmRGtjvQJl1 4TrOwLAFT7esqEk3YRIl1PjqYKFvNS1xSIJJ8E1eMAhAsgGYKUfHK/DQ X-Gm-Gg: ASbGncs6CQudg8KazlD2/w+c/Nacdp6aFoR4W+jtwG2WSHtpynKVwmPBtslIUU8tmX6 +zbEHxUFofkJHsxsE9LcejkTA/QQ8iXYGrDOjONEPvdzMdbrfKEkZfOnZO2s6T3X2Ffb1L/DhvA 3uYTgxm+SxxZGkKexeNxYw4420meGxvYebB3kWxucZWZuKJYqhHawML+pf19UH7daPOpJhH34Bg 346cfwCFSP3wlJuCmFOr+EGVGEeAGRt6jXxh9XppXQJTtLF24asEhmQc/9URKvQHH/kCJb/573O xYLhxbr/JJ7sgskw9doKBAgTXa2GM+Jz2NLyR2RrjHp5AsLBdbws1dmUULJW/K70+snr7WAXeJT gl1inaIEFAlLgXYIR5J0LSiO1v1KrL6JA4PFBmkE193AFgzcaBIYQYWH7NrcJBnDaDihiXJI= X-Google-Smtp-Source: AGHT+IGL1hfkw824Dhg5abUxp0YVqhv+dnuC2o95edaELXUy1UgmRHSa3+FhXmUlSur2PmpUVijsqA== X-Received: by 2002:a05:6a00:2d96:b0:77f:1d7a:b97f with SMTP id d2e1a72fcca58-7938782ac68mr8582957b3a.28.1760007502437; Thu, 09 Oct 2025 03:58:22 -0700 (PDT) Received: from localhost ([45.142.165.62]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-794e33f0cb3sm2487606b3a.78.2025.10.09.03.58.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 09 Oct 2025 03:58:21 -0700 (PDT) From: Jinchao Wang To: Andrew Morton , Masami Hiramatsu , Peter Zijlstra , Mike Rapoport , Alexander Potapenko , Randy Dunlap , Marco Elver , Jonathan Corbet , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Juri Lelli , Vincent Guittot , Dietmar Eggemann , Steven Rostedt , Ben Segall , Mel Gorman , Valentin Schneider , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , "Liang, Kan" , David Hildenbrand , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Suren Baghdasaryan , Michal Hocko , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt , Kees Cook , Alice Ryhl , Sami Tolvanen , Miguel Ojeda , Masahiro Yamada , Rong Xu , Naveen N Rao , David Kaplan , Andrii Nakryiko , Jinjie Ruan , Nam Cao , workflows@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, linux-mm@kvack.org, llvm@lists.linux.dev, Andrey Ryabinin , Andrey Konovalov , Dmitry Vyukov , Vincenzo Frascino , kasan-dev@googlegroups.com, "David S. Miller" , Mathieu Desnoyers , linux-trace-kernel@vger.kernel.org Cc: Jinchao Wang Subject: [PATCH v7 19/23] mm/ksw: add recursive depth test Date: Thu, 9 Oct 2025 18:55:55 +0800 Message-ID: <20251009105650.168917-20-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251009105650.168917-1-wangjinchao600@gmail.com> References: <20251009105650.168917-1-wangjinchao600@gmail.com> Precedence: bulk X-Mailing-List: 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 Wed Dec 17 12:35:43 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 7C6942EA736 for ; Thu, 9 Oct 2025 10:58:27 +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=1760007510; cv=none; b=dvjDz6N7kEQL/eGWjjz/sgGUpnRuehdxUNIS0szaNUC2Ha2E+8LiGVqsbt059BPS1qIYCQ6fvwc/g/Lbjeolp+1Odt5mSakvKypHTwLChp9Ay9A+AJLokqrUFXv80OIcgDuXaU8L7aXzEoPOQPQ4mutZc7SLuWVWA460qtmGYjA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760007510; c=relaxed/simple; bh=fxWJKkmTlJVGhf37wzDyuZOWELAg09qlFO66bjAfLB4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=aas5lWn1WBeN8fqWq6aPjuxQeCdpdlP2j1LOXE9aEzt3AOdIjwhp5285lWH9Q5nOimO52689ewKqmoqcUBmECByP7KLzPPrOfFSjZqCah/giJqdkxMZycZl1evMFMmr8hdptuRmK+/HTJqX2ujpdvqNd73LKL2CAiAUs3/FhhnY= 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=NSi9Amgr; 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="NSi9Amgr" Received: by mail-pf1-f175.google.com with SMTP id d2e1a72fcca58-7835321bc98so826707b3a.2 for ; Thu, 09 Oct 2025 03:58:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1760007507; x=1760612307; 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=NSi9Amgrux+zKez79OaUDXrFCrrss0QGz0DoIh6QEg4x1voJKgqeZkrvxCE+VG62Ft Z0YYhLdJDazqh4vnmRGFntVg7uin2bnWfQKt1jTYJf10IeJDzIkU27IpQI18MRdLNL02 BDvn9Iu/45cSshZJELvO212HK5mV1oIw+bXlWKr5z4vd5tD9RnX3hhwaDblN4mb23jax LqBoerqzxquQg/5AoPJ8zKYdtFmdTTW1kADfQkyVd59WBjvXshazwpXwME/+nivJ8ZT7 In94yFrl6n9zL7lRB26DYxgse7WbBeT/7us9CYPeK9pyo91Ld5rjuiwvstIvawNAm1a2 CS+Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1760007507; x=1760612307; 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=cjZVHhRy8pEyG+IjiR1ypoIgXvwmFJCeeTJfBKkDwixn0caBCsYMwTfh4H4YXSfmnb tCukMnwRiFO0voL8QMbbkooLd3DhHz5mOAR7nelncz6Vx78SmZXZ7ij8gMB00WfzLmvl uiRfq/37k8iic7UO0fJzF8oQtXLwv5UkmY3DmaeRwFVkXdE8iepaLp59/6lfPh0T3FZG Bon/fYvtUfiElEDAIh5DL7oYova6h0B+ZGrwPSyOh5S56Xau8EaqjUdlvAxPnsVZK0ne kiu7vT4qRVJXw3TgVKQaWT6nFwueWJv90rrZNc2W/J8KyJP8j3gC7X6mUIfkOLBBKZ8J dIzA== X-Forwarded-Encrypted: i=1; AJvYcCWPW1bSTsrxQj1AKqNIuihBtn8JNM+TB0ncXUXy+eNM2t/kiVor8HMkbOXJs7IgUxx8OPpP7b2vt6E+hdE=@vger.kernel.org X-Gm-Message-State: AOJu0YxacxbPzff8nsb54aZ4/zwLNsPTVh9Img3JqrfU7BrS3KsFizme BGyIlQT8GEyuyfuVifHAgZ1RrqTMmG/A+QGflJjYj5Z7+8F6Nl0wo7ih X-Gm-Gg: ASbGncscphhzdvsRzscxueejEcdVEyLkRKR8QZ2rLDYZdXhLxwzzd2qGi+/D8ia4ypW YGRZNirt/WtYdT5QiMSIhtqKFRAzSjbbuiXiavlzkvvOcvZ6YD3dYkBAMpcdQRnxEMPmcq5VhYr MMMV2eiB1laU0zRz3ZBePpezr7AYj7J0GslV9cJyeGPnHXI1i6uHAQUI+JWq8VSZ/bSbgeG+6VR hdhUMzVvJyIys6vbd6sDV134L8xrzEaW/kGV00LWmKgcv/R0P002ZrWMcf/YUzwIbMWrnBq8GsE M2VW8UC+jLKEecFxHI8RFPZtt7YnGpXAw1nQZ+Pq2bXpJKckeqRLi/l3TXIrwFZPRwfFZLmKgIg BnMaK5toKOY2OIyUOEcEND0onmp0bdKWUAJNI9mZaEwG/t4TNhsrKfFPuljzClsHawXstEZs= X-Google-Smtp-Source: AGHT+IEdrtfCBaVdX++NMR8obZ+j2Zp5QYbbuUxxVIgukGMBBMP9I58AXgffN8wHP6MoAs7w2yTpFA== X-Received: by 2002:a05:6a21:6d9d:b0:2b3:4f2a:d2e9 with SMTP id adf61e73a8af0-32da813936fmr7303953637.9.1760007506754; Thu, 09 Oct 2025 03:58:26 -0700 (PDT) Received: from localhost ([45.142.165.62]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-794e33efe73sm2503138b3a.73.2025.10.09.03.58.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 09 Oct 2025 03:58: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 v7 20/23] mm/ksw: add multi-thread corruption test cases Date: Thu, 9 Oct 2025 18:55:56 +0800 Message-ID: <20251009105650.168917-21-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251009105650.168917-1-wangjinchao600@gmail.com> References: <20251009105650.168917-1-wangjinchao600@gmail.com> Precedence: bulk X-Mailing-List: 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 Wed Dec 17 12:35:43 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 6AA6A2EB87A for ; Thu, 9 Oct 2025 10:58:31 +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=1760007513; cv=none; b=o9Uw8x7G6ZWuESXToKbQwdXvlZsM69Tq10H8lvc9DgXIM1viSNVPoC0f/ZKahfnP7cSL4URBDxmGE1W+8FyMQ6iE9DLFDXJhNCPjbtzrM9VpTQ1UJiAlT0A6EZgbM2egqfvYeN35qjzAJiBg0MZlwRaYdsQ3YPq02ZdjdpWZxas= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760007513; c=relaxed/simple; bh=fx5MM9mgeadn4AlECL2EeIytilVmfLOb03DEtE9qwqg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=GcBcugoU+tUKZg4ruZVFenAQ9jDAQRaLOd7hoZSLNXc6iTC9Cp3NwkCP0PTr+idy55kvRz4VyNVtb/YgVX7zYTyuym8+QKLiYoKpYK1ZyjzJ4WxtFcVaEdOdTfliYWeHEGu+ONiHI3+qpY1h1BnHI0MOMAK6hooBMaLcFY8oGUM= 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=dVrE5aoE; 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="dVrE5aoE" Received: by mail-pg1-f169.google.com with SMTP id 41be03b00d2f7-b554bb615dcso514601a12.1 for ; Thu, 09 Oct 2025 03:58:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1760007511; x=1760612311; 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=dVrE5aoEdZsYXcOjxGhjUNgawOdKAWBER3woXuYsd89/wbhM5DNyxVexkJKjqI2WHr HZ6OcnWgRByyo4XsY+8I8M3C9yz9TVrlbAFyWIk2JtsuEJkbv2ID8XkPU3s2/aS3JptB DJpn+ugFpJz2+4pr/1SImJc+1WDb5TSmpeWqewOpnLCkJWig9ik78orFdzNZLMlpQkSk V41jC4vX0e+ThvhH8C1hZ61m5vdVluJImwkDaHutmlgNsA/Zs+XVOopbkRXQNJohikCV C64b0gW+A69Shv+1jdrg9ueijDKhLU4eOQMOH6r9c1JrBoJWtO7l1LTPDGQKtCjmCAjt XC9g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1760007511; x=1760612311; 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=K1VCfihExsxwSLQbeQGPAeVVHmCIEH7TZbxL8R6hjK/81EdZUCsSRRDtX+780QngOe g8ONRV6HV5U8+QXGTgTrkoZg9FZ2u7iuqy7kKd/kyj8yKwQKf0fjhYOizWnwOc6z/TiX gs+SRK1IQpKszMjsl7ez/IPCjjYK9MwsusEax1hBH4ivP2kMfA3fuffL4FzafueyTX+F COtHh1H0YwU0ZWMrygNWpzW0LDdPHRjFivKvoervJj4YxLNenIHVbAJUBoYG0zP97fpK 1SM3raDGcR1hu1MGnA/p1x3CkzKLBV2inoL50Qnis+FYi5tShzVHuQ6ZWZan/GRw/n+8 17cw== X-Forwarded-Encrypted: i=1; AJvYcCW1hnuzrk+7K8va9DytTPgLcIWTWw87ucKK+ZyKHrxgTzgMoNz7OWDb3Iz9DbQtseedhf1tri6f5ET0x/w=@vger.kernel.org X-Gm-Message-State: AOJu0YwWb6vW59GdMa2d4WBQWbnh46Zcp6nd1m8H/5DdHzYwxfvuXBsX azhcp5EtMtlAoLYh4yMmwDiqDaWGaJMhnh15V7d83Y/wtjw6wNVn/pJg X-Gm-Gg: ASbGncu+Jsm5wiNDE6hpTXRjNc+Ur8v6KzC+m3ozoM6E5L1KJkkamZ187INUwyOs5+5 VJl5mDiCCZZtwq6EY3NAowD//Jl8FDtdQ4Ub/IIwe6j25BJ4F/stpSr9wFD7oegEI4J/ELcop+r K7OydVABJO7YhEgMOsDZrGlL0GsZ24wkafqa+D5uepgOFtYxlgh5Nk7o6obcvF4YNF1BNKBALQg uhM4R3sXpe6iNc0PqvXDQar2/hmWuP5LChZxG9HxtfT9PzSHwkhFGwO2A53MaGEcWLGff1kPRnQ eMkW7/LjtwMLwfiG9ZWV9Hjd45lN7UVWweEcc0QCrOnMmuvOi/BF9YuDAqmDjg9EUfQ7640ECUg e2ZsuoN/39bP6tiWYltTdd4AiZbAkkrxen3uTxIoW7UAA7ufTg19z5dr+y/+4 X-Google-Smtp-Source: AGHT+IF84UQdi8SdjzjP27Uzxv11ATZ55/94M/TwFF9mJGTJWLkmx5AoAZTRAV1cVi0ppq51LJs5Aw== X-Received: by 2002:a17:90b:38cc:b0:329:e2b1:def3 with SMTP id 98e67ed59e1d1-33b51168d95mr9160007a91.10.1760007510612; Thu, 09 Oct 2025 03:58:30 -0700 (PDT) Received: from localhost ([45.142.165.62]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-33b510e91d4sm6644930a91.1.2025.10.09.03.58.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 09 Oct 2025 03:58: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 v7 21/23] tools/ksw: add test script Date: Thu, 9 Oct 2025 18:55:57 +0800 Message-ID: <20251009105650.168917-22-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251009105650.168917-1-wangjinchao600@gmail.com> References: <20251009105650.168917-1-wangjinchao600@gmail.com> Precedence: bulk X-Mailing-List: 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 Wed Dec 17 12:35:43 2025 Received: from mail-pj1-f41.google.com (mail-pj1-f41.google.com [209.85.216.41]) (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 19DE62EBDC5 for ; Thu, 9 Oct 2025 10:58:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760007518; cv=none; b=sHt0l5bGaBEKPLBx/2uNhigyffxdC95EQdchfHS5szIu5MPQmp3f8Vmi7o96EFBApe+Wg+u808A/oG7fB5xK48JdOrVs8TQ38hDO4WiMdKc7YrljW7nlVIkYqkIEtk7Jo7uooooSbzSKJA5GKdk8BzehgB/1honeq/xbY4TqfcU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760007518; c=relaxed/simple; bh=10ctyktjmXKMQmk5k00rLRapyNy5j0hy9v8s13phBxQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Y2+LLrRP3qeF3NycEK14yRreHenuHNtD5EY3ujUsrwzuVBqWGH4jiMEapKq3vvjwgSOW+gWghf3U0ACp1oXgC1Oy9IxS1AXLKEwOlnov8ZUenJc7tOSn/QmxouXiVsXv/nWQzWErwJVLmM5ykZMovgNV/0dx0CnJt/BGcYuQif8= 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=GGYtzls4; arc=none smtp.client-ip=209.85.216.41 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="GGYtzls4" Received: by mail-pj1-f41.google.com with SMTP id 98e67ed59e1d1-33082c95fd0so1078759a91.1 for ; Thu, 09 Oct 2025 03:58:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1760007515; x=1760612315; 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=MHX66Jd+3Yh++JPnWDFijz0g48Ucrj2eGMYxXoS5syE=; b=GGYtzls4U8ENxA+m7LIsTOEix+/zVGZ8NwSUMI/3n/gMM5nbBgsurEkyQK/4K84juh 1xPPkn6c3JrugQdJClHO7x+5NPu+BqUxone2jNPsVQy3h5sv9EQuzlO5EwzCq437gJWT 1Cx7OULYlEVUEio1GA290aso/gLVDkWXpBmxRLRGTE1lKxdex93dDNOLMoh+gdM6sjPh mMpOCg+HY1HHJh2nA2X5b+zjqKqEQy0qFS3knc1mkUv8RvN1HYFwcZaJQQQ9IlkNWTd0 w7UyVlQIT69Pd/AqCbqwatsJZS81cVlQuruyHWo0tV669VzSXYWmNxvfVD0nTUwWphmD bf3A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1760007515; x=1760612315; 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=MHX66Jd+3Yh++JPnWDFijz0g48Ucrj2eGMYxXoS5syE=; b=lGg5m0nadc31Dd6ef9DQCIpMQ/6IU27aEZtTp4x5tyosi/1w9VXbzYpg4QeDKwxqpz qsF/qn+LU9q2zvGp08fJbGvyzA2vOC1iI4AeNxHT3MOfL65yngIOPGSgu2+77j6hevk5 KYJislsl5Hd2u8MfJ3eKi7b5jOdFiKgXSJS0yaKVG77LQFNbSTWounxS1jDSKQW9Vl6H TCWYs+Ku0o+7RXfaMvdSn4rg07thGPsyXIxFE8aWm4AFG9k5SglTbKoe8e3d8FJpa8Xk kiyc2Q0bPvKazvfU3wTmbW9sHddE2UXEvzG1Psd/It0AhgI//YsEt2zS6ZnLX6bU7M/z O6Xw== X-Forwarded-Encrypted: i=1; AJvYcCV5FxYllyCf+Lw6rMM4CbVFLywotQvuKbXOZj08T80FUww5K5Rakd2PknywYFLLhPA2Jsd+rkawUitywc0=@vger.kernel.org X-Gm-Message-State: AOJu0YzJUvhMr2Hkpnb2uY41ufNj4h/OoMBMYCUNkUmwDraf1zKx0xMV k8GfKHRqLSf+g1dElIbNHORkh9FsQm5buSCL3CAlE1KH8rFtZGXv3XPZ4Hne/koKysg= X-Gm-Gg: ASbGncsHKJ2Nj1If1xh0a3T3ejpCggRfbD2WXfh/TSj3H9U4FkIAPRxjogmf+V8FlMS c2eY8//Xung/vholV5j06+j+IrYQ2PCvcKPtFSTVqqyzZUhPkR0Tgim5w70cFRmiNasIQd/NDCJ EHkSGWLBldUlURixVephyGCycf7Sk4UXXvIvlNLZliy47fDpRaZ9CKW9+sY0T1PZi6yTSpvLFsP C1elE1FONeZ01fPCt0m1rNKEdQIXNsoYCGG3GJOuao/mhMkpw5kRDGZE5IqemXPb6GkzNI8FNcs 38esvHoVMXmM5095bbYCTYk+Z6NK7d9hM5b6t2vPdOqVRaOVUaSllUeuBT4xtkW0QwdaYTHPl9j vstGEBiomOAcQUm62k1Rcj/rKdBRm6i/RervTmI8FgWjP2qp0XEb28NaMiyFR X-Google-Smtp-Source: AGHT+IGsqw0uykPtpgLyH7gkilPZ9Rm/6qpf7Cg6vBU/3gJc9DluDeLS8WzKHz68boHMLssba8B2eQ== X-Received: by 2002:a17:90b:1d85:b0:32e:749d:fcb7 with SMTP id 98e67ed59e1d1-33b51168e4amr8734225a91.13.1760007515308; Thu, 09 Oct 2025 03:58:35 -0700 (PDT) Received: from localhost ([45.142.165.62]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-33b5293f4dcsm2568515a91.1.2025.10.09.03.58.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 09 Oct 2025 03:58: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 v7 22/23] docs: add KStackWatch document Date: Thu, 9 Oct 2025 18:55:58 +0800 Message-ID: <20251009105650.168917-23-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251009105650.168917-1-wangjinchao600@gmail.com> References: <20251009105650.168917-1-wangjinchao600@gmail.com> Precedence: bulk X-Mailing-List: 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 Tested-by: Randy Dunlap --- 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 4b8425e348ab..272ae9b76863 100644 --- a/Documentation/dev-tools/index.rst +++ b/Documentation/dev-tools/index.rst @@ -32,6 +32,7 @@ Documentation/process/debugging/index.rst lkmm/index 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 Wed Dec 17 12:35:43 2025 Received: from mail-pf1-f170.google.com (mail-pf1-f170.google.com [209.85.210.170]) (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 78CDD2EC08A for ; Thu, 9 Oct 2025 10:58:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760007522; cv=none; b=RH1zxherWvEzh5h/ebNPUlGhI6VbfVbqQKJ/Rd/sTzbrQ/e//dc0VSNACTtt9Fxgi3FlWgkti7u3HrZuHytGhgf7eanhLdeX+DouRMxMC3/f6XX4LSxKoi6+KNUzzSVr60L5grHYXvwMnISW3C/Go5qXbXtk87JZ0BzUQI2a8yE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760007522; c=relaxed/simple; bh=JE2O3gXCPzxmYnUAKlXgnSjWi6sqfl5NW64CDq3b/SU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=TW+z2y/OPSnUaFhC1ldByOoQZ8En7meJMpAOIPXaiiUo2KeiYIAsHSwstK3KNA+D8SKupsURYEdiZxuOXS2E+LNnLtslqqyyLegUB4YfUWriYELy9GG7XoA50QUNBZ6kyXHBuyQHcLkPq4KBLYbIrUf2pSa392go3du1onKRD04= 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=neiksZ1z; arc=none smtp.client-ip=209.85.210.170 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="neiksZ1z" Received: by mail-pf1-f170.google.com with SMTP id d2e1a72fcca58-794f11334adso721934b3a.3 for ; Thu, 09 Oct 2025 03:58:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1760007520; x=1760612320; 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=0ApAR8xSadwKhwismNq+uPz91ksCPHZtzxjh6qDdbHI=; b=neiksZ1zocphckHCNdcqvCB0SEeovXjopGI6pfpT024hB9TvNjLbNBW2fKJWGPduwr GiSupT6G/yLKjBEtqqAeENNbRPdgnNYMqthN122C5+pJxCOkOQWV61nbV4w1No4FRyYT 9g7DxBp3MRACp4vLb8XCW/2HHHgm5bx23ER9ozH7ZIeGtwfRIqwfncfD6BJPQ5NyKi1E Dzh9XGRvbkafQcDpkHjTfZE9vZOulFBQ/n2M24QNnDblwnATtnrubC6H9rY+1HNqoS+l PoUlGHQwpEkwR/1UpJLxl8LX14t+gP/LvsFdcPZctWanuRItuk1buoqPc1yuKN9qKZtL 6DAg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1760007520; x=1760612320; 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=0ApAR8xSadwKhwismNq+uPz91ksCPHZtzxjh6qDdbHI=; b=DXdyGrnWX6abez0GdTARdnidyDWXEK+fT0luL0iPZRCFK+I0ybhJTKfbaOr/Cdq4La eP10pRy/1l0ct3ON+zcU8D7BCxmTZNLGQgncWn6VJ9/9IZJJqYE8C2iQjaH+r13H5xYY piWaOeONozIvP8wQYqZFBmXDNFZUbZwNCpfi9kDdJShB9MDjmDluygxCdhWaelQc1JZm OVWi8QkRrDrj7DUyH3fkxgv57xATzsKCjOW959I7vX7g8U43guGljEeaCLZxwhXNeXET hCQiJj5BpwVuzEiuWBsLRrKBl1agPINPEHrJNpoBvCSKqNU429jsFkL24elC4BOCfBHj Hpuw== X-Forwarded-Encrypted: i=1; AJvYcCXKeJc4xJgvgQuDoiKUZLM0dY2RoaxCDEW/wXGgpKHuFT8q3lhaQZnvt/i7Cp4ourX+7Ecv+pK7kgqhgIY=@vger.kernel.org X-Gm-Message-State: AOJu0Yw6Fh71m3AtvIosFg/RfQLgqE+qc4IsgYUfEhAAPqiP4jRvVznz 6qoxts1XD8TASbDceR3HXx7EBzrIqY+LmQi0J9tLMt1dAqQ6MvtCEBl2 X-Gm-Gg: ASbGncu76ESGX7yzmDfDdWk2rmIC8GbrwqX9YWPEYUwMRleJSggT3qIGhrQ+KWTBSxR OOTn+Q/j7VPKxuZgFVcVD5r3mQAskj36rvgQ6xt507qvbxlgmpxlp2XBfUEfNaq32gxeUTWJUhL 0hg333yqWVkoe0VoXCJ8Tz3FpcAZ2yHJT6S8HcXMVZhYlhSa93Ke2xiWJsS4WEPo//GycA3XDHt I6GsYNF4IgNV78auSdSNl0U93KiQoYR/JqzaowPe+dT9OIspQfioGJ6W0zVMh3NJ+rnEDKDjaOY p9ty+/kRRw3QekLpEivJVSskVlJVY8T1oFzNyViZYnSnvpXhLwDiuhhfWYnIMMslIwPP17c5oQ3 VEb/rKf7sz9cqMZxoEgDDDNlQBb5tNfMkt+ecQXKLp4+00kS+qaVg/n72+Hh7Ln3aGb2765U= X-Google-Smtp-Source: AGHT+IFNGlIpEHO7TMNSv14SEeeL37qmV4fa31y9HfqA5Z8RmIIJBkgU1nSNu4enoYA+m8tb63ySAw== X-Received: by 2002:a05:6a21:6d99:b0:262:1ae0:1994 with SMTP id adf61e73a8af0-32da845e6c6mr9710336637.42.1760007519707; Thu, 09 Oct 2025 03:58:39 -0700 (PDT) Received: from localhost ([45.142.165.62]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-b6099d4d324sm21591393a12.27.2025.10.09.03.58.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 09 Oct 2025 03:58:39 -0700 (PDT) From: Jinchao Wang To: Andrew Morton , Masami Hiramatsu , Peter Zijlstra , Mike Rapoport , Alexander Potapenko , Randy Dunlap , Marco Elver , Jonathan Corbet , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Juri Lelli , Vincent Guittot , Dietmar Eggemann , Steven Rostedt , Ben Segall , Mel Gorman , Valentin Schneider , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , "Liang, Kan" , David Hildenbrand , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Suren Baghdasaryan , Michal Hocko , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt , Kees Cook , Alice Ryhl , Sami Tolvanen , Miguel Ojeda , Masahiro Yamada , Rong Xu , Naveen N Rao , David Kaplan , Andrii Nakryiko , Jinjie Ruan , Nam Cao , workflows@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, linux-mm@kvack.org, llvm@lists.linux.dev, Andrey Ryabinin , Andrey Konovalov , Dmitry Vyukov , Vincenzo Frascino , kasan-dev@googlegroups.com, "David S. Miller" , Mathieu Desnoyers , linux-trace-kernel@vger.kernel.org Cc: Jinchao Wang Subject: [PATCH v7 23/23] MAINTAINERS: add entry for KStackWatch Date: Thu, 9 Oct 2025 18:55:59 +0800 Message-ID: <20251009105650.168917-24-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251009105650.168917-1-wangjinchao600@gmail.com> References: <20251009105650.168917-1-wangjinchao600@gmail.com> Precedence: bulk X-Mailing-List: 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 3a27901781c2..d5e3b984e709 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -13596,6 +13596,14 @@ F: Documentation/filesystems/smb/ksmbd.rst F: fs/smb/common/ F: fs/smb/server/ =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 UNIT TESTING FRAMEWORK (KUnit) M: Brendan Higgins M: David Gow --=20 2.43.0