From nobody Thu Oct 2 19:01:00 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 BE1662E1C7B for ; Fri, 12 Sep 2025 10:12:03 +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=1757671925; cv=none; b=QsM4G90zKtNid6MprpK4FDYIygX8P/53wXOqm0OIQF5buRAXUv5pMDAirrQrT+akgfPUGibe4MwMgzvNuK5nm9kN18dWb27QRFDvAQvIDQuNBl8dE48g697I0KbeU6/mv/Z762LdfbxIv57SoDkK3jdyuOERFOFfDuTSjVhc2HA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757671925; c=relaxed/simple; bh=mvbQhJ9iNpy/VCsIq7tEZOr138Lj3Ag2m3NYvU9haY4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=oK8eKOjn202kfVxbuRYsavwpWNTtS6wzA0L4FaJknPcMCJhwvSkO+4gJo9mLfaWZLnMHbb9Nv6EvPz9WEn9dlqZJmN7Y3ZGX6834pAgNmH7qJbH3o/e+CrmUZHpxZibLhc35oQWdtQzeR4EjvLBKW08C8j1/om/C2msUsEp3o4k= 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=lG60eddr; 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="lG60eddr" Received: by mail-pj1-f50.google.com with SMTP id 98e67ed59e1d1-32ddfe3c8ccso1561227a91.3 for ; Fri, 12 Sep 2025 03:12:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1757671923; x=1758276723; 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=MiJ4BKoAQXxhATSlWNuzoAaMk7tQVn4VoD83Z8R1fnY=; b=lG60eddrwFZX4Le6zYQCDPJTpdh7Gh7lO2bopIv5m2KRP3timIP3n1h2gcj89YAPKf ixc2NfwsaMbRjV2PapOlFolM1OfSybsxAtUf83VgWJNVFSQF847kvuV4eo+S0caTRgIp El9PVSDPdYZoYyvqdYUUORmJSlcldyARPgv4/eq+IWIA3cHE9mqTdDx5z6l33bslwLQV ca/35VSxu0s973ZwV2NfyLjrfafWfXOF2rHysW8233BI/xSlODl9g+YdZNMAbSM2idxY nMj3Dp3zp/myFsk6suQQuf74dTsC/pV6r8vPsl6Vfq+TZiQto1/gWwlsVzqSmm1S33ct Cw4Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1757671923; x=1758276723; 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=MiJ4BKoAQXxhATSlWNuzoAaMk7tQVn4VoD83Z8R1fnY=; b=CudqtR0A3FjJkfGoz5okGKgxf3sFzRvhER7AInReuZu78jQgrBByf5ctRlV+7SCjwh 2EJS0sVqgTgFvba7VZtnmY0eiGlBor3Bm74B7HXRt/X66ke5hyCnZwL3n0CZehIy3HT4 cMYMB6US5+ftyptE5HafpXQ9CFamZOxw/Etvdr37Jpgyuj3PEk4Rte6N2QHHEE4yqnjx 3xPZBurU1TaJyJ6m+jG5f1hK9/Cnu9MOhfDJ1X+FtPScdRiDR3cPmWQv5gVUrtxz/Zwe tRpetEvcegN+b+iYhIOFnVFwXCqD7ZVPIhW0byvxj8T30vpIoxo9EJoP9LP1QXIbmirG 7MjQ== X-Forwarded-Encrypted: i=1; AJvYcCU7ZjAmYdxA1VkRboa19Or5dCaUTu4VluNyEEEGQZagK7npkO7T1nBXhKvpKg2wNnabAQbG4FTFVQPKXd4=@vger.kernel.org X-Gm-Message-State: AOJu0YzKPIAxCNuPk9I/FXh3mMkLXfB4eGlBsOJ+l8gL8jFTseZPkjcY L7oHyh+ZBTgNjLc+ZnFbPQu7NsVInIFp8jrm4NQrlJQZwuvq2ZxEW+RV X-Gm-Gg: ASbGnct+TDMPWqzPLdZPOOD6NPTUM7qHSfEftnhMf8UZusBDKS2FevHw6533V1OPgL2 xHwMRxAqyxy/nSsgpAn6q0Bxh8PCPkHqGD9mlICP6C8DgPKVcKrQpspCT+UvleTWcw7Y6m7ietZ ySDRiQ5e6UYqidHlxhbakFwdBCL6KCp+2jyuEHqkEi5jnekBZH+SV44pXHIpLFj+6jMvQ6XxDpb PL2ua+dCWcVC7bNwdBonjQQU7PYVswjIFlHvDHJy74kfx++xDY5pPrZyf3hIptxvUO2IsvFqyms NK3I/10lZv5GGTmAkmk2jvdNsJKImpuO/6jWjSDKNqZ3sW1+irixwpS2CBk+NtCbpEtw6jLqSJS iKrZqk7QFGb55uO5ryMamA9gcFUMntb3JBUQHHe8smJq7JKtBF1HUhfGDIyH7 X-Google-Smtp-Source: AGHT+IFVVaIhwhf/XCrQlu3eHp9PRsMkwMoA7wjEYyYhHpp+oe5/jMTyKiMg3Xyx5H7ewbGZG5mSrw== X-Received: by 2002:a17:90a:da83:b0:32b:96fa:5f46 with SMTP id 98e67ed59e1d1-32de4e7488amr2457300a91.5.1757671922786; Fri, 12 Sep 2025 03:12:02 -0700 (PDT) Received: from localhost ([185.49.34.62]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-32df607d504sm76776a91.11.2025.09.12.03.12.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 12 Sep 2025 03:12:02 -0700 (PDT) From: Jinchao Wang To: Andrew Morton , Masami Hiramatsu , Peter Zijlstra , Mike Rapoport , Alexander Potapenko , 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 v4 01/21] x86/hw_breakpoint: Unify breakpoint install/uninstall Date: Fri, 12 Sep 2025 18:11:11 +0800 Message-ID: <20250912101145.465708-2-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250912101145.465708-1-wangjinchao600@gmail.com> References: <20250912101145.465708-1-wangjinchao600@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Consolidate breakpoint management to reduce code duplication. The diffstat was misleading, so the stripped code size is compared instead. After refactoring, it is reduced from 11976 bytes to 11448 bytes on my x86_64 system built with clang. This also makes it easier to introduce arch_reinstall_hw_breakpoint(). In addition, including linux/types.h to fix a missing build dependency. Signed-off-by: Jinchao Wang Reviewed-by: Masami Hiramatsu (Google) --- arch/x86/include/asm/hw_breakpoint.h | 6 ++ arch/x86/kernel/hw_breakpoint.c | 141 +++++++++++++++------------ 2 files changed, 84 insertions(+), 63 deletions(-) diff --git a/arch/x86/include/asm/hw_breakpoint.h b/arch/x86/include/asm/hw= _breakpoint.h index 0bc931cd0698..aa6adac6c3a2 100644 --- a/arch/x86/include/asm/hw_breakpoint.h +++ b/arch/x86/include/asm/hw_breakpoint.h @@ -5,6 +5,7 @@ #include =20 #define __ARCH_HW_BREAKPOINT_H +#include =20 /* * The name should probably be something dealt in @@ -18,6 +19,11 @@ struct arch_hw_breakpoint { u8 type; }; =20 +enum bp_slot_action { + BP_SLOT_ACTION_INSTALL, + BP_SLOT_ACTION_UNINSTALL, +}; + #include #include #include diff --git a/arch/x86/kernel/hw_breakpoint.c b/arch/x86/kernel/hw_breakpoin= t.c index b01644c949b2..3658ace4bd8d 100644 --- a/arch/x86/kernel/hw_breakpoint.c +++ b/arch/x86/kernel/hw_breakpoint.c @@ -48,7 +48,6 @@ static DEFINE_PER_CPU(unsigned long, cpu_debugreg[HBP_NUM= ]); */ static DEFINE_PER_CPU(struct perf_event *, bp_per_reg[HBP_NUM]); =20 - static inline unsigned long __encode_dr7(int drnum, unsigned int len, unsigned int type) { @@ -85,96 +84,112 @@ int decode_dr7(unsigned long dr7, int bpnum, unsigned = *len, unsigned *type) } =20 /* - * Install a perf counter breakpoint. - * - * We seek a free debug address register and use it for this - * breakpoint. Eventually we enable it in the debug control register. - * - * Atomic: we hold the counter->ctx->lock and we only handle variables - * and registers local to this cpu. + * We seek a slot and change it or keep it based on the action. + * Returns slot number on success, negative error on failure. + * Must be called with IRQs disabled. */ -int arch_install_hw_breakpoint(struct perf_event *bp) +static int manage_bp_slot(struct perf_event *bp, enum bp_slot_action actio= n) { - struct arch_hw_breakpoint *info =3D counter_arch_bp(bp); - unsigned long *dr7; - int i; - - lockdep_assert_irqs_disabled(); + struct perf_event *old_bp; + struct perf_event *new_bp; + int slot; + + switch (action) { + case BP_SLOT_ACTION_INSTALL: + old_bp =3D NULL; + new_bp =3D bp; + break; + case BP_SLOT_ACTION_UNINSTALL: + old_bp =3D bp; + new_bp =3D NULL; + break; + default: + return -EINVAL; + } =20 - for (i =3D 0; i < HBP_NUM; i++) { - struct perf_event **slot =3D this_cpu_ptr(&bp_per_reg[i]); + for (slot =3D 0; slot < HBP_NUM; slot++) { + struct perf_event **curr =3D this_cpu_ptr(&bp_per_reg[slot]); =20 - if (!*slot) { - *slot =3D bp; - break; + if (*curr =3D=3D old_bp) { + *curr =3D new_bp; + return slot; } } =20 - if (WARN_ONCE(i =3D=3D HBP_NUM, "Can't find any breakpoint slot")) - return -EBUSY; + if (old_bp) { + WARN_ONCE(1, "Can't find matching breakpoint slot"); + return -EINVAL; + } + + WARN_ONCE(1, "No free breakpoint slots"); + return -EBUSY; +} + +static void setup_hwbp(struct arch_hw_breakpoint *info, int slot, bool ena= ble) +{ + unsigned long dr7; =20 - set_debugreg(info->address, i); - __this_cpu_write(cpu_debugreg[i], info->address); + set_debugreg(info->address, slot); + __this_cpu_write(cpu_debugreg[slot], info->address); =20 - dr7 =3D this_cpu_ptr(&cpu_dr7); - *dr7 |=3D encode_dr7(i, info->len, info->type); + dr7 =3D this_cpu_read(cpu_dr7); + if (enable) + dr7 |=3D encode_dr7(slot, info->len, info->type); + else + dr7 &=3D ~__encode_dr7(slot, info->len, info->type); =20 /* - * Ensure we first write cpu_dr7 before we set the DR7 register. - * This ensures an NMI never see cpu_dr7 0 when DR7 is not. + * Enabling: + * Ensure we first write cpu_dr7 before we set the DR7 register. + * This ensures an NMI never see cpu_dr7 0 when DR7 is not. */ + if (enable) + this_cpu_write(cpu_dr7, dr7); + barrier(); =20 - set_debugreg(*dr7, 7); + set_debugreg(dr7, 7); + if (info->mask) - amd_set_dr_addr_mask(info->mask, i); + amd_set_dr_addr_mask(enable ? info->mask : 0, slot); =20 - return 0; + /* + * Disabling: + * Ensure the write to cpu_dr7 is after we've set the DR7 register. + * This ensures an NMI never see cpu_dr7 0 when DR7 is not. + */ + if (!enable) + this_cpu_write(cpu_dr7, dr7); } =20 /* - * Uninstall the breakpoint contained in the given counter. - * - * First we search the debug address register it uses and then we disable - * it. - * - * Atomic: we hold the counter->ctx->lock and we only handle variables - * and registers local to this cpu. + * find suitable breakpoint slot and set it up based on the action */ -void arch_uninstall_hw_breakpoint(struct perf_event *bp) +static int arch_manage_bp(struct perf_event *bp, enum bp_slot_action actio= n) { - struct arch_hw_breakpoint *info =3D counter_arch_bp(bp); - unsigned long dr7; - int i; + struct arch_hw_breakpoint *info; + int slot; =20 lockdep_assert_irqs_disabled(); =20 - for (i =3D 0; i < HBP_NUM; i++) { - struct perf_event **slot =3D this_cpu_ptr(&bp_per_reg[i]); - - if (*slot =3D=3D bp) { - *slot =3D NULL; - break; - } - } - - if (WARN_ONCE(i =3D=3D HBP_NUM, "Can't find any breakpoint slot")) - return; + slot =3D manage_bp_slot(bp, action); + if (slot < 0) + return slot; =20 - dr7 =3D this_cpu_read(cpu_dr7); - dr7 &=3D ~__encode_dr7(i, info->len, info->type); + info =3D counter_arch_bp(bp); + setup_hwbp(info, slot, action !=3D BP_SLOT_ACTION_UNINSTALL); =20 - set_debugreg(dr7, 7); - if (info->mask) - amd_set_dr_addr_mask(0, i); + return 0; +} =20 - /* - * Ensure the write to cpu_dr7 is after we've set the DR7 register. - * This ensures an NMI never see cpu_dr7 0 when DR7 is not. - */ - barrier(); +int arch_install_hw_breakpoint(struct perf_event *bp) +{ + return arch_manage_bp(bp, BP_SLOT_ACTION_INSTALL); +} =20 - this_cpu_write(cpu_dr7, dr7); +void arch_uninstall_hw_breakpoint(struct perf_event *bp) +{ + arch_manage_bp(bp, BP_SLOT_ACTION_UNINSTALL); } =20 static int arch_bp_generic_len(int x86_len) --=20 2.43.0 From nobody Thu Oct 2 19:01:00 2025 Received: from mail-pl1-f173.google.com (mail-pl1-f173.google.com [209.85.214.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 3EE672E3387 for ; Fri, 12 Sep 2025 10:12:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757671930; cv=none; b=tSTVa5DA9/EoFitPAz2YxQIwVkfl1zNR5yCGJLHtX0VwV6zXmgjSlELe0OUzLR8Dj417Pt176F0fizMELMOGTu3Sg7fhQ/6ON+L70qlvpNOSuDs+UpyZTaAnGr3OVbXiMByYlJHQp9FuhbFYzth+Ctvg6PzXaDleTmkVGKh8UMo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757671930; c=relaxed/simple; bh=zbmepUv5MhWdm0b+QCOGN6KW75Q1eP0IAhJLHBVpxMk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Tjf3fwidzQgAjR+YIO0yCrgM2JW+W8i6E9BT4SdjgjEX9z4Fd8k1/scwIsEIMGMS+Yg74ELrqJ2YoPWZibvALUqIvKwpLgzaQzcyeTDE4kYwIuL0BeePqCD56BhuZNESiUGkvtgsgj3OlE50K4UB7pXaua2OMWiSov8WZotYu+Q= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=YakZc8qj; arc=none smtp.client-ip=209.85.214.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="YakZc8qj" Received: by mail-pl1-f173.google.com with SMTP id d9443c01a7336-24eb713b2dfso14766775ad.0 for ; Fri, 12 Sep 2025 03:12:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1757671928; x=1758276728; 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=E07gf3+EHiFZ+TUqDdqlrvhEU6rgl4o/YSp2RBqLkNw=; b=YakZc8qjiI5W3v1TlAAhn8+1Plm5tgFZOiqF3oCD/+e/EGnQTFLw29HcsI5+H11mB0 0IcUx80Rnu8LmfXuXJTuQxJzdMekYny+xacwcwnNQt3UMzvplDxo9/9ZFoGrSdqw5kq2 UmShVTk9Dc8bN7CpYpd4DtjNiS5fgrCequmUBYd1kkyYaucetD3vMqmXuJCYA1A2UcL3 VNsVZuuGEgTPDWZaCstIlbFmkdP3dtxRhV7qPcQzsmJ7TJGhTK4FOaWW5PUqNeHhmeHh 5nBKAzR7In2AxXSQKe5GTf9Y8B5FvrlmgNU0arxWMzRgfzPQurGDY7sXjWg+r4HYnebP EAuA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1757671928; x=1758276728; 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=E07gf3+EHiFZ+TUqDdqlrvhEU6rgl4o/YSp2RBqLkNw=; b=JaA0yBQxi3fTFPIjel2qQlUUoM875LPRibtegw/URlJJqZ/Kmf+bPXuCqAX03A36t2 RzB4OQYnQcfWAhXf3y4XviggbcDoIg+kUDGnGWZsisxVJV/JyOoc7ujrSy3ooJEm8LS7 ISOzrvaMmCxKIifYwjrh7WequJxv/SRc6w5tG7xFoS0JbySmQ/K6XT6mWg5oVu6bc7b1 /6GL4123s+lFiA7UgKq86TQTwh8vwNc9i+NfeSvKxBn8376029b69kf4a2c/0nuDh+gf x52sZWRxsBhVMdoWYaIc9Y0dZZZ8CRMNK50J3zIs2zBswQLvekMxCT+5Y+jj+YcqWaIw MQFg== X-Forwarded-Encrypted: i=1; AJvYcCXs8gfKJQgEnZwpU0R6kgiJKvxR11o2PZrkX/AgsXKJtyCSRZlTGiRVuJLVxjhyIjKZEKRbdv8BnNJ/jXU=@vger.kernel.org X-Gm-Message-State: AOJu0YzIEqVzAm3zYkYHZU6kYQbhILbuqdCin2g2xE1YvrXUZxrK6/P9 HkEuN6gte7ldfekHxnX1KVSZJk1UpagXLQtnZfpDESSQ+0fD2gBjzGxD X-Gm-Gg: ASbGncu4xFTCvSeLs/j5+DE1cSg/dEATbClX5GM9F9Xb00b+tD9iNl6FhvyNCN2RO1n Se0O9LH+DZ93X7plzcDVrcIoHScQMRHjkfTx12XewMfSaKvWV5eTR4isvkhoFKjfsGCbJQoQBVr YW1xSUYDxgOPTW3rdFgZPOvX+2h3vlKTHCsz094fJfW1ZpDB+q5oQYFdXmz6LRYynF+lk54I0Qd yW85I5ls65N3G5LEsIoIQMKJz95PxOOXf90cXbcVPdCJFm6AYgj55cCH7X6Qx1Unp4gWHw/4nts MvQw5Apcobc3LvZeSsnTQR1ygf7pH/W8oLOSK2S1yGxJDFnTuxYQe7AJz47Xt/bEG5niqxG9fJa 1lnLRlkCrsds+bl3+b1QCLNFrZJKJiyQ1dVyeoaM= X-Google-Smtp-Source: AGHT+IGs/ObotIuyczkZdqAXxWrWykSxCXKo0dzFjl5HuAQGOzaywRYcIXz6zrznumJ6ZW1Xtjh7JA== X-Received: by 2002:a17:903:32c4:b0:258:f033:3ff1 with SMTP id d9443c01a7336-25d242f314bmr32759845ad.12.1757671928125; Fri, 12 Sep 2025 03:12:08 -0700 (PDT) Received: from localhost ([185.49.34.62]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-25c37293fd4sm44061135ad.38.2025.09.12.03.12.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 12 Sep 2025 03:12:07 -0700 (PDT) From: Jinchao Wang To: Andrew Morton , Masami Hiramatsu , Peter Zijlstra , Mike Rapoport , Alexander Potapenko , 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 v4 02/21] x86/hw_breakpoint: Add arch_reinstall_hw_breakpoint Date: Fri, 12 Sep 2025 18:11:12 +0800 Message-ID: <20250912101145.465708-3-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250912101145.465708-1-wangjinchao600@gmail.com> References: <20250912101145.465708-1-wangjinchao600@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The new arch_reinstall_hw_breakpoint() function can be used in an atomic context, unlike the more expensive free and re-allocation path. This allows callers to efficiently re-establish an existing breakpoint. Signed-off-by: Jinchao Wang Reviewed-by: Masami Hiramatsu (Google) --- arch/x86/include/asm/hw_breakpoint.h | 2 ++ arch/x86/kernel/hw_breakpoint.c | 9 +++++++++ 2 files changed, 11 insertions(+) diff --git a/arch/x86/include/asm/hw_breakpoint.h b/arch/x86/include/asm/hw= _breakpoint.h index aa6adac6c3a2..c22cc4e87fc5 100644 --- a/arch/x86/include/asm/hw_breakpoint.h +++ b/arch/x86/include/asm/hw_breakpoint.h @@ -21,6 +21,7 @@ struct arch_hw_breakpoint { =20 enum bp_slot_action { BP_SLOT_ACTION_INSTALL, + BP_SLOT_ACTION_REINSTALL, BP_SLOT_ACTION_UNINSTALL, }; =20 @@ -65,6 +66,7 @@ extern int hw_breakpoint_exceptions_notify(struct notifie= r_block *unused, =20 =20 int arch_install_hw_breakpoint(struct perf_event *bp); +int arch_reinstall_hw_breakpoint(struct perf_event *bp); void arch_uninstall_hw_breakpoint(struct perf_event *bp); void hw_breakpoint_pmu_read(struct perf_event *bp); void hw_breakpoint_pmu_unthrottle(struct perf_event *bp); diff --git a/arch/x86/kernel/hw_breakpoint.c b/arch/x86/kernel/hw_breakpoin= t.c index 3658ace4bd8d..29c9369264d4 100644 --- a/arch/x86/kernel/hw_breakpoint.c +++ b/arch/x86/kernel/hw_breakpoint.c @@ -99,6 +99,10 @@ static int manage_bp_slot(struct perf_event *bp, enum bp= _slot_action action) old_bp =3D NULL; new_bp =3D bp; break; + case BP_SLOT_ACTION_REINSTALL: + old_bp =3D bp; + new_bp =3D bp; + break; case BP_SLOT_ACTION_UNINSTALL: old_bp =3D bp; new_bp =3D NULL; @@ -187,6 +191,11 @@ int arch_install_hw_breakpoint(struct perf_event *bp) return arch_manage_bp(bp, BP_SLOT_ACTION_INSTALL); } =20 +int arch_reinstall_hw_breakpoint(struct perf_event *bp) +{ + return arch_manage_bp(bp, BP_SLOT_ACTION_REINSTALL); +} + void arch_uninstall_hw_breakpoint(struct perf_event *bp) { arch_manage_bp(bp, BP_SLOT_ACTION_UNINSTALL); --=20 2.43.0 From nobody Thu Oct 2 19:01:00 2025 Received: from mail-pl1-f179.google.com (mail-pl1-f179.google.com [209.85.214.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 DFE422E0B6D for ; Fri, 12 Sep 2025 10:12:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757671935; cv=none; b=O0xFPQZMspfzq5blRJfE5bLtfyKVC3r1OZHfE2YqjHQPOZ7Gyd2MzJtMQjAJaMDz8TMem0mDqEispNR0BlacR72aacz2Bm5BH8SmK+ireCyvwh2DwdlR45VbnViLdXXJ+1ZACg4O1SYQg0vLUlDWFy12kH5ollNecqzv1ix6VDE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757671935; c=relaxed/simple; bh=sULEjvL2pp1aXQje+Pg+BRBhTFd7HU/YOc2Kd4lZUiw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=OHwapX8GJFlsiL1WPA+1wVxwUQPFF/60qHxQZX5uHRdBvmZ4q13tTzSLNN/HPeh3sSHjJ/R2i4ueTuKYUMnu1/sgJm7bQM/OK+XvbaS7zG6w5T2MSEhYYvndPvmjWtNv23WyNHeK6PdPelphCEmHbkyAprbkNI4KQDiQgMsJCiI= 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=k5bMFO1G; arc=none smtp.client-ip=209.85.214.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="k5bMFO1G" Received: by mail-pl1-f179.google.com with SMTP id d9443c01a7336-24c784130e6so19679675ad.3 for ; Fri, 12 Sep 2025 03:12:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1757671933; x=1758276733; 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=MAwazreHf5k9GgDRW54pld4eDw+UAZx9M09yt/sAPVs=; b=k5bMFO1GSjf5QIxD8S2eqMkg0oRrt5mdIvTtrORTBbOgtyc26KVNR0RErjozCFfg+I PMdvXJVFQ29Qcfu+FDe5NI/k7ExnsudLXrO0AvVbTgoehCOwykQO6NngM03TsmiT6/a2 9gnFk2ENKSOk3BMsGQdmwqpdrKA2V/3V4VeQmPSjMp/DQVL/tRiV94waFEK9Akes/K3p Ta5Z30RNPL6z4xmQvEoLf+5nxJJRV6N4jV9u/NPDTu4Q5LWp92sYnC048UIRJAQg0mQI mPlFA8I7qtIEczixafmo/NZCaWMtBstWl1jLmaGJZBl/8DzwvpCmqjZSnski48K25Veq PuuA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1757671933; x=1758276733; 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=MAwazreHf5k9GgDRW54pld4eDw+UAZx9M09yt/sAPVs=; b=o2m8lhw8VLUZFia9kOKnx8S/2id+1dMfpbANsNF3hc3QnBTPKCfTzWNREGTGkmusO0 KIfqZnutCbVuqVkjccX6TBy3ABqJPyr9YWPn/uNFZrmUzKA/GJBJMxOSGrKN3LhwLROH C5FgraPLsvKq/+wA/udDKYgConclgDjLBfG7Wsq4tcVqdXwYj0b83/fAD5uiDs78rpFs zfNdw3P/tP8aavAS3yLffY5wih7q5Pko+i/Hiw9gZsKRcfqi6jG7Qq7XxLD5D/wtXwyf NKrJw0n3nz5GLGJje+K2eeo700B+NkPkOl5mnKlcL2H9Lyof51SNsxsGgfryXjrtePDm ezNg== X-Forwarded-Encrypted: i=1; AJvYcCVgH5RjnV1sEzxgxbtxODALTzV22kxO5tyR4M64VaIcXJdmqaooPqRRtQHDl2NSnwh2FUH9VA/C2lrJLwI=@vger.kernel.org X-Gm-Message-State: AOJu0Yy+JE1XCQDMomf3VvMyj7ZjXBcwybt7QgbAPpCD8dJf/4kjzTWG HGpFkrnxN8NIPjreHP2qeS3hVc0IGOYQA/XNQrL2EO6Fi1Eyg/Wuegau X-Gm-Gg: ASbGncuuz+mUUStftZLzw/Jh09uDI8LIIBzfVQc+6NrcqfXtRIGagmstbA3SE/Q+I8r X6HxOMprEJshMqYz2Z9CZumRvDOk3SEKdE3ATV8sQTXHokbjHHeBejaKHxAocU7t8MXkfF5SFjM 2cD/VuLCC053zPKo8Xqz0cI2xtRYsOQReNMza3t9By9UOyhmatYqtP8EyYoHiX1SJ9ddWW9IyJZ WGKQuZRXppL/OiDYdLwB+tmEVDzWG5OkKyi7tEU20E+Brc5qA/G6hM9VUix9bAdeVaQx54ox0s6 JlN3X/CNZUt4VTl//BnpLUW0rj4gS9dsizw3e8Rp+FVGWW/XrVr1xp++Htdkc1dXlskvWXDWq1H 5toNpFUjsZsxk2PRlh2oETknyzFNYrmQXAY+QTPPTFXC/Uo+SIA== X-Google-Smtp-Source: AGHT+IE3riCCDjjOveSMsaG7I15WY9EHwk+eFKMgkgFo5ZyPShTClEykZoqvnQPNL3j1pPP9iEE3Tw== X-Received: by 2002:a17:903:41ca:b0:24c:e6a6:9e59 with SMTP id d9443c01a7336-25d245dd6f8mr31272915ad.6.1757671932903; Fri, 12 Sep 2025 03:12:12 -0700 (PDT) Received: from localhost ([185.49.34.62]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-25e8ed36759sm6102435ad.142.2025.09.12.03.12.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 12 Sep 2025 03:12:12 -0700 (PDT) From: Jinchao Wang To: Andrew Morton , Masami Hiramatsu , Peter Zijlstra , Mike Rapoport , Alexander Potapenko , 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 v4 03/21] HWBP: Add modify_wide_hw_breakpoint_local() API Date: Fri, 12 Sep 2025 18:11:13 +0800 Message-ID: <20250912101145.465708-4-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250912101145.465708-1-wangjinchao600@gmail.com> References: <20250912101145.465708-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 | 36 +++++++++++++++++++++++++++++++++++ 4 files changed, 53 insertions(+) diff --git a/arch/Kconfig b/arch/Kconfig index d1b4ffd6e085..e4787fc814df 100644 --- a/arch/Kconfig +++ b/arch/Kconfig @@ -418,6 +418,16 @@ config HAVE_MIXED_BREAKPOINTS_REGS Select this option if your arch implements breakpoints under the latter fashion. =20 +config HAVE_REINSTALL_HW_BREAKPOINT + bool + depends on HAVE_HW_BREAKPOINT + help + Depending on the arch implementation of hardware breakpoints, + some of them are able to update the breakpoint configuration + without release and reserve the hardware breakpoint register. + What configuration is able to update depends on hardware and + software implementation. + config HAVE_USER_RETURN_NOTIFIER bool =20 diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 58d890fe2100..49d4ce2af94c 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -247,6 +247,7 @@ config X86 select HAVE_FUNCTION_TRACER select HAVE_GCC_PLUGINS select HAVE_HW_BREAKPOINT + select HAVE_REINSTALL_HW_BREAKPOINT select HAVE_IOREMAP_PROT select HAVE_IRQ_EXIT_ON_IRQ_STACK if X86_64 select HAVE_IRQ_TIME_ACCOUNTING diff --git a/include/linux/hw_breakpoint.h b/include/linux/hw_breakpoint.h index db199d653dd1..ea373f2587f8 100644 --- a/include/linux/hw_breakpoint.h +++ b/include/linux/hw_breakpoint.h @@ -81,6 +81,9 @@ register_wide_hw_breakpoint(struct perf_event_attr *attr, perf_overflow_handler_t triggered, void *context); =20 +extern int modify_wide_hw_breakpoint_local(struct perf_event *bp, + struct perf_event_attr *attr); + extern int register_perf_hw_breakpoint(struct perf_event *bp); extern void unregister_hw_breakpoint(struct perf_event *bp); extern void unregister_wide_hw_breakpoint(struct perf_event * __percpu *cp= u_events); @@ -124,6 +127,9 @@ register_wide_hw_breakpoint(struct perf_event_attr *att= r, perf_overflow_handler_t triggered, void *context) { return NULL; } static inline int +modify_wide_hw_breakpoint_local(struct perf_event *bp, + struct perf_event_attr *attr) { return -ENOSYS; } +static inline int register_perf_hw_breakpoint(struct perf_event *bp) { return -ENOSYS; } static inline void unregister_hw_breakpoint(struct perf_event *bp) { } static inline void diff --git a/kernel/events/hw_breakpoint.c b/kernel/events/hw_breakpoint.c index 8ec2cb688903..ef9bab968b2c 100644 --- a/kernel/events/hw_breakpoint.c +++ b/kernel/events/hw_breakpoint.c @@ -887,6 +887,42 @@ 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 HWBP, just reuse the curr= ent + * slot on local CPU. So the users must update the other CPUs by themselve= s. + * Also, since this does not release/reserve the slot, this can not change= the + * type to incompatible type of the HWBP. + * Return err if attr is invalid or the cpu fails to update debug register + * for new @attr. + */ +#ifdef CONFIG_HAVE_REINSTALL_HW_BREAKPOINT +int modify_wide_hw_breakpoint_local(struct perf_event *bp, + struct perf_event_attr *attr) +{ + int ret; + + if (find_slot_idx(bp->attr.bp_type) !=3D find_slot_idx(attr->bp_type)) + return -EINVAL; + + ret =3D hw_breakpoint_arch_parse(bp, attr, counter_arch_bp(bp)); + if (ret) + return ret; + + return arch_reinstall_hw_breakpoint(bp); +} +#else +int modify_wide_hw_breakpoint_local(struct perf_event *bp, + struct perf_event_attr *attr) +{ + return -EOPNOTSUPP; +} +#endif +EXPORT_SYMBOL_GPL(modify_wide_hw_breakpoint_local); + /** * hw_breakpoint_is_used - check if breakpoints are currently used * --=20 2.43.0 From nobody Thu Oct 2 19:01:00 2025 Received: from mail-pg1-f176.google.com (mail-pg1-f176.google.com [209.85.215.176]) (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 9FA632E7160 for ; Fri, 12 Sep 2025 10:12:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757671940; cv=none; b=qLQfmW+NUVhSNaOoAbpzw0fmZwYfWmwK9xEIBNfWroEinE/8ZsEWvhTgx6iPGWwDrD7wRZsenDuq4n1ZNGt92z+O4+rdgAm4OZFSYbNsBfrsS7fIAgxsV7CHlxyPEji5vf+VgckgwYtZ42T61OYtrQbZHa8h+cA+CO4UXAkvfhE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757671940; c=relaxed/simple; bh=khEOYcdk4y5BMxDzooYo/fDYw+JbjlL9xknm74JC/ng=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=n5k0AzNiOHUMoKsAqkhr3hWzX+f1lJXzfiXAmDDlhzJGrhmsdhMZoWwVbRWS0T/fLBsDpRvHUmwEP3D4jD8zJ8JMOrich53tiPs2u8Mpo3CtwLhgGWZRSmUH9flWpuzV8MRxCFD0jrX/bj4wPO1Cyoaa++AaPycJmlMazMIiW98= 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=gvkgy2gb; arc=none smtp.client-ip=209.85.215.176 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="gvkgy2gb" Received: by mail-pg1-f176.google.com with SMTP id 41be03b00d2f7-b54b2428fafso263019a12.3 for ; Fri, 12 Sep 2025 03:12:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1757671938; x=1758276738; 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=vPBHXhel7rMyKaWRDIHRGBdLv/zGRcLPaVcgqECt6eI=; b=gvkgy2gbFNfRyTxFwuj5EtJ9DfcWKosDHF5vOLvnIdWRDKxh7ikZbX73qeu69hoW0M sAS+mY2Hv3f93lcO4dnbftRtjZZOhgRWw3iE08cV0rSVXpO6UIiFZi+1PNUo71x2xAxo 9BwWAk5oYTAdalMdqwyIonwMc5ZmccGvKqNcBVNzb0mLVCtBv0BloZ5zo/2LRb6Coy5Q he74p7dObKrqIB4pHz34daxmnv5agclTG9pZjhQ4bhuwA7QN3wCw1ZQ1+aaYJoEzXvsB 6LtjioEK1R6AbK37YbypbO4v9mD/LK2VveEDwPQPf4lrMyfc62+8oRq8fnhfrSXRCRNe RJqg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1757671938; x=1758276738; 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=vPBHXhel7rMyKaWRDIHRGBdLv/zGRcLPaVcgqECt6eI=; b=P3hluzRbJagZtJMTQY8+ztqfyDElq7bNNK5RZaCZ0qkSskZ0LyNbSG+ckTVUQlB55O 2/nu2li0LceWt3bvl4fMs0W8RDTFYEzNm3BYivT55hzhtB/L03n1y29rHZ2xFOXtSw6o ZTH5OC1F3SdNqgyhtkL0/jkjl1yiHFW0JbV9pAOA2zbUYOcR+JyTRcDZjquOsE/O4uJF QgEW1+FJOlIsYhEjQ85t6EvOlgzWUtzIf4n8QiO7/d5Bbsye7pmRxEWmIToU2lj8ITEm pVjVItxfwSaHEWAqm8mxyNodJtte1JK2uo5Pf9Gu1hH7oLWFyJfeTf8EjLIm2UkXGM+N 7+tQ== X-Forwarded-Encrypted: i=1; AJvYcCVVFvx5NJpNT08JVbITy8yd5iRTH4ANIKyW79MSx5sfL4PyhurhYTHVJZ/smEAsD5wcEjX1KlOnszXsD5A=@vger.kernel.org X-Gm-Message-State: AOJu0YyGHsCMK4w1aXDYrDu5uMaYfxUFA2OFZLGpsye++prDDjlW058D H+V4PkCnEZlpik5mGc3JIk4+YPZPQfPwHWGgtBQLoYmxszIpGDUdMBic X-Gm-Gg: ASbGncvQpzGIPyJaGxsOS3KtuSECd9FcotamH5odIvGDb8P5v1OOcaroH7DpOkBtaOU KbctzpIBGGt0jc9c2RSpJwjknfct9xpgWDoKGcrEsgrPHv3Lx4iDXnEjuklw0R4VQbpkea/VCWs njtlcdfP29dtVlpmZzdx2Pv1EFPn6jP7qLjGGJBwWkCfamzqheQWy2WX6hM2kByAqLrfjkcla97 AXWpOhU9dmgQR2NJo/G1y/SXLYUQ32BOWQ8x0QUGqhQcMTfYQFqk9ZMt49PVE4YEMvKCezuc5jY hc1VoJbyUlSVK1YKvvuXQgXxPjZqhQ3iNQeFvU0KVVVl0vDtE2MfeuuKUsLCTUCLjlmK+pnPEcX GXWYE4QGYwQ7cR6Vvt+Kin2WIjVp5KBir1jD8cKY= X-Google-Smtp-Source: AGHT+IF0a8WwW7rBxRhd3Sx4BYYreRthYgFLu+D24YzR2HNtnMsrUN51Z/p+oaiQ/+b9L1Xt/Owfnw== X-Received: by 2002:a17:902:f68b:b0:24e:7af7:111a with SMTP id d9443c01a7336-25d281077cdmr34352375ad.49.1757671937679; Fri, 12 Sep 2025 03:12:17 -0700 (PDT) Received: from localhost ([185.49.34.62]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-25c3b0219f9sm44620085ad.123.2025.09.12.03.12.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 12 Sep 2025 03:12:17 -0700 (PDT) From: Jinchao Wang To: Andrew Morton , Masami Hiramatsu , Peter Zijlstra , Mike Rapoport , Alexander Potapenko , 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 v4 04/21] mm/ksw: add build system support Date: Fri, 12 Sep 2025 18:11:14 +0800 Message-ID: <20250912101145.465708-5-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250912101145.465708-1-wangjinchao600@gmail.com> References: <20250912101145.465708-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 | 11 +++++++++++ mm/Makefile | 1 + mm/kstackwatch/Makefile | 2 ++ mm/kstackwatch/kernel.c | 22 ++++++++++++++++++++++ mm/kstackwatch/kstackwatch.h | 5 +++++ mm/kstackwatch/stack.c | 1 + mm/kstackwatch/watch.c | 1 + 7 files changed, 43 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..fdfc6e6d0dec 100644 --- a/mm/Kconfig.debug +++ b/mm/Kconfig.debug @@ -309,3 +309,14 @@ config PER_VMA_LOCK_STATS overhead in the page fault path. =20 If in doubt, say N. + +config KSTACK_WATCH + tristate "Kernel Stack Watch" + depends on HAVE_HW_BREAKPOINT && KPROBES && FPROBE + select HAVE_REINSTALL_HW_BREAKPOINT + help + A lightweight real-time debugging tool to detect stack corruption. + It can watch either the canary or local variable and tracks + the recursive depth of the monitored function. + + If unsure, say N. diff --git a/mm/Makefile b/mm/Makefile index ef54aa615d9d..665c9f2bf987 100644 --- a/mm/Makefile +++ b/mm/Makefile @@ -92,6 +92,7 @@ obj-$(CONFIG_PAGE_POISONING) +=3D page_poison.o obj-$(CONFIG_KASAN) +=3D kasan/ obj-$(CONFIG_KFENCE) +=3D kfence/ obj-$(CONFIG_KMSAN) +=3D kmsan/ +obj-$(CONFIG_KSTACK_WATCH) +=3D kstackwatch/ obj-$(CONFIG_FAILSLAB) +=3D failslab.o obj-$(CONFIG_FAIL_PAGE_ALLOC) +=3D fail_page_alloc.o obj-$(CONFIG_MEMTEST) +=3D memtest.o diff --git a/mm/kstackwatch/Makefile b/mm/kstackwatch/Makefile new file mode 100644 index 000000000000..84a46cb9a766 --- /dev/null +++ b/mm/kstackwatch/Makefile @@ -0,0 +1,2 @@ +obj-$(CONFIG_KSTACK_WATCH) +=3D kstackwatch.o +kstackwatch-y :=3D kernel.o stack.o watch.o diff --git a/mm/kstackwatch/kernel.c b/mm/kstackwatch/kernel.c new file mode 100644 index 000000000000..40aa7e9ff513 --- /dev/null +++ b/mm/kstackwatch/kernel.c @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: GPL-2.0 +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#include + +MODULE_AUTHOR("Jinchao Wang"); +MODULE_DESCRIPTION("Kernel Stack Watch"); +MODULE_LICENSE("GPL"); + +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); diff --git a/mm/kstackwatch/kstackwatch.h b/mm/kstackwatch/kstackwatch.h new file mode 100644 index 000000000000..0273ef478a26 --- /dev/null +++ b/mm/kstackwatch/kstackwatch.h @@ -0,0 +1,5 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _KSTACKWATCH_H +#define _KSTACKWATCH_H + +#endif /* _KSTACKWATCH_H */ diff --git a/mm/kstackwatch/stack.c b/mm/kstackwatch/stack.c new file mode 100644 index 000000000000..cec594032515 --- /dev/null +++ b/mm/kstackwatch/stack.c @@ -0,0 +1 @@ +// SPDX-License-Identifier: GPL-2.0 diff --git a/mm/kstackwatch/watch.c b/mm/kstackwatch/watch.c new file mode 100644 index 000000000000..cec594032515 --- /dev/null +++ b/mm/kstackwatch/watch.c @@ -0,0 +1 @@ +// SPDX-License-Identifier: GPL-2.0 --=20 2.43.0 From nobody Thu Oct 2 19:01:00 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 D75472E7BAE for ; Fri, 12 Sep 2025 10:12:22 +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=1757671945; cv=none; b=MBI2E+Uxt5mjBSdXknFV7IyDlIjPYHex0OIlTCU8rGt9Iv5u8wnBjfU4Xv1wQ7va+tp6k/saLVzBb8MGZuTNn/QWCAcAsAkXSSLTvIn/EK2UeKTxHWams8qo/m6Lk2dlJy0CZZScY2pdJdm77OeTqz6y8VE294jhmA0eUhjs7RQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757671945; c=relaxed/simple; bh=xhEgADxCH9HYuhwsYpDsUfcMELRNH4wMvbrMimvNP+Q=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=McT6PscNp9K+JTfGpcNhk8ip9vrbEpRdgZVj2weYv5q6VS0bMLA1lv4wUij87YIrn6y67tphBwmqi8yc76fEpP2q4sLr5nM4FmTA0zjYLShXTse6zG+ucoB0eWqAX/jO/PwFeaU7/JTnignl1ieDkfa2n0kyWXb62lQz1BaGOJs= 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=c15xj1QS; 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="c15xj1QS" Received: by mail-pf1-f178.google.com with SMTP id d2e1a72fcca58-7741991159bso2554948b3a.0 for ; Fri, 12 Sep 2025 03:12:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1757671942; x=1758276742; 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=JWZ0kuFk/JGga2KckHsx8bbCMGd9rBXEdZWbqFyn8fw=; b=c15xj1QSKbz4R78VR5Ydnn9qhuKW+VxOvGuRwITXMiYCDEIzarIhBT0b6Qv1LZdLfC 2A+IYSKSr7ChOY6791wVSjLOJi7C9DuktUcAH/CAbeq10xOg52Drc6z6GmfYoLYKczAZ ZHtySvi3DhvAIAU7tp4uI/weAx/4rsfuhPh6PhZg2Ja1dzPQNiWAIvlYJcyl1cTch/0v 25S3mDAGcJZ3otwywQDssYLnxFQRwCwxuWyyCvNq8b625tDBO+A9X/aWfx+vxXpE7u6r u3xmQuntV4qkUjJXnW6rCQgqmN745W9704bskr9MmqYxEBOZ9OKLn3HBkhTRYPzoLl1V /SUA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1757671942; x=1758276742; 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=JWZ0kuFk/JGga2KckHsx8bbCMGd9rBXEdZWbqFyn8fw=; b=Unw+XMH5Ru7QsJnk9JsYRmcs4ClJckLc3YBVQlJZXyahICfCV9wlDF4+G8ETNk+AKF llVr+GEAMdULW94d2KKlK6vyVdEKWDkSSyhQPzDamhx8G3Ea96msAw5MmZo44J1b/76F 6Qd7z+bQS0SBqbtt7dxDP+Eq735OSo6NtO4Kmrx+vcf3LfEngguf7qeAPX7VqtG6NmQD 7ydG6ZOXTX2+D3QbnNoyViGqPOFfpo0xvTqmydw7fshf+kZ9u8Urh3FJH8//wrN4qjLK xJZlmLLDvWxgkfhw0YkbPVcdY7QSGLrn4UrMQeFmn+gWd0dH7ZaOQZyQo76Sn9+0Fqf2 d/dA== X-Forwarded-Encrypted: i=1; AJvYcCXfEusSPjd7mQMeQ9ZanPqjspiTo7QXcxxnfjzoP0QC8+3tuheDFc8yl0weUukjzncrUlhjkOvjIrERUz8=@vger.kernel.org X-Gm-Message-State: AOJu0YyrfmdYPFJiG5p++J9OG0qQ+wLq02H9bBDQaRq8aTIp89aircF5 ikNGijVuPz+ZvK/ljBReU2XxJ1k7MZgxqcmxdFH5u/gcZqhOP45AJ+dR X-Gm-Gg: ASbGnctf26svTZq94RpXMQfAGXST9KeBI41pEmMIWxtfhv6kNKrRHAOC7vkuvwM564h ewgEyax5EV8AgVuqZsvMIX1avMAnTm0waoduwZYJ7C8cblg54d38+qY7j7U3dM/D6ZbJjNKV/3o wqXMTCp7Xsa+pM2nT49EPfPXi8Bmcu1x+GaukK5D1gxdaeWkGYMlX4K8maP4pSzvohxgbTZwuOB k/xCT5HmkFyz+zBkWPnuJE9Gghph5KSOhp8/yEqTA/Z5LDzMyV9zPjxCNM46nVcCtJLxmXIAE/B sH4u8W2qQC4ou/py6AZqKO+lk3Rjn1awQnRm3tBQTW50vvGPLrdVfficfbfmTvVduq+/ZLbAs/x gKsVOdMexqk3G6/3J63/jOchRPLxy9hnY4LhGvYY2vrj6Nrswsw== X-Google-Smtp-Source: AGHT+IE8+93TdDPnsE4atda/JWPbNWLLDtzQ/rRojiuKNJS4zwHA9ycGi7y7HjIuRi4Y0KG1ZDhRqQ== X-Received: by 2002:a05:6a00:812:b0:772:5899:eae8 with SMTP id d2e1a72fcca58-77612189a24mr2770987b3a.27.1757671941982; Fri, 12 Sep 2025 03:12:21 -0700 (PDT) Received: from localhost ([185.49.34.62]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-77607a46eedsm4969144b3a.30.2025.09.12.03.12.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 12 Sep 2025 03:12:21 -0700 (PDT) From: Jinchao Wang To: Andrew Morton , Masami Hiramatsu , Peter Zijlstra , Mike Rapoport , Alexander Potapenko , 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 v4 05/21] mm/ksw: add ksw_config struct and parser Date: Fri, 12 Sep 2025 18:11:15 +0800 Message-ID: <20250912101145.465708-6-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250912101145.465708-1-wangjinchao600@gmail.com> References: <20250912101145.465708-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 | 91 ++++++++++++++++++++++++++++++++++++ mm/kstackwatch/kstackwatch.h | 33 +++++++++++++ 2 files changed, 124 insertions(+) diff --git a/mm/kstackwatch/kernel.c b/mm/kstackwatch/kernel.c index 40aa7e9ff513..1502795e02af 100644 --- a/mm/kstackwatch/kernel.c +++ b/mm/kstackwatch/kernel.c @@ -1,20 +1,111 @@ // SPDX-License-Identifier: GPL-2.0 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt =20 +#include #include +#include + +#include "kstackwatch.h" =20 MODULE_AUTHOR("Jinchao Wang"); MODULE_DESCRIPTION("Kernel Stack Watch"); MODULE_LICENSE("GPL"); =20 +static struct ksw_config *ksw_config; + +/* + * Format of the configuration string: + * function+ip_offset[+depth] [local_var_offset:local_var_len] + * + * - function : name of the target function + * - ip_offset : instruction pointer offset within the function + * - depth : recursion depth to watch + * - local_var_offset : offset from the stack pointer at function+ip_offset + * - local_var_len : length of the local variable(1,2,4,8) + */ +static int __maybe_unused ksw_parse_config(char *buf, struct ksw_config *c= onfig) +{ + char *func_part, *local_var_part =3D NULL; + char *token; + u16 local_var_len; + + memset(ksw_config, 0, sizeof(*ksw_config)); + + /* set the watch type to the default canary-based watching */ + config->type =3D WATCH_CANARY; + + func_part =3D strim(buf); + strscpy(config->config_str, func_part, MAX_CONFIG_STR_LEN); + + local_var_part =3D strchr(func_part, ' '); + if (local_var_part) { + *local_var_part =3D '\0'; // terminate the function part + local_var_part =3D strim(local_var_part + 1); + } + + /* parse the function part: function+ip_offset[+depth] */ + token =3D strsep(&func_part, "+"); + if (!token) + goto fail; + + strscpy(config->function, token, MAX_FUNC_NAME_LEN - 1); + + token =3D strsep(&func_part, "+"); + if (!token || kstrtou16(token, 0, &config->ip_offset)) { + pr_err("failed to parse instruction offset\n"); + goto fail; + } + + token =3D strsep(&func_part, "+"); + if (token && kstrtou16(token, 0, &config->depth)) { + pr_err("failed to parse depth\n"); + goto fail; + } + if (!local_var_part || !(*local_var_part)) + return 0; + + /* parse the optional local var offset:len */ + config->type =3D WATCH_LOCAL_VAR; + token =3D strsep(&local_var_part, ":"); + if (!token || kstrtou16(token, 0, &config->local_var_offset)) { + pr_err("failed to parse local var offset\n"); + goto fail; + } + + if (!local_var_part || kstrtou16(local_var_part, 0, &local_var_len)) { + pr_err("failed to parse local var len\n"); + goto fail; + } + + if (local_var_len !=3D 1 && local_var_len !=3D 2 && + local_var_len !=3D 4 && local_var_len !=3D 8) { + pr_err("invalid local var len %u (must be 1,2,4,8)\n", + local_var_len); + goto fail; + } + config->local_var_len =3D local_var_len; + + return 0; +fail: + pr_err("invalid input: %s\n", config->config_str); + config->config_str[0] =3D '\0'; + return -EINVAL; +} + 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..7c595c5c24d1 100644 --- a/mm/kstackwatch/kstackwatch.h +++ b/mm/kstackwatch/kstackwatch.h @@ -2,4 +2,37 @@ #ifndef _KSTACKWATCH_H #define _KSTACKWATCH_H =20 +#include + +#define MAX_FUNC_NAME_LEN 64 +#define MAX_CONFIG_STR_LEN 128 + +enum watch_type { + WATCH_CANARY =3D 0, + WATCH_LOCAL_VAR, +}; + +struct ksw_config { + /* function part */ + char function[MAX_FUNC_NAME_LEN]; + u16 ip_offset; + u16 depth; + + /* local var, useless for canary watch */ + /* offset from rsp at function+ip_offset */ + u16 local_var_offset; + + /* + * local var size (1,2,4,8 bytes) + * it will be the watching len + */ + u16 local_var_len; + + /* easy for understand*/ + enum watch_type type; + + /* save to show */ + char config_str[MAX_CONFIG_STR_LEN]; +}; + #endif /* _KSTACKWATCH_H */ --=20 2.43.0 From nobody Thu Oct 2 19:01:00 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 517292E8B78 for ; Fri, 12 Sep 2025 10:12:27 +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=1757671950; cv=none; b=c1aCW1cdA3jrjVTvP1pPmsEUnDTjDnWvV1DaTFb7Vf7RKtEk0j4u3N7fvBDEpujNdUuVghHfvVvlAM8DyeJpHmZheYaRcXAv9iSjz1TPhNdtMxyhjxA9ZouIpJHYeelPWZCI7vcysLyLv2Q3noP/XlUMWl+2qxlCgn/EWNuDFVY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757671950; c=relaxed/simple; bh=HtnvcRfhS9CLWmrVuR1TwMxPtWHSQtXzxVQktoPREbE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=SxM4hHe0tgisUkrVJXq2bPZsrBNmFlnxqm+J4MB5bAxQCrdBvCBndy5kIyaRtoDJEa4BE1I/gVsksVBZjFJ9foGvUTQjbeq7YPcwXkBXMKbhywuHx0Kyf7d06NtAia5YZ+lWvydmLFcFd3IiyCU3HaJQbPuQVn2zx9tZsmxvnTk= 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=ibJLqtEi; 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="ibJLqtEi" Received: by mail-pj1-f45.google.com with SMTP id 98e67ed59e1d1-329b760080fso1804645a91.1 for ; Fri, 12 Sep 2025 03:12:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1757671946; x=1758276746; 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=Btw7JeEHjCHi0fmk72XeSdeksiIjhqX1c6woWjS/nBg=; b=ibJLqtEiEdIp2HmGI1RMpWTh/fGrIXB5E8TsZedpqe6A+E/fjyt41Gf16UNEN9Pzhw D1NQez7s8Zp87JDkNhSw1+cb+UQwceM5zJxpbqUo0uwRbE69dgmXNImUYWEnQZnTMex1 YAWJYBWR/ZKEAuzVUnGEsRJtxa29ScisaJHCefUCQK8VY065T3iNu5UkWLpaQb5dC/7Q Y830TmgGUoTcfBY+tQ7A2IAJKFGRlkqX+WaupBdQG/qGHa6nsI79DzCa9POnIESyeJM8 p88EzBan7TktsTdpAEeB0LEBTxNTE8DD15YYxBudV7n6h+pkx0S/u++6HSNM3PBJLxay AEUQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1757671946; x=1758276746; 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=Btw7JeEHjCHi0fmk72XeSdeksiIjhqX1c6woWjS/nBg=; b=Ws12OkdudN4GCKYNFroQ0zwLBlnGfMl1igbhemH6piSUbxQWUjY8ShrGWoQ1xvV7Gg 7WkxfzxSmirkYjRmB72xZCV3hm1/LFyvTPXG9ZaqjU064C1hZuZUdLaCHvlD8LB57Rdy njX4sr/4wJPYv1DveCPC7baPEnkN3tF22Fv1imzYPPGHuC4MGbw1tV0EOV0vjBZVcY/S bwxlVzHJzPzP982phQWULkbSR6KOXtQNMD3MPuFigEXyrJgiqkhOeKVBFpaphkcf4/Un cNZSwrEXmH27sj91ENxZy7+qelRXjpDKLw2QFPzN9RXZmsjUTCgL/9ApHpDZnaX7VUdV aj/w== X-Forwarded-Encrypted: i=1; AJvYcCVDK6eGEl76qxkHwd7UIaOcaX1rfDw5z6laKvar3huS37w0wx1oK4yPli7ewBVJBcEJj4IZ+fE2CZogBog=@vger.kernel.org X-Gm-Message-State: AOJu0Yz8Xq7W6wLBsJFwJdmC+lgzXRpPYusVKQogpBbpnfqAK7PJ6tji y7s+Av8s5fgLPJrv68byBKVWSa8gtbR2JFQv+8hwpHHjyYEls7ieQqOR X-Gm-Gg: ASbGnctx2cGpfQa+iDJmhC5i4BI+zG/vSVC41jS0NhdXsabcsRGPn79qBFbTnYy7BqA TdANfNlS6lyPScDEOo4Mx27sUTuHH5qHCakX8hQcBBTSxzj/CL49781Ab4pidGR5Br8qRi7B2/w IaA6KyU43dVhdJh3Lqv5+zTpV99004mvj78hW+l3C4WVXxLIO/fQxvHBmV8DkKVVtBz2p/ILHLP QZGd8gaLeFXznR8OZjjGNl0vmJWgAUSBmzzMOnzdMx/YTItoXcfaDH/ti9B6qMS9LFfJTIkpFfP 3NWM/9Q6f4WldeuRwJNZlQEYpGy5ZYnSylT8ozsAGUVVh2hvxWT1PqNA3T2Beo305J2n3WaoDRM 35Wt0WN7JdT72PcZ3Hf9pNY4iqKWQ4RckRqNM2/c3gcSm7SgU5g== X-Google-Smtp-Source: AGHT+IE+sH0wcZG9HaKcll5QXaOw6VOwT34jJJKFyIXbetNwLJVfpmHy9Irzue+96yqtkUewE0lXYQ== X-Received: by 2002:a17:90b:534e:b0:32b:df0e:928f with SMTP id 98e67ed59e1d1-32de4fb9a28mr2940174a91.37.1757671946347; Fri, 12 Sep 2025 03:12:26 -0700 (PDT) Received: from localhost ([185.49.34.62]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-77607a48c19sm4972892b3a.36.2025.09.12.03.12.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 12 Sep 2025 03:12:25 -0700 (PDT) From: Jinchao Wang To: Andrew Morton , Masami Hiramatsu , Peter Zijlstra , Mike Rapoport , Alexander Potapenko , 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 v4 06/21] mm/ksw: add singleton /proc/kstackwatch interface Date: Fri, 12 Sep 2025 18:11:16 +0800 Message-ID: <20250912101145.465708-7-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250912101145.465708-1-wangjinchao600@gmail.com> References: <20250912101145.465708-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 /proc/kstackwatch 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 | 75 +++++++++++++++++++++++++++++++++++- mm/kstackwatch/kstackwatch.h | 3 ++ 2 files changed, 77 insertions(+), 1 deletion(-) diff --git a/mm/kstackwatch/kernel.c b/mm/kstackwatch/kernel.c index 1502795e02af..8e1dca45003e 100644 --- a/mm/kstackwatch/kernel.c +++ b/mm/kstackwatch/kernel.c @@ -3,7 +3,10 @@ =20 #include #include +#include +#include #include +#include =20 #include "kstackwatch.h" =20 @@ -12,6 +15,7 @@ MODULE_DESCRIPTION("Kernel Stack Watch"); MODULE_LICENSE("GPL"); =20 static struct ksw_config *ksw_config; +static atomic_t config_file_busy =3D ATOMIC_INIT(0); =20 /* * Format of the configuration string: @@ -23,7 +27,7 @@ static struct ksw_config *ksw_config; * - local_var_offset : offset from the stack pointer at function+ip_offset * - local_var_len : length of the local variable(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 *func_part, *local_var_part =3D NULL; char *token; @@ -92,18 +96,87 @@ static int __maybe_unused ksw_parse_config(char *buf, s= truct ksw_config *config) return -EINVAL; } =20 +static ssize_t kstackwatch_proc_write(struct file *file, + const char __user *buffer, size_t count, + loff_t *pos) +{ + 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 kstackwatch_proc_show(struct seq_file *m, void *v) +{ + seq_printf(m, "%s\n", ksw_config->config_str); + return 0; +} + +static int kstackwatch_proc_open(struct inode *inode, struct file *file) +{ + if (atomic_cmpxchg(&config_file_busy, 0, 1)) + return -EBUSY; + + return single_open(file, kstackwatch_proc_show, NULL); +} + +static int kstackwatch_proc_release(struct inode *inode, struct file *file) +{ + atomic_set(&config_file_busy, 0); + return single_release(inode, file); +} + +static const struct proc_ops kstackwatch_proc_ops =3D { + .proc_open =3D kstackwatch_proc_open, + .proc_read =3D seq_read, + .proc_write =3D kstackwatch_proc_write, + .proc_lseek =3D seq_lseek, + .proc_release =3D kstackwatch_proc_release, +}; + +const struct ksw_config *ksw_get_config(void) +{ + return ksw_config; +} static int __init kstackwatch_init(void) { ksw_config =3D kzalloc(sizeof(*ksw_config), GFP_KERNEL); if (!ksw_config) return -ENOMEM; =20 + if (!proc_create("kstackwatch", 0600, NULL, &kstackwatch_proc_ops)) { + pr_err("create proc kstackwatch fail"); + kfree(ksw_config); + return -ENOMEM; + } + pr_info("module loaded\n"); return 0; } =20 static void __exit kstackwatch_exit(void) { + remove_proc_entry("kstackwatch", NULL); kfree(ksw_config); =20 pr_info("module unloaded\n"); diff --git a/mm/kstackwatch/kstackwatch.h b/mm/kstackwatch/kstackwatch.h index 7c595c5c24d1..277b192f80fa 100644 --- a/mm/kstackwatch/kstackwatch.h +++ b/mm/kstackwatch/kstackwatch.h @@ -35,4 +35,7 @@ struct ksw_config { char config_str[MAX_CONFIG_STR_LEN]; }; =20 +// singleton, only modified in kernel.c +const struct ksw_config *ksw_get_config(void); + #endif /* _KSTACKWATCH_H */ --=20 2.43.0 From nobody Thu Oct 2 19:01:00 2025 Received: from mail-pg1-f174.google.com (mail-pg1-f174.google.com [209.85.215.174]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CE1132E2EEF for ; Fri, 12 Sep 2025 10:12:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757671953; cv=none; b=X4xoYKNfbrbCDu73/8ybXO0ZQ6WeSCiLPDR1enYFmLQQEHVn50S0QHfVAQzvZ7n81zZddu2Q7j5LACUxBeZxicgs2aUDaqTgYTS6orIcq8/nlWYPSgBK6ob7xa30e1glRqjE4fFyzkbXkaFSvRxZftFjyVhDcn80otl0x9b6n1o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757671953; c=relaxed/simple; bh=0LDaB0nCUJks9qfGHQUupDX5ghXvVPG655pHEUpPv0Y=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ONk+xPDp03W6uruXMbXYRKOGTjCsWZZtgfOcWQNtPaymn9pTmUq0bbKNLgp+YR8R53SvOYdp4tkvuI/LoJPdlN4/dFY4fBBGf7cFkbHCy2Qg6OtRPutwXzhFRi50QTY/FKMmyykHp4gnSkfiUWKoxHoVqs608SSIUsNf0gm0G8A= 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=YVqx/HMc; arc=none smtp.client-ip=209.85.215.174 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="YVqx/HMc" Received: by mail-pg1-f174.google.com with SMTP id 41be03b00d2f7-b4e84a61055so1163814a12.0 for ; Fri, 12 Sep 2025 03:12:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1757671951; x=1758276751; 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=J0CmyIyII1+MjAJi7HJRtv0YVAXaAwAF3MNYXoEmi5A=; b=YVqx/HMcx4WSO9i1YtOiiV7Z3RYtwePGk3ADWg3kZQ9pySyLlQhj3snXhTpJEx957w srGpnBdxagEBUTvLsPLQJewwbBYn7iWjj4/v0ayowKE2WoalDMmvhyuZdDam2JEsawor hk0EutrTk4+v9xlH/63Ub6gGLU2bqMw0qaJwKNuTXWRaoNhkVlCuTnRYVVuN8pqlhIlM K3/QMkQpDQ5J8XrQRM7fULzrOm34WCUgmaI6OS9LLYuNSu/8bFMlIW7TGsZyqaiSEjFE oVC29mNNaEa+kxkVYn9FuSevElViV1F3l/dHiCnoF+ibYOYYgPWCZ0fWA46ALLAg+isW tmJA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1757671951; x=1758276751; 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=J0CmyIyII1+MjAJi7HJRtv0YVAXaAwAF3MNYXoEmi5A=; b=GhqpzmfddHOFqT7bm+Ke2NFERjYpIKFzFWbHB81YoyPktRPzhZQTicRFzL7TzvsB+Y w+fEhcTT4RCvOsdgMgXVznkKzzELKakzwlWvguHOPwM9mLmKx2o1eGlU2BT2LJpaPwUM wHwrJlG7sBxh35Kr1glrmF8dQCr0qpLMXE721mEeuXSIKIrCzGusZt9zo3UvuE1eO/IL 3GzSv+fBTDp8ib5kKdIC7sKIUEA4/V5Xccq+hpf08okDe+ZD0cL02pY/oI5OwWRIz0aX lNrAX0uan+QeKGqhtxvZMmAozh/mV2tow8sSqNdr5aGLnA5v/eWjs/Gw6ToTxX25Zr/3 fAdA== X-Forwarded-Encrypted: i=1; AJvYcCXwHEU1M9qMO33JnkL5O175aySl9HvjZioYcqFtYu4J3UupMpoxuk2lL1/aOkdP530ppSvMup9AQRQ2PnE=@vger.kernel.org X-Gm-Message-State: AOJu0Yyn9theSlt2NkmT4g7Hay5ij8yogD6At9UZ+aOBmVF5tS4Gb9jv HqHfYmrigvOF0Iary0zGa3IrzzIH5PrBvxmk/x6xSE4KMDLwrUnuLnTB X-Gm-Gg: ASbGnctr7Ziq1yELMSUJonah+4nzYkTfNDQUL+33whlBE43JVw5d0eViLQUEFJCy2VS 3InF9enXkERF0aTwHDqX7HJqttN0xR/6tUNTs9qxfmiGB3b3QcL+ujIa12yB7pePP/6fhVotVEs zToNTA10pwPPIjk4AEwAqHHC7lGzMiYi6chRb75cyQPzALN1YVrbg8IEWjV9Sgau8uQcV9pdVLn rWP+OkcMeH+J6RjiIP6tOeTO5s4kvPTUSHIjAV2PAZG7HmgYfi8/sirX22lej5vTWj4YtlF5NgT WLMcr4n3B5TNIbnNldacMEv++QMInrhMvL2MwRbivhqMJ7TxnFDKSMk2CDyOsiHg4KwINmDsmYc 6VcGNJrkRisWbjc65AFuvXqHUp//yMdwuAZnt3mg= X-Google-Smtp-Source: AGHT+IF00yk89VG+lmEZt4lMLX0bbsabe7ZkX4XQg7tfyuz6vAWZHryAYuUydwk9sktzZqpEFk926w== X-Received: by 2002:a17:903:3c2c:b0:24b:2b07:5fa5 with SMTP id d9443c01a7336-25d26663dcamr29087525ad.29.1757671951122; Fri, 12 Sep 2025 03:12:31 -0700 (PDT) Received: from localhost ([185.49.34.62]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-25c3b4f1127sm44400285ad.147.2025.09.12.03.12.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 12 Sep 2025 03:12:30 -0700 (PDT) From: Jinchao Wang To: Andrew Morton , Masami Hiramatsu , Peter Zijlstra , Mike Rapoport , Alexander Potapenko , 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 v4 07/21] mm/ksw: add HWBP pre-allocation Date: Fri, 12 Sep 2025 18:11:17 +0800 Message-ID: <20250912101145.465708-8-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250912101145.465708-1-wangjinchao600@gmail.com> References: <20250912101145.465708-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. Signed-off-by: Jinchao Wang --- mm/kstackwatch/kstackwatch.h | 4 +++ mm/kstackwatch/watch.c | 55 ++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+) diff --git a/mm/kstackwatch/kstackwatch.h b/mm/kstackwatch/kstackwatch.h index 277b192f80fa..3ea191370970 100644 --- a/mm/kstackwatch/kstackwatch.h +++ b/mm/kstackwatch/kstackwatch.h @@ -38,4 +38,8 @@ struct ksw_config { // singleton, only modified in kernel.c const struct ksw_config *ksw_get_config(void); =20 +/* watch management */ +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..d3399ac840b2 100644 --- a/mm/kstackwatch/watch.c +++ b/mm/kstackwatch/watch.c @@ -1 +1,56 @@ // SPDX-License-Identifier: GPL-2.0 +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#include +#include +#include + +#include "kstackwatch.h" + +static struct perf_event *__percpu *watch_events; + +static unsigned long watch_holder; + +static struct perf_event_attr watch_attr; + +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()->config_str); + 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"); +} + +int ksw_watch_init(void) +{ + int ret; + + hw_breakpoint_init(&watch_attr); + watch_attr.bp_addr =3D (unsigned long)&watch_holder; + watch_attr.bp_len =3D sizeof(watch_holder); + watch_attr.bp_type =3D HW_BREAKPOINT_W; + watch_events =3D register_wide_hw_breakpoint(&watch_attr, + ksw_watch_handler, + NULL); + if (IS_ERR(watch_events)) { + ret =3D PTR_ERR(watch_events); + pr_err("failed to register wide hw breakpoint: %d\n", ret); + return ret; + } + + return 0; +} + +void ksw_watch_exit(void) +{ + unregister_wide_hw_breakpoint(watch_events); + watch_events =3D NULL; +} --=20 2.43.0 From nobody Thu Oct 2 19:01:00 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 385222E9EA4 for ; Fri, 12 Sep 2025 10:12:37 +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=1757671958; cv=none; b=lKtWEnHBV0W8E2x+FI4kb4yV762m8F2j7a4z9FbfeX1Dd8hixRSP2ULG1dDIXQoF7QTCG6tYWBEd2oLY2IcS4PRkDD179jVIqcIQNnoQqUG7CdNxFoXy5x5ZfGpGBZM241eJyJfq7TzBoq14GDKNYif/0lS7x56urBlUJe6OtxI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757671958; c=relaxed/simple; bh=i3v51fD9Nx/GpVeSYWAguecpXuWplCvYwMF4XBy55cA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=gQyjTLOPLZ47BaWgp+U3/qCMNYEuU25c8LzIiumMZtyyuF9iNFfRv2XFE7Cc4DDLqHB/P5rvTBPrBQkrKhArQHBWelW2IcZDXApBRxP3WXLql3ejHFzljqrJ8rKI/kqg++W2c4/XztYPCv6Nx0P1uAyLsYuLHK0Po8a/6c034FA= 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=f537tpMF; 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="f537tpMF" Received: by mail-pf1-f178.google.com with SMTP id d2e1a72fcca58-772843b6057so1578294b3a.3 for ; Fri, 12 Sep 2025 03:12:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1757671956; x=1758276756; 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=jBWUZGT7AQZjVN5sSaCPPhxiXndvcDbF8VJhhLu7a/o=; b=f537tpMFxL2Og7DF38NwCJ8buJf5RfMmKnhZtyQaKdYzjGhU0+RGIqV32N8L1jVHAW Y0ifJr6BiXERBCcxD7B1i7BsYT+rCr5772+pYy3xACl1PoeySygsa/0Qq8cC+YsC8SAT +PU2YQcnCWfahmStOWiXrhyq9D538m/KmeUmvLLNv+sbl33kXVRMwxYDryMGnwCoj6pW x2RQ7xKFb3fTxhBhZXXwBf3iCciOMTB2Ze5dNKUneeZi3ChtMB3IhDA+ivpH7iS2HPrW q6VUwoxb787SGW5T5c8PikfwwzsgGQWpq5IRztLdIW8nIssa/fMp7Tqbl1aiA8gfzXsd /heQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1757671956; x=1758276756; 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=jBWUZGT7AQZjVN5sSaCPPhxiXndvcDbF8VJhhLu7a/o=; b=S02IJPDL8jU48+W6KAHGb3VeV9AE42qVECVVTUY1LOX8uyEjHZiWLkK4DLld82ue7O GfO65RQxRD6TdcOESrn/L0IpgzTYECb0k6jFng5ghGKhvLCQJann3pHx03ESVII1rI7a AvbJjE1o4OToJP4X4h3sobqW6KzEs9S/mvzY3VtRnpRLGIwGPIClcYBfOE7E02ZPSKuH MpSwbMUfhKyVmnVL3SKKi0gBGoVA3wB/VxNhxCVWn6TJueeMA69akX0h6oGYjx60L7bZ iaGlrnXjUtLdLE2P+R7jjGceghAaQ2uoRwvBSFUp8wK2hx+d8Ie3//JrPCtutLGb6JiC hbSw== X-Forwarded-Encrypted: i=1; AJvYcCUJi9lBn94ZOtuBzyt2HJDXgk7rfq/tlZ1GJXqh71f++g/VC8/JcrYEQNqCgIyo2QX8mqZAwTH2ALAqioo=@vger.kernel.org X-Gm-Message-State: AOJu0Yzgox4l+FnuZ3CCpKLoxnQvmjWRArUpLBxBkEZKjY9sIpvYNrt6 kbOHBCufSrLJCJNV7p7vs832iv9GpcBWJ/AIHRDenUDaVCisJhlwu5by X-Gm-Gg: ASbGncs7uf9R5PH2DE71dA9WrNyRGNN4fRr0+VZJi2XDfpijVFsxsMv0a0CYL4PAM3p gVmOHENp3q/erDLcfGmTrAapkJ1UuKsY4g5ozaBFtSEP2ekwBnRdpoiR2tteKcQCVG9FceDXrU+ GfSw70MI45c2Njq2AdGvDUhJ56nBXYpk+Tt9Odzm610I7A1FeLacc+0Pv6qpWKdqk2kXz7cR1fE W9PWDflF5uTVuW9iREXlHNmibthDyTskjpq4Bk4sOO1bbqWyQi4QvKMUALMfxpUC98CmVKVWmjZ YPVOqKwmgAvpipUhMByyzGYmtD3llkG2CKW48jfSUYIfu7Z2nvvLU8mCs6RWNAKiLdm1LT/rWEk QBSB/p9NThoDKCxXkswv82F0v2wEO1YaTsGBpbgyEbP0TM04OgQ== X-Google-Smtp-Source: AGHT+IE0smHKx/fxxESUMD26AxoS7YeR+pzOUZ9t8bbqYrL6zePDghHY9Bjvt2Dlrnb+iBu56FBUDg== X-Received: by 2002:a17:903:3c4d:b0:24c:cc2c:9da9 with SMTP id d9443c01a7336-25d24bb3201mr28288785ad.14.1757671956234; Fri, 12 Sep 2025 03:12:36 -0700 (PDT) Received: from localhost ([185.49.34.62]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-25c3b307073sm44099805ad.144.2025.09.12.03.12.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 12 Sep 2025 03:12:35 -0700 (PDT) From: Jinchao Wang To: Andrew Morton , Masami Hiramatsu , Peter Zijlstra , Mike Rapoport , Alexander Potapenko , 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 v4 08/21] mm/ksw: Add atomic ksw_watch_on() and ksw_watch_off() Date: Fri, 12 Sep 2025 18:11:18 +0800 Message-ID: <20250912101145.465708-9-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250912101145.465708-1-wangjinchao600@gmail.com> References: <20250912101145.465708-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 atomic_long_cmpxchg() ensures at most one active watchpoint exists at any time, with ksw_watch_on() succeeding only when no watch is active (current address is placeholder) and ksw_watch_off() succeeding only when the caller knows the active watch address. 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 | 2 + mm/kstackwatch/watch.c | 73 +++++++++++++++++++++++++++++++++++- 2 files changed, 74 insertions(+), 1 deletion(-) diff --git a/mm/kstackwatch/kstackwatch.h b/mm/kstackwatch/kstackwatch.h index 3ea191370970..0786fa961011 100644 --- a/mm/kstackwatch/kstackwatch.h +++ b/mm/kstackwatch/kstackwatch.h @@ -41,5 +41,7 @@ const struct ksw_config *ksw_get_config(void); /* watch management */ int ksw_watch_init(void); void ksw_watch_exit(void); +int ksw_watch_on(ulong watch_addr, u16 watch_len); +int ksw_watch_off(ulong watch_addr, u16 watch_len); =20 #endif /* _KSTACKWATCH_H */ diff --git a/mm/kstackwatch/watch.c b/mm/kstackwatch/watch.c index d3399ac840b2..14549e02faf1 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 =20 @@ -9,10 +10,16 @@ =20 static struct perf_event *__percpu *watch_events; =20 -static unsigned long watch_holder; +static ulong watch_holder; +static atomic_long_t watched_addr =3D ATOMIC_LONG_INIT((ulong)&watch_holde= r); =20 static struct perf_event_attr watch_attr; =20 +static void ksw_watch_on_local_cpu(void *info); + +static DEFINE_PER_CPU(call_single_data_t, + watch_csd) =3D CSD_INIT(ksw_watch_on_local_cpu, NULL); + bool panic_on_catch; module_param(panic_on_catch, bool, 0644); MODULE_PARM_DESC(panic_on_catch, "panic immediately on corruption catch"); @@ -29,6 +36,70 @@ static void ksw_watch_handler(struct perf_event *bp, panic("Stack corruption detected"); } =20 +static void ksw_watch_on_local_cpu(void *data) +{ + struct perf_event *bp; + ulong flags; + int cpu; + int ret; + + local_irq_save(flags); + cpu =3D raw_smp_processor_id(); + bp =3D *per_cpu_ptr(watch_events, cpu); + if (!bp) { + local_irq_restore(flags); + return; + } + + ret =3D modify_wide_hw_breakpoint_local(bp, &watch_attr); + local_irq_restore(flags); + + if (ret) { + pr_err("failed to reinstall HWBP on CPU %d ret %d\n", cpu, + ret); + return; + } +} + +static void __ksw_watch_target(ulong addr, u16 len) +{ + int cpu; + call_single_data_t *csd; + + watch_attr.bp_addr =3D addr; + watch_attr.bp_len =3D len; + + /* ensure watchpoint update is visible to other CPUs before IPI */ + smp_wmb(); + + for_each_online_cpu(cpu) { + if (cpu =3D=3D raw_smp_processor_id()) { + ksw_watch_on_local_cpu(NULL); + } else { + csd =3D &per_cpu(watch_csd, cpu); + smp_call_function_single_async(cpu, csd); + } + } +} + +static int ksw_watch_target(ulong old_addr, ulong new_addr, u16 watch_len) +{ + if (atomic_long_cmpxchg(&watched_addr, old_addr, new_addr) !=3D old_addr) + return -EINVAL; + __ksw_watch_target(new_addr, watch_len); + return 0; +} + +int ksw_watch_on(ulong watch_addr, u16 watch_len) +{ + return ksw_watch_target((ulong)&watch_holder, watch_addr, watch_len); +} + +int ksw_watch_off(ulong watch_addr, u16 watch_len) +{ + return ksw_watch_target(watch_addr, (ulong)&watch_holder, watch_len); +} + int ksw_watch_init(void) { int ret; --=20 2.43.0 From nobody Thu Oct 2 19:01:00 2025 Received: from mail-pg1-f170.google.com (mail-pg1-f170.google.com [209.85.215.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 BD1212E9EA9 for ; Fri, 12 Sep 2025 10:12:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757671963; cv=none; b=aMshU9sKY3c+ep7aO0hbPeAODUa6P6c7CjYDkRzO+A0fFVrYa9xjRQ+XBocPmXKFUeR84w2Um81ww2c12pCip+2wtZQM3TOGDxkWn/RIVOToDpEiMUgKu4QMbJogcBvXxIEx15DGY0DtdARpwR6YTWpZav4Cmz9VkE0NX2MqD38= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757671963; c=relaxed/simple; bh=Un+cr8+CAx8R+jlvlSG9Ydlf8KMHwbHKNBBW5RhycS0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=SZ7ilRKZ/apxsSiwM3or31OtCwAb7RA+1dLhDzlWm3+ZfiCykEB4cmlaj0WJRLsLemtfwE5uM1RDy+vrAs/xc0SAF12x9sHuNjC1qvEveRScLiOu6Uzl2fXQMMqsQnjJnSxIFKE/zVCfhdiox1ayWhC4wkEzxfgt1LklCYsaIno= 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=A4uZmrmV; arc=none smtp.client-ip=209.85.215.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="A4uZmrmV" Received: by mail-pg1-f170.google.com with SMTP id 41be03b00d2f7-b4fb8d3a2dbso1255946a12.3 for ; Fri, 12 Sep 2025 03:12:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1757671961; x=1758276761; 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=UTRhetdXz/AlDveQ7cC4oIBX48CBF691SylMydPRcTY=; b=A4uZmrmVDOMz3gjZm/FgGvhM7+l9CdJvU+O1OUKMIrxovJmb8hl+KCi9/5Q9KmN++z dEEd0GGEc4flgqSmMDhj2WdWoAQgE8V+VNsY+8D7RWpIx0YfB3AIz+entQTvIjgAzuqb 2MDsHsLagwDLvUPEFjpbTmhkksKJLfidSt9Nfviv7Cjp2gfYCg73NnGXZzQLAtZDCUTK bwK4tMZfo4GWQprrIxUSjFdnjPcCpa1KUP8dkvrzK9+rlK2Fmc4VnSF6HaVPa4wQUuil PJNG3dWTxCwDCDVdKB9MoMXhpPBivv+Yyrfb03GStmbjeGgvNQtdsinEUvxE4dNRaItv 2T1Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1757671961; x=1758276761; 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=UTRhetdXz/AlDveQ7cC4oIBX48CBF691SylMydPRcTY=; b=u67VbaGpYNUHoredfer40koqyjBXq3jGEPP0gMbUkGY903wWKzGVrwm5LhgUhXpdM8 Omoeo/BFhoafTQ2SxUds1L8MQns7JjeYH2JYa2BYa9jKo3Pyjeci0pY2OW1Cklh+xgQI llBl0oxcjTEqkiFM7FNHE7cXsoaQinf0jK3slPK742gfzXqX4xTD2ChhHJxzbKDGYsQC aooJKHUNr19KfPLFL2IGAy6S4vkNJF5D5SWOp6xSMmdDqB75C/7TpEamEkqdqsvC9Mpp 1EeBnWG8bXXp9SR+r0PBkg/R3wzL+ZpQDxPlUbji6T6xEoMTJfDOyoK6/ctZbDlFAgsd BvCA== X-Forwarded-Encrypted: i=1; AJvYcCUKCeT3LRVJ5XfgiUEBjnF/ae7Lhr1wp3eygpZj4mzun2hncqVLja2OaSPFrvsDz4UBzONPHZXb0cprTgI=@vger.kernel.org X-Gm-Message-State: AOJu0YwjaeH4stQ4RjmlF0fDaNkgFQcgvrmyfH4ecoQYFTJZ9N4pCE98 /4uHGDpizo7A6O09Va5ilTUkchaUeONIvpPItAsFq96/uL7MOt1Rx10L X-Gm-Gg: ASbGnct/bTVSiMLOqHix1V+iHaT1VEnvvLbm58DJOIxqBfSjgZ1Ap6GbwH6qP0avsEE x/iHqb9Dcb85gs8dOhDVKsck0h/BjCNZvtFVdIn0w7QjsCRRwTAuCF8Dkf8tADEeFH4R8K0b3jz +JjHaUO0rJsU7FxZam6+XVT2SNVg24tYvcxh7LKew8GwJu3grL2qo1Zl0qUFEl5aMg60rWGTCZ4 HufGKdvHXUpcVukqLLnyvCn7R62RqmY57iw6+akWJspO5luwsDLOElCTUFgb9iMuSOJvlh0l9iG /KZ40UBc6xUOCyKn2HgOuK/HhYMBXBEME1gkx//37egB8C7wH/AAl7j5Jq8YsOdLnviw5Kv9+ic mhKtwMGsqcNgjEiVdSzK0U2G+4KotZrTX4uh/X0Cy1atTP+iW8g== X-Google-Smtp-Source: AGHT+IGqTkU62M75KR/OKOWzeX1g5EGPCOAXf7ry0VUZE+EZFf5kPwKsv6/nCCnQmnFIPNz9rUR8cw== X-Received: by 2002:a17:903:3884:b0:24c:d0b3:3b20 with SMTP id d9443c01a7336-25d2675c1fdmr26411195ad.37.1757671960988; Fri, 12 Sep 2025 03:12:40 -0700 (PDT) Received: from localhost ([185.49.34.62]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-b54a398cfbasm4325375a12.39.2025.09.12.03.12.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 12 Sep 2025 03:12:40 -0700 (PDT) From: Jinchao Wang To: Andrew Morton , Masami Hiramatsu , Peter Zijlstra , Mike Rapoport , Alexander Potapenko , 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 v4 09/21] mm/ksw: support CPU hotplug Date: Fri, 12 Sep 2025 18:11:19 +0800 Message-ID: <20250912101145.465708-10-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250912101145.465708-1-wangjinchao600@gmail.com> References: <20250912101145.465708-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. Signed-off-by: Jinchao Wang --- mm/kstackwatch/watch.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/mm/kstackwatch/watch.c b/mm/kstackwatch/watch.c index 14549e02faf1..795e779792da 100644 --- a/mm/kstackwatch/watch.c +++ b/mm/kstackwatch/watch.c @@ -1,6 +1,7 @@ // SPDX-License-Identifier: GPL-2.0 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt =20 +#include #include #include #include @@ -61,6 +62,32 @@ static void ksw_watch_on_local_cpu(void *data) } } =20 +static int ksw_cpu_online(unsigned int cpu) +{ + struct perf_event *bp; + + bp =3D perf_event_create_kernel_counter(&watch_attr, cpu, NULL, + ksw_watch_handler, NULL); + if (IS_ERR(bp)) { + pr_err("Failed to create watch on CPU %d: %ld\n", cpu, + PTR_ERR(bp)); + return PTR_ERR(bp); + } + + per_cpu(*watch_events, cpu) =3D bp; + per_cpu(watch_csd, cpu) =3D CSD_INIT(ksw_watch_on_local_cpu, NULL); + return 0; +} + +static int ksw_cpu_offline(unsigned int cpu) +{ + struct perf_event *bp =3D per_cpu(*watch_events, cpu); + + if (bp) + unregister_hw_breakpoint(bp); + return 0; +} + static void __ksw_watch_target(ulong addr, u16 len) { int cpu; @@ -117,6 +144,15 @@ int ksw_watch_init(void) return ret; } =20 + ret =3D cpuhp_setup_state_nocalls(CPUHP_AP_ONLINE_DYN, + "kstackwatch:online", ksw_cpu_online, + ksw_cpu_offline); + if (ret < 0) { + unregister_wide_hw_breakpoint(watch_events); + pr_err("Failed to register CPU hotplug notifier\n"); + return ret; + } + return 0; } =20 --=20 2.43.0 From nobody Thu Oct 2 19:01:00 2025 Received: from mail-pg1-f181.google.com (mail-pg1-f181.google.com [209.85.215.181]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D21BB2EACEE for ; Fri, 12 Sep 2025 10:12:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757671968; cv=none; b=SESBatHPpkgwvDc2yslbjk3soR2upu7ADd/bHcXpi5+pbOGeD0Qk25vxMuoIHfXRYGPJYyItcbP8bc0nsBw+K76SNj3x2cbzJ/2XNnsmgdzhIKQDbNXgwMbZJVvpZNDLTS6Stnth3opjL6n/kw2OsMTs0XER4tPrM5o+mqgEokA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757671968; c=relaxed/simple; bh=9KjIUwPMgHNHYVh/vgsz+Iu+cp7WW766R2rHVAOmv3A=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=K27xHAeUyJYuHvLEhQWctP200mqeO8BycsBZzUk8tYUNegZHeoam+fQj2/8J3bNHRGlP8dxXG9okPOOF/R/ei2BrWbEPcjLLVE6sQhoXHmm4K84iRTTTv6ywruTNb56TEufrYm6bpGdqgtRgxgSP8VLLQZjysDf3MQZMCpFa7Q0= 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=ZajTr3oD; arc=none smtp.client-ip=209.85.215.181 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="ZajTr3oD" Received: by mail-pg1-f181.google.com with SMTP id 41be03b00d2f7-b54a588ad96so1009992a12.1 for ; Fri, 12 Sep 2025 03:12:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1757671966; x=1758276766; 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=EqhfZKpOZ5vr6/4baQpnpDghHsngjObwVAr7pMjTC1U=; b=ZajTr3oDOxUYhsKnBwW/jtStARL+36ayWUwx4F2P6hiWtwXOvDpVMVNxrvHhiTrZuB v2qVtPdtCZ81HZO9ZLyqIovuW4I74RgRaD3dSWSRVtkz0N6MNT/pISfjP34RfngIUyod N5fh2DrReYCXh1qzjTJVtmVWqXWn3fm9LPAhhMrQ1gkLbfCC9e9kNLHQVmEVSvzLt5ho NX7j7c8j6GqXH8pipGjTvf4ebtxAysbB+dXfeSj/xorvfu9+dAxowrpsYNDO9IU9ONXN gyZZ0XbR5GWQEBZW5hJQBY9oeQsXNicVR+XYMs8hjbC99xMBzQy7/CtOiWbakBD/rons u4Fw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1757671966; x=1758276766; 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=EqhfZKpOZ5vr6/4baQpnpDghHsngjObwVAr7pMjTC1U=; b=jpuEfLiElVr38XjMfdDLggSpVy8vqI35y64LmjjQE//D/mPFdnKhInAwJ7RhvPLEy2 neTxmabbfXK9uC4FRQI20jJLdOPYB6VCImgn7w+KNq0s3wmzvbsbHFK80d4M65KRSd3o blXQBMSDQFkJkcIfMuCQWMo73ISDvJlltIBLieMRoOMYYl/ObxF49yiVSHXByrTiKt6G a5nFNq2+S4PZuyEs89XZY8qycqWIr6z+S7Cg812CRRam0tLKl+476bDOVSRP8T+qoo8M aR3c84In7xP5XgU2xe4DV6vgz6kMydmhjA4zz332RatVtFxQ2ERD65MiFn2EM578jFFk EOlA== X-Forwarded-Encrypted: i=1; AJvYcCVd1W7S2dkpqI12xl2VHeDQx/vDdbvNrXRcUKadM/85gVvmFjt7nDpITUkJ0Z5gLZ12GbpXWPWYxLeBS7o=@vger.kernel.org X-Gm-Message-State: AOJu0YzasqijxWcta/o6MtyEZ+r58xiuraY2BK0VFXoCICsiNo/etCY9 DxKelWcLRevfMUV81Q3wdLCkdy3EvLMy7fI2meDpxbZoEbpuGOSNO8jh X-Gm-Gg: ASbGnctdZjhbQ/kzbi3H7AlNHDx0gow/MAdJPIcMIBaqvDElY0UsYX/A4kmI1st7ROo +IwwvpsbU9kK52Ro+KouzmHNdeHJdvN5U7460uM6gnIY3Y7Kku6hbLb9RIp9r1qhPJ/bbw+HJJo VeaoP0byVMn66yElJrABew4oJHS6L0s5/hZwxLryh6W8DDdA23Ms+G/7ihubZ9uChIerbJ8vp+5 pecj8qGzN3IBeBPK9roLPi8nK23cWTqnVjCxjpEIwTWHXqZWDRPYMr3EkZEDg6gUYbtcJuXOJmY 5/o7sJRtB+GBRBF05ZJ/nS6i1Uz1Bs4E6nafRn8HNwZhjevLeN6QhJjCeLudnnR4iImKM4DLkQL 9bO2TN0dotMIdD33rtLmeQP3qmZKMdOnYpXOGEds= X-Google-Smtp-Source: AGHT+IHYvhVuQu3JkB4HjuaPSs4+WBMwwDAkSMFdp4aHblSEvg/m0jfxMexK7gmtMSLEueohiSNhCQ== X-Received: by 2002:a17:902:e5c5:b0:253:65e4:205f with SMTP id d9443c01a7336-25bab92cc8fmr79198095ad.3.1757671965944; Fri, 12 Sep 2025 03:12:45 -0700 (PDT) Received: from localhost ([185.49.34.62]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-b54a3aa1c54sm4273352a12.50.2025.09.12.03.12.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 12 Sep 2025 03:12:45 -0700 (PDT) From: Jinchao Wang To: Andrew Morton , Masami Hiramatsu , Peter Zijlstra , Mike Rapoport , Alexander Potapenko , 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 v4 10/21] sched: add per-task KStackWatch context Date: Fri, 12 Sep 2025 18:11:20 +0800 Message-ID: <20250912101145.465708-11-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250912101145.465708-1-wangjinchao600@gmail.com> References: <20250912101145.465708-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 kstackwatch_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 | 13 +++++++++++++ include/linux/sched.h | 5 +++++ 2 files changed, 18 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..93855fcc7981 --- /dev/null +++ b/include/linux/kstackwatch_types.h @@ -0,0 +1,13 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _LINUX_KSTACK_WATCH_TYPES_H +#define _LINUX_KSTACK_WATCH_TYPES_H +#include + +struct kstackwatch_ctx { + ulong watch_addr; + u16 watch_len; + u16 depth; + bool watch_on; +}; + +#endif /* _LINUX_KSTACK_WATCH_TYPES_H */ diff --git a/include/linux/sched.h b/include/linux/sched.h index f8188b833350..1b324b458309 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -1481,6 +1482,10 @@ struct task_struct { struct kmsan_ctx kmsan_ctx; #endif =20 +#if IS_ENABLED(CONFIG_KSTACK_WATCH) + struct kstackwatch_ctx kstackwatch_ctx; +#endif + #if IS_ENABLED(CONFIG_KUNIT) struct kunit *kunit_test; #endif --=20 2.43.0 From nobody Thu Oct 2 19:01:00 2025 Received: from mail-pl1-f173.google.com (mail-pl1-f173.google.com [209.85.214.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 99B442EB84E for ; Fri, 12 Sep 2025 10:12:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757671974; cv=none; b=GBDr0gs0VUI4j+FQRaw3XF/o38cduR4QXQ/Xz/A5H+cVm5mwZwh4gkzXIbeMG3qHUzlZAo89Qr32qmQf5yeeKhWruFCOcmh4kQcIRELgjw0WHxq1B4qse/44IOClQAsdbAtpNHfPS3Zc5v2x9LUQtITrV1SZ23bephaTvBexUX0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757671974; c=relaxed/simple; bh=a5HXFEXCxWNRHDDVyZZfIidS3SNN062TjXO3sF8vxcw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=I7BCmBpWxV4sALlJgRAfp8va0D6E+6m+MhStdyn0GfZZ0b8tG7p+r7UryQgAmY4VQ0j62cx7g1F7eKGpSHflAFN8vmdoNeIU6OPavBCAkYcTW9tpvTezll/dN78H5vY0Mqll9Gf5mjo7bcn4lVFP84stayR1yJZ1xh4SoyRUGdM= 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=X4SxenS3; arc=none smtp.client-ip=209.85.214.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="X4SxenS3" Received: by mail-pl1-f173.google.com with SMTP id d9443c01a7336-24458272c00so18778295ad.3 for ; Fri, 12 Sep 2025 03:12:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1757671971; x=1758276771; 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=bEzQtMPq9PK+5+yYtP/oNug9OWMsSiZGEa798p9Mz9w=; b=X4SxenS3BxcAA9QiBmVt+MB6I+ZcELSePKO4cOmBRvVjrbpwt9Uj288zM4KHAmiu5C +5X/D3B1XHmLtRG5npsNGNIePp0Va+eE1jYuI6wwf66FeB44vMr8d0VzaKXgK/hJx2YC HWU1uOpyx0uN8VlsT99qnsM7eKsR5dFmlOcuzWmxhgTrPRw0HLqSvcNxjpwK00kz/ETk Zb7E+5h3IQLeY4XtJ7NXB/yZxZ7iSZzefLLcwcH2bn7hSHYWspt4wbRH71zf/zKIdwtd OxrOgXe0ovMgI2hz9sloJYajJ9dzBPoYj7+oepOOwo7W1lv+Rn3TSaQBWGkZqibQEN23 NKng== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1757671971; x=1758276771; 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=bEzQtMPq9PK+5+yYtP/oNug9OWMsSiZGEa798p9Mz9w=; b=LnFpEnpvp4h5yW8Lms9QdaOeEarE2a26MInxBftzMsjvTPBr8sVO2NZKXkR+pVP1lI 8+6CPcmTGD09Oie3QJAf/4fOfx9zwya7t0Y54wLNWIKH2nHozO8jHMUmpxMPrRETEtUi saBsjwispZgJE+PDpEAsfq09x5ld5P7Onu/aqUbH9IkSEUYB48+GqSZBXrT+FxxQxNkw LBzXK1vWuJk4mVQBChoMOYLD5NQzE+6HX+fnGnIMwrokeLuUadszKHeXMbhV0Bfc5ObY DIGROXsygyTipscv+WFDQOdjpWlMzENqcmFSt1O+HfRvr716Y82rEvOduQ734tY55HHZ Csjw== X-Forwarded-Encrypted: i=1; AJvYcCXRCLyo3zJQJOEF8U8qd0nH4H8OmlBqegBrkWjbiwAAV+/tjZifZv0C0xrvHtsUidgZ3IKz9vUe+z0WYvA=@vger.kernel.org X-Gm-Message-State: AOJu0YwjQQnnr6yJ2UtC9sJ8oXT8wbYW++cpC+uxNa4j2IxzkfGh3t4F 5B/nvrwSRUFVjJsFcgfA8WDLgRk1b1g/1A+lGcVfAA3OqqADybFFy/8X X-Gm-Gg: ASbGncvA7VVv512OZetIzQM1wzFzVberPx3mjaitSj2IrQ6qCEhGPLSGAMA+MQPJDGZ o+Cc2YSVNEF3VApMi4lZY3KPUYL/K9R+3sCE0TL3RuEOG7A/L31mPQ3Ua0cVTbBCiGY5ylcLGsh XABZSW86W5T2HIJ82qEjVi0ucrDa7Ek1Vh46XdH3mK9R9t/1DiZtLgE9rgkgvf3tg96tPPIziXi TlwJGv8+o99c4Pf3FsU1aMc/v2phTbvj6Kvgp9CDNca+j9WIfrGIAZOBA2x6gMOu7AGZEsdR0qY KxTwqNWkHujLJuCYy/7XtkYqf1u6FnHAx5qFqrktVZ4dj1kImSQu84c4oOSPhWxyFC0OQ+ZwhNW 2Qb+UuBWQU4IkCBwPkOK6elxoukWyN3Nz1zvKQCOocWnSEE/HQLaX5qEit5hj X-Google-Smtp-Source: AGHT+IFjzeds5aG6Wb+p60MOU157xCW/uyAMBkC8kYhjKV3VQWNhWnO7RA/JWobHVFlYljAoloxrVg== X-Received: by 2002:a17:902:d490:b0:25c:18d:893 with SMTP id d9443c01a7336-25d24bb33f9mr25149495ad.22.1757671970918; Fri, 12 Sep 2025 03:12:50 -0700 (PDT) Received: from localhost ([185.49.34.62]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-25c37293f0asm45159835ad.43.2025.09.12.03.12.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 12 Sep 2025 03:12:50 -0700 (PDT) From: Jinchao Wang To: Andrew Morton , Masami Hiramatsu , Peter Zijlstra , Mike Rapoport , Alexander Potapenko , 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 v4 11/21] mm/ksw: add probe management helpers Date: Fri, 12 Sep 2025 18:11:21 +0800 Message-ID: <20250912101145.465708-12-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250912101145.465708-1-wangjinchao600@gmail.com> References: <20250912101145.465708-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(). The entry/exit probe handlers use atomic ksw_stack_pid to ensure a singleton watch and current->kstackwatch_ctx.depth to track recursion depth. A watch is set up only when depth reaches the configured value. Signed-off-by: Jinchao Wang --- mm/kstackwatch/kstackwatch.h | 4 ++ mm/kstackwatch/stack.c | 113 +++++++++++++++++++++++++++++++++++ 2 files changed, 117 insertions(+) diff --git a/mm/kstackwatch/kstackwatch.h b/mm/kstackwatch/kstackwatch.h index 0786fa961011..5ea2db76cdfb 100644 --- a/mm/kstackwatch/kstackwatch.h +++ b/mm/kstackwatch/kstackwatch.h @@ -38,6 +38,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 */ int ksw_watch_init(void); void ksw_watch_exit(void); diff --git a/mm/kstackwatch/stack.c b/mm/kstackwatch/stack.c index cec594032515..ac52a9f81486 100644 --- a/mm/kstackwatch/stack.c +++ b/mm/kstackwatch/stack.c @@ -1 +1,114 @@ // 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; +#define INVALID_PID -1 +static atomic_t ksw_stack_pid =3D ATOMIC_INIT(INVALID_PID); + +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 kstackwatch_ctx *ctx =3D ¤t->kstackwatch_ctx; + ulong watch_addr; + u16 watch_len; + int ret; + + if (ctx->depth++ !=3D ksw_get_config()->depth) + return; + + if (atomic_cmpxchg(&ksw_stack_pid, INVALID_PID, current->pid) !=3D + INVALID_PID) + return; + + ret =3D ksw_stack_prepare_watch(regs, ksw_get_config(), &watch_addr, + &watch_len); + if (ret) { + atomic_set(&ksw_stack_pid, INVALID_PID); + pr_err("failed to prepare watch target: %d\n", ret); + return; + } + + ret =3D ksw_watch_on(watch_addr, watch_len); + if (ret) { + atomic_set(&ksw_stack_pid, INVALID_PID); + 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; + } + + ctx->watch_addr =3D watch_addr; + ctx->watch_len =3D watch_len; + ctx->watch_on =3D true; +} + +static void ksw_stack_exit_handler(struct fprobe *fp, unsigned long ip, + unsigned long ret_ip, + struct ftrace_regs *regs, void *data) +{ + struct kstackwatch_ctx *ctx =3D ¤t->kstackwatch_ctx; + + if (--ctx->depth !=3D ksw_get_config()->depth) + return; + + if (atomic_read(&ksw_stack_pid) !=3D current->pid) + return; + WARN_ON_ONCE(!ctx->watch_on); + WARN_ON_ONCE(ksw_watch_off(ctx->watch_addr, ctx->watch_len)); + ctx->watch_on =3D false; + + atomic_set(&ksw_stack_pid, INVALID_PID); +} + +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()->function; + entry_probe.offset =3D ksw_get_config()->ip_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()->function; + + ret =3D register_fprobe_syms(&exit_probe, (const char **)&symbuf, 1); + if (ret < 0) { + pr_err("register_fprobe_syms fail %d\n", ret); + unregister_kprobe(&entry_probe); + return ret; + } + + return 0; +} + +void ksw_stack_exit(void) +{ + unregister_fprobe(&exit_probe); + unregister_kprobe(&entry_probe); +} --=20 2.43.0 From nobody Thu Oct 2 19:01:00 2025 Received: from mail-pl1-f181.google.com (mail-pl1-f181.google.com [209.85.214.181]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3F01C2EBBBD for ; Fri, 12 Sep 2025 10:12:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757671978; cv=none; b=hiI2Z+gYTksD+3GPp9Z7hWm6+Sg4hiH5zWT5UP3oUHpxBgs/VT7qnNadmUSsb7PvtC5LPlGuhYWypkWdZjg2h+/cvTHWwg8D76FzMoWFNg0iwQhcTafR1xC/huy0soD10olWX4B6lJ9mc34HKiKWGL8LqvwZ8ZkpgJK5oZQFAd8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757671978; c=relaxed/simple; bh=6mefF6IMMzyvYBUHPb6m4n0UB5fHQfdxvPTrHUmunyQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=TxcI47Y/yFwl1VcvwFjfjJR8Nok1fOCkMoBVkaQLSOpJLAH6cKucFMKkfRq0ZbuV95uds+A8S6app5kfBMxrDpAzF7Lm320ru3hQM4hNs7it3G7sjYdkteXBLIHfaJEJJ8T/X9lu3qclXKNHZ9c3aIVQtGmfzcDue5cWxLij5+8= 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=PvO85rwF; arc=none smtp.client-ip=209.85.214.181 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="PvO85rwF" Received: by mail-pl1-f181.google.com with SMTP id d9443c01a7336-24c9a399346so12840495ad.0 for ; Fri, 12 Sep 2025 03:12:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1757671976; x=1758276776; 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=mwBrRJrnxCqu1u7UrV9e609up8TstQr3mGzjgxeQ/fA=; b=PvO85rwFE+AFthnd22KtiyMXusH738r4OMXw2fZ9VzfnQrqCGup4UKQz5fYhdpFWYd Ffd0dZ/n7VafldJrABpQ55J9n+PB1T7eVmgnmHp+KNCkqZ9ZRk8ckq7DotHot6OY+IBg pCbpV/T5guQi0IH8QXNdaSt7xTNNuKC3gKJwl/u1fSrhI+6Vihi6STUgmfq0anhSqQAU HsqIqc618JiCafF0EgtDPY5F8JRpGqXEjBmSUvK/YPy3k98rXQ9jZ1N6cw4cZSFRlizi dXjRgM0HRsZEspTVExv7LgtV/KiSPYTMRt3ILK+wL9LWVLcY7XtBHRfUwdkDyzW3jBHu hiHw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1757671976; x=1758276776; 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=mwBrRJrnxCqu1u7UrV9e609up8TstQr3mGzjgxeQ/fA=; b=VDuTwH3G1fP3Fw/UQQ+aPoA00mMeaz1MOdpy5chKQ77hOepYmHXOjgxlT9xGb071P8 M/Ux0UvaHUFtbA3nt9mP/THfK9DS53fEi5UDTuBu3EV738/wn1Rnw+VZDuAmKjNQM3cL JTaYxz/gvnWADI2Z/vpUfCUB/ahmRrrKM0j/PumjoQxpqHR3jTBXUAsaVl5NHSsje/nE dEMZRLtmWsQT+2UF7IMqhZc9W94lYRqO6mj2zR0s/GpY5xkhW9O5e2gbHngb25igwQe6 V4bhv5TZgwnxtgo5KbZtTmFhDBQXnouT84cd5Dcfh5uTGQ0FEOCLzqEscK0K5x83IVql PpjQ== X-Forwarded-Encrypted: i=1; AJvYcCWsr67nK1LBeESQskvMdRl30EwK+qlZkZMTh+6f+Q8eRQbaovD6G2D+1zcKcniZCxuhDx0ZYj1hFj/PjtY=@vger.kernel.org X-Gm-Message-State: AOJu0Yx8NH2jMmJXpXrLZyKe5fv0lLXimLeNsJaE6DqcnV5ZWtDnGuFh KeWYmMw18Y64z6hyZD0K80mSWglVcfy2lPPF2WnNv1DQoVHvx9cjUl26 X-Gm-Gg: ASbGncvDaTZj0Yp77+VKOJBUisZmP/tFf0SOpGFPGMiWbQ7GSre22Ucu/vwhLAFmcH+ 3/k91965Orll7kkQ98o/DlNj/iAq+BSRaXrdhCIEYeh3g3tPgCR/hDvrOQZnteq/XhbpNCaFo8m VSmZn1DeRrGu2QdHyxVw8uydFnVvEHNRFUxKH8CQZqLOoKEaMkDj7fXmox3Dd3sRqj43uCJme1Z 6b6cdP+N/q46IPcMvpCIJSnwaMBOU57+yIWcSD6Us5eitdZLT5AkLgtVFbAXdIKRCrPBSMSOQz0 j34GC/JAAas7pxCIu7HRSQboiMtOCz9wVJxbkjRQObX9HXcugg5v6lJd5Sazi89GsnRSk1870xD 2BfIwL2BQFeUWJDHr13ncHLGqK4QWrlaSzq5tG6E= X-Google-Smtp-Source: AGHT+IHmhDxbrAgWt/ZFf2b2ARujdiSrTzk9h/pJ/Apo0LVYSifl646MIHmgwZB8g3f29HVWj78WGw== X-Received: by 2002:a17:903:2f0d:b0:248:79d4:93bb with SMTP id d9443c01a7336-25d26e449b9mr26345655ad.31.1757671976359; Fri, 12 Sep 2025 03:12:56 -0700 (PDT) Received: from localhost ([185.49.34.62]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-25c36cc6af7sm44843015ad.5.2025.09.12.03.12.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 12 Sep 2025 03:12:55 -0700 (PDT) From: Jinchao Wang To: Andrew Morton , Masami Hiramatsu , Peter Zijlstra , Mike Rapoport , Alexander Potapenko , 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 v4 12/21] mm/ksw: resolve stack watch addr and len Date: Fri, 12 Sep 2025 18:11:22 +0800 Message-ID: <20250912101145.465708-13-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250912101145.465708-1-wangjinchao600@gmail.com> References: <20250912101145.465708-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 | 88 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 84 insertions(+), 4 deletions(-) diff --git a/mm/kstackwatch/stack.c b/mm/kstackwatch/stack.c index ac52a9f81486..65a97309e028 100644 --- a/mm/kstackwatch/stack.c +++ b/mm/kstackwatch/stack.c @@ -9,18 +9,98 @@ =20 #include "kstackwatch.h" =20 +#define INVALID_PID -1 +#define MAX_CANARY_SEARCH_STEPS 128 static struct kprobe entry_probe; static struct fprobe exit_probe; -#define INVALID_PID -1 static atomic_t ksw_stack_pid =3D ATOMIC_INIT(INVALID_PID); =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; + + /* Resolve addresses for all active watches */ + switch (ksw_get_config()->type) { + case WATCH_CANARY: + addr =3D ksw_find_stack_canary_addr(regs); + len =3D sizeof(unsigned long); + break; + + case WATCH_LOCAL_VAR: + addr =3D kernel_stack_pointer(regs) + + ksw_get_config()->local_var_offset; + len =3D ksw_get_config()->local_var_len; + break; + + default: + pr_err("Unknown watch type %d\n", ksw_get_config()->type); + return -EINVAL; + } + + if (ksw_stack_validate_addr(addr, len)) { + pr_err("invalid stack addr:0x%lx len :%u\n", addr, len); + return -EINVAL; + } + + *watch_addr =3D addr; + *watch_len =3D len; return 0; } =20 --=20 2.43.0 From nobody Thu Oct 2 19:01:00 2025 Received: from mail-pg1-f176.google.com (mail-pg1-f176.google.com [209.85.215.176]) (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 7C7CB2EC557 for ; Fri, 12 Sep 2025 10:13:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757671986; cv=none; b=oW0oRiBUbK2Nks5GUaM/ni5b10QUtIKvXduiPymxnQjzJ5UfILLaRdEQ6J2xlualSKHiX9Qhqh4nAbaIRrcjGfuOqeikFBk9zvOkbcl60fP4PHZj8sOlkfXVZLP5jp0UiaODv5vOEd4zL1uGKCYfSQHv5d4FmtUZLKOYrL3nGIE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757671986; c=relaxed/simple; bh=jd25GVZ1dwCG1KSIktqN4mRE3G30pXiK/2KO15zxh2M=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=EM7gB3hU5haGKk9ksQvLIpbmMmPquqzLpIzxRqppB3ncPGRNdiTtZnqWnoE9ayhurgfQABEXYcfeBWbATxf3vh7BLBTNkVrMK54cYiW70+Dl3kqV1hoGG9hdw3A9Y1WQA7P4YRl6ZQAYIZVQ04Stt/YrJMv7OToOLFInBl0JOIc= 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=WERqiH6k; arc=none smtp.client-ip=209.85.215.176 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="WERqiH6k" Received: by mail-pg1-f176.google.com with SMTP id 41be03b00d2f7-b5488c409d1so1079326a12.1 for ; Fri, 12 Sep 2025 03:13:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1757671982; x=1758276782; 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=2Mx/ZUXbIMqKSHkTbty4rSJVQCBlfpfdQjz++MJLD94=; b=WERqiH6khVeaVy1OFHPzwoz3BZIOEB+P5oO7X+q62g7/LtUeW+aZGaL0GXHvz6lmuG oK3pZdsxtjG//c/pMvnrn/TAGsde+zmhJNrPjrprgothXziEyxzntaVfirUGLjdtrVZa Ctmy5Qi817FxRFhf81WOuhE63EfVvrKpYtMQFVw2kwuA+TAmdsrJuiXrVGrhX8I0KP0y DU0YgXHTzzSLM5L7BsE23HyOyB5hh1cGpTs27xi5SKrLCFiQ3VybG7gfHSIk176Gwlg7 eDMxN5OOfyMSdZBf9J6djK3YHysWShdJ5dm8jet1rkmnjNP4mfivuqQtYn2J7qagY/sp JA2w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1757671983; x=1758276783; 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=2Mx/ZUXbIMqKSHkTbty4rSJVQCBlfpfdQjz++MJLD94=; b=E0NR5Jn1OpsAG/iDN0+VmyNZ6WmYoVi+nGdTt66/KjczKf/C0nu98FZyS4hRsAU4cR KJQYL63nQQpWzV913fUsb5CjAaMwrEgugtuoST9Hmj8gDRLmM9Yqi50C4z+oUCLUD8jf YpYd5iZfIQwdF+rKhwCtqw1HtAYzCo8iPqN5xzD7HS7KBkeuE7XD7A2XUiOfDAEZQwcB 9C+9XpeURmS+zmVtNPraJpkRmzZSHP3tp80tG9Iaw0qrFM1Pbaizgk1+OvbBzJLGVoTO vgy46xj5IeLnJuLpxGzqEGtWLwxqdqokw1nBDUesRmH8eiYULSopIMsvSEotiWSoSanN OnNA== X-Forwarded-Encrypted: i=1; AJvYcCXTH68cCEFGzFKE2/2n6YdlP45G5lZcm5ZPnhxbgQkhmUIkQMjFix1QCWAqXR7Z7G6DpYpBpCao5QsuCTk=@vger.kernel.org X-Gm-Message-State: AOJu0YzsTk7V+vY1TbLaL5zcQG5h4U1ne2Ra1YXPOycDsfk9OdkmeTjy 1QGNF/l9ikyN2u8wuaGLz18MfEYQhzlsB+GSoNAboj7Subv8HE6iD3Rw X-Gm-Gg: ASbGncvkictmsUWGj1/Vsgtyd7JJN7EjdUNI1Wb67v67BA2Jhgv1W68RlMnnpHLihQB +FUbzbMuMgwQeqnGyq+MTsXXLEZsTdrITrQTTMbvSLHCcgRzhg1m+GS0OSXKtW0dDwrzaE1xtev SI/wC0OEN9OlgHxxDPDrNQXUDrqtCnERPE7EKAo+YCLbXuZUu+NiK2PEll+kK5sfs7Nb3l2xfts nPKwLPi1N3EgvlaWEEWhEzYQEkit9jqKDOHAeebAKFNv0ABkDw7AR30mhsXrLcpCb8aWMz8DFAQ YmpLynEXPIAtFXRphtAyhuBVfSv/7opNOfUZ00ZmZ55K6VImO+G1mQpq0SnQk8p+8H13Itw1ksH mnxfEvkktQaS1/MnCjf4xmbyXAy424dGXgupwZxv8hr7VByIPlg== X-Google-Smtp-Source: AGHT+IE+4u/LnZqfy4mSwj4sJkJVx6sl0nYi/VrPz9wqHW9cd8FRDoTWUsuOoKihHmm7ZzWEk3p2jA== X-Received: by 2002:a17:902:cecf:b0:251:493c:43e9 with SMTP id d9443c01a7336-25d243e79cdmr29426295ad.3.1757671982485; Fri, 12 Sep 2025 03:13:02 -0700 (PDT) Received: from localhost ([185.49.34.62]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-25c37295f9dsm44540355ad.55.2025.09.12.03.13.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 12 Sep 2025 03:13:01 -0700 (PDT) From: Jinchao Wang To: Andrew Morton , Masami Hiramatsu , Peter Zijlstra , Mike Rapoport , Alexander Potapenko , 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 v4 13/21] mm/ksw: manage probe and HWBP lifecycle via procfs Date: Fri, 12 Sep 2025 18:11:23 +0800 Message-ID: <20250912101145.465708-14-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250912101145.465708-1-wangjinchao600@gmail.com> References: <20250912101145.465708-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 | 55 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/mm/kstackwatch/kernel.c b/mm/kstackwatch/kernel.c index 8e1dca45003e..9ef969f28e29 100644 --- a/mm/kstackwatch/kernel.c +++ b/mm/kstackwatch/kernel.c @@ -17,6 +17,43 @@ MODULE_LICENSE("GPL"); static struct ksw_config *ksw_config; static atomic_t config_file_busy =3D ATOMIC_INIT(0); =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->config_str); + 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->config_str); +} + /* * Format of the configuration string: * function+ip_offset[+depth] [local_var_offset:local_var_len] @@ -109,6 +146,9 @@ static ssize_t kstackwatch_proc_write(struct file *file, if (copy_from_user(input, buffer, count)) return -EFAULT; =20 + if (watching_active) + ksw_stop_watching(); + input[count] =3D '\0'; strim(input); =20 @@ -123,12 +163,22 @@ static ssize_t kstackwatch_proc_write(struct file *fi= le, 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 static int kstackwatch_proc_show(struct seq_file *m, void *v) { - seq_printf(m, "%s\n", ksw_config->config_str); + if (watching_active) + seq_printf(m, "%s\n", ksw_config->config_str); + else + seq_puts(m, "not watching\n"); + return 0; } =20 @@ -176,6 +226,9 @@ static int __init kstackwatch_init(void) =20 static void __exit kstackwatch_exit(void) { + if (watching_active) + ksw_stop_watching(); + remove_proc_entry("kstackwatch", NULL); kfree(ksw_config); =20 --=20 2.43.0 From nobody Thu Oct 2 19:01:00 2025 Received: from mail-pf1-f172.google.com (mail-pf1-f172.google.com [209.85.210.172]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0FA6C2ECD2C for ; Fri, 12 Sep 2025 10:13:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757671990; cv=none; b=dj6IkORUnq0+0Itmgi7u6k9YMVb4s+Kcgm16Dj9k5awCxd+px3+Ln9JFapO+qbCmpuMT/OWRe/R0tdg65aD2qtIAywNOVzxyIZjNXlLE6aKcogNVBK7CNhlrgFmddhaMFnqf2zX3PuOkeshyvXyS/GDO6PUop3BvcWfBh9wLNIk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757671990; c=relaxed/simple; bh=ljHubFdo4RbY9sPZZpmIGXXQZrdiNxFcVGyARbY49GM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=pJ8Vg3ZTvg5LMVeY1gw1Qf2VjucZ/ccQSb05CW0ydVNXPtLz8CCirw/HSfL0GnXeDMNakYBkIui3uZ/J8hJd5cBJZQab5Prl5yczRIsRpR/lmFhIFQ4tM8mE5mvivj93j6ngPNdiImC+vgZI0r+O+sZ8AxzOJTcnSzzN5zO7mOo= 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=IDPSCdZU; arc=none smtp.client-ip=209.85.210.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="IDPSCdZU" Received: by mail-pf1-f172.google.com with SMTP id d2e1a72fcca58-76e4fc419a9so1514619b3a.0 for ; Fri, 12 Sep 2025 03:13:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1757671987; x=1758276787; 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=clh29CJb8P7VxnXXw4h/9gdA7sU+C9WtN5xBt8cm/X4=; b=IDPSCdZUUpOtAF1g097xo+JllyTdTsE6JXJrlMnaWPvAcFm+Byxx8HkfwMK2Ay7qhg yBS9gbB0W31nUnKN6faZ91ABd77++7zOZLhbMRZgm/rlORu4DnKMRkZh7El4jkaNwRlU tZdQpoQLvNTx9UGq7GCegQB0tUBgb8ggjiQIroUh2uVAxkqX7WVIqy961kqGuGasz/Vf I0I+Ps2IciMECyInMUAH1SXckZetPLXGkUtE0mSUlcPL7+lLZegw7xcYudczi23IUdMd 98fgrBf9hBhJ7tTapx+kiRhcgejl4+jOdRZze0dk69A6uydoEI/9rj5W6Gjqsr31VR0K WKlg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1757671987; x=1758276787; 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=clh29CJb8P7VxnXXw4h/9gdA7sU+C9WtN5xBt8cm/X4=; b=WNGdZ/wBiPop0RzmljcBv4hMFiH2KK9CWGVmqvS+DMmfbs0AJGQzTcwXm7bKEsmg5U GTDdv/eKLtt3aEf6R3b/F0S8gwAABzuiuWml77OBpbZhNHjbKxyUY1pCL0IGh6NGiCIM IfAda/fxEUEVBMJO7SDyZZ0xujJLg97/cczFtXntZ6GtVsHb0jc7JS+8JgrnAqNO+6l/ 1uhU67OFiMqe6uJcCuZXNumjxiMjYRAJxPlrBxq4djNGCwvI/KkB+caflAtfDkPTZ7AS gNp4ykvZQjNsqunQsF2oBqVZ6DYlk96YBJRMcGwDy2xOs4T/VRBTPG/SHhEBTHiXXu0V eT6Q== X-Forwarded-Encrypted: i=1; AJvYcCV25z+NcDhk6n6xhZ2RT0NSDjeh0BTFPPyFt7CRmtSP8IyH6zSD3td3TSXjtMdN6kYDtOruGrgpveqbHN4=@vger.kernel.org X-Gm-Message-State: AOJu0Yy11/RyKVCwgHdu3KvZ170R0eBp15P9HDyDqYN7+zHdEbJLgg9s 2/Qvnrt2lHoDCsOHlYy97/44GWcXRiljgZzBJd919qY7AaILgeQlrUi+ X-Gm-Gg: ASbGnctK49BGx/9dNQQQUO12fxzj4APNW/EAaVZnlK+FilcFtxs1hqYqwH8Km+D2qOT ORic/fzANzrXq+wMBvv9R1gO22aq3Bm2/Ure+C1GGsW0r8q7sd0vXl6raLGQlcpbKYdZcZSV2YK nZz+D5cSHsf2qUKQ+KXM+FqJ/1BVefld00G3MoLrm/q7RYo0Jlo+h9NcJ1QcDzi501F5NMOpSHS yiCnJwsxhL6pZ9eJzuxmQRlvz/TayZsRLwT3Q9sXerLtP64rVfCzTQiFYwx6HWtxYkMmWVhmGAb WPXRbh/RZhxwTBN1wi/dhYsFwuBqiGsCWcK+yvlPmaoFkZ+V53RkQ05PTDozUp7nN5l6voLb0Hc IXTVfMNjkaWiIMcPHqTPu3hj5bJJsIvppzvQ= X-Google-Smtp-Source: AGHT+IHaEUea7hRsSpqZl85bTv6q0KsvHQdzV/MeRfkpCvkL2MgkVHPyR0dQHBXbAqMEfqsEXUoPVA== X-Received: by 2002:a05:6a00:982:b0:76b:d869:43fd with SMTP id d2e1a72fcca58-7761216815amr3249434b3a.18.1757671987091; Fri, 12 Sep 2025 03:13:07 -0700 (PDT) Received: from localhost ([185.49.34.62]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-7760793b6b1sm4934804b3a.20.2025.09.12.03.13.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 12 Sep 2025 03:13:06 -0700 (PDT) From: Jinchao Wang To: Andrew Morton , Masami Hiramatsu , Peter Zijlstra , Mike Rapoport , Alexander Potapenko , 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 v4 14/21] mm/ksw: add self-debug helpers Date: Fri, 12 Sep 2025 18:11:24 +0800 Message-ID: <20250912101145.465708-15-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250912101145.465708-1-wangjinchao600@gmail.com> References: <20250912101145.465708-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 | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/mm/kstackwatch/kstackwatch.h b/mm/kstackwatch/kstackwatch.h index 5ea2db76cdfb..9a4900df8ff8 100644 --- a/mm/kstackwatch/kstackwatch.h +++ b/mm/kstackwatch/kstackwatch.h @@ -47,5 +47,7 @@ int ksw_watch_init(void); void ksw_watch_exit(void); int ksw_watch_on(ulong watch_addr, u16 watch_len); int ksw_watch_off(ulong watch_addr, u16 watch_len); +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 795e779792da..2e9294595bf3 100644 --- a/mm/kstackwatch/watch.c +++ b/mm/kstackwatch/watch.c @@ -161,3 +161,21 @@ void ksw_watch_exit(void) unregister_wide_hw_breakpoint(watch_events); watch_events =3D NULL; } + +/* self debug function */ +void ksw_watch_show(void) +{ + pr_info("watch target bp_addr: 0x%llx len:%llu\n", watch_attr.bp_addr, + watch_attr.bp_len); +} +EXPORT_SYMBOL_GPL(ksw_watch_show); + +/* self debug function */ +void ksw_watch_fire(void) +{ + char *ptr =3D (char *)watch_attr.bp_addr; + + pr_warn("watch triggered immediately\n"); + *ptr =3D 0x42; // This should trigger immediately for any bp_len +} +EXPORT_SYMBOL_GPL(ksw_watch_fire); --=20 2.43.0 From nobody Thu Oct 2 19:01:00 2025 Received: from mail-pg1-f174.google.com (mail-pg1-f174.google.com [209.85.215.174]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AC88F2EC553 for ; Fri, 12 Sep 2025 10:13:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757671995; cv=none; b=gTth2c3p9tTYYeS8H9FJoCd+ZSzlZjQIVllbu1OGCxG4aNlpNYFEHoBYIjAW6QqzK3c8xrKUV7yeUVxHHEdC8WzleSrPc5NBtfLHZqb97nPmgiPjPVLu3+JoBGYArYRtX6FlnClmRT+gN5mwdpqL2quocoSa0dOfGls4xEGLBcU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757671995; c=relaxed/simple; bh=EgCZjLTIkqtRjqUx6K0w0F3NJZwiUfm4DLne+JUEvxw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=UKBvpbYXS9XZWVY5AG9LuqFTq3q2K6T5Yxd9pyd0PuJYzPdH+WPtlC6vs/I174e4o7iLqF/PwsIPMeQTNJfw9nh7RpT36miW8sszp0FYjqJZG5AaslMcRplyPhMW8n/vSbxTsAqD0RJ8Xq4Uc77LXkhvvyNlbtlpqieRL0sid94= 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=lnx3N7Q0; arc=none smtp.client-ip=209.85.215.174 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="lnx3N7Q0" Received: by mail-pg1-f174.google.com with SMTP id 41be03b00d2f7-b49b56a3f27so1046232a12.1 for ; Fri, 12 Sep 2025 03:13:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1757671993; x=1758276793; 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=Hza3KqRNKGSLYWfBSKXFsxDeH0DXXBXA3429C+Yqz2A=; b=lnx3N7Q0UCWOROsQKLiSqOofasuN5O1eJ4c42khTCR4SEMDK2067Qp/33iXYQx6hI3 YPicD5Fl1RMw8sMdO+I5KMPG9sc70SRlTYhEGOtoYeE98QWBBgCAe9YqnhAH/krec7zT TOfBgS1VaAmH+Q6qSrXNhRxnx2ueTuLupH3V+jeJwr4KxVc2sEW0XQP6HUgIMk+48yON 3d+EYV6YFCxNn0liAtsoXz5Ukr9z9E+izbPH62lZn0vKsXk6FMU8iyeujm3mbygQdVfy GzI01wxXBiir9AuSZMeC7AvRtv+TKFMvvy6ChfuZNcseus/t1vmSTaasF7YcKfQZ4Iql rSeQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1757671993; x=1758276793; 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=Hza3KqRNKGSLYWfBSKXFsxDeH0DXXBXA3429C+Yqz2A=; b=f9uzypQ3Twmz9OjL+/AoQzYZ9y7Yqum6gA2tiwueb9IFOF5p0hwmSVMRDtZGXAJaQJ +EsGfZXm4kDU6jOm2U1XrMydKQ8vn8ogaZ7fVzn5DW/2987vA8T/z+1YThQ5AhSRwb/o al2vo03gnW0VtMbX1sj3mCTcYlgJ5GgzRnr1bOBirnyQBTCsFyAugrCHyHAsa6t3meK0 QuKyVSILaqHtQGSFmAMwc6xFUyZmNA3DOWVcZwXklwbUyZSB065WiPtEtG23dk0x2tUx meqtUl+PKhJr/gwKL+zBpCimdUJdmXmaXcs7aj/CmPDUSTPkYj3QEumGxa2nwX7w0q4A ecsQ== X-Forwarded-Encrypted: i=1; AJvYcCVMdIcgn3Yk61h0yP6ZJmVbmU/9TZmNGpA79w2hKaZO2aAs4Bi0taShvmJ2T+cq1hadq+LRLlyvLYmCRJ8=@vger.kernel.org X-Gm-Message-State: AOJu0YyKUtvTjJ4OVVBVJcLK1D9G7eoj6ah2CBg0iPgqTxOq4r4NpQ/H 42He0EMgOhpO935TmIBUd3R7HUqwyByW0zAhIH+eWbcqRI/zIDeUdin6 X-Gm-Gg: ASbGncsY+hTZqfkH1oi7qoP4/NXm8hW3hUE2OgeFnvuZOMVM/WgC0lIKQIzJN9J2fGd j2lkdbJD8eOwMS8j0kdaV+WyaRapPEGxehjInmV79GRycqb4Z5IXtjSZfXsymV715n4PqyWyzt6 Rx7IyApzihIwDyY0Ku2Wwq1xX4hSeJm7Q92K3eWiaQwdpNOpUKU6tPDCg4V6wdf7kNqpuyBcsdG ow6ViobtHu5zOuZPoWeiklsJ1wdwDEgyG8AsQhzgISXrDc+vdmvInav8wv/NXqNM0+SypTlROM5 VxS7+w3a/5xY27iJe9MmoDdrvBa6NlJ2SymMX/NjvlD2EeXdvTY2lgY2woFG/Dr+FIW17XoWXoN hjZToGp4VTt4IwLtUQwPDfz/bh1VbP2hp7AA= X-Google-Smtp-Source: AGHT+IG7f8OaGED6NtpM7NPcRiOM1jQkAe90+ggoUOI4OH0YlfR6qug9mcoSa6nxv/Hl/BMuWG/tLg== X-Received: by 2002:a17:902:c407:b0:24c:784c:4a90 with SMTP id d9443c01a7336-25d24cac4e3mr30450705ad.1.1757671992780; Fri, 12 Sep 2025 03:13:12 -0700 (PDT) Received: from localhost ([185.49.34.62]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-25c3ad33ed7sm45397685ad.102.2025.09.12.03.13.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 12 Sep 2025 03:13:12 -0700 (PDT) From: Jinchao Wang To: Andrew Morton , Masami Hiramatsu , Peter Zijlstra , Mike Rapoport , Alexander Potapenko , 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 v4 15/21] mm/ksw: add test module Date: Fri, 12 Sep 2025 18:11:25 +0800 Message-ID: <20250912101145.465708-16-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250912101145.465708-1-wangjinchao600@gmail.com> References: <20250912101145.465708-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 separate test module to validate functionality in controlled scenarios, such as stack canary writes and simulated corruption. The module provides a proc interface (/proc/kstackwatch_test) that allows triggering specific test cases via simple commands: - test0: directly corrupt the canary to verify watch/fire behavior Test module is built with optimizations disabled to ensure predictable behavior. Signed-off-by: Jinchao Wang --- mm/Kconfig.debug | 10 ++++ mm/kstackwatch/Makefile | 6 +++ mm/kstackwatch/test.c | 115 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 131 insertions(+) create mode 100644 mm/kstackwatch/test.c diff --git a/mm/Kconfig.debug b/mm/Kconfig.debug index fdfc6e6d0dec..46c280280980 100644 --- a/mm/Kconfig.debug +++ b/mm/Kconfig.debug @@ -320,3 +320,13 @@ config KSTACK_WATCH the recursive depth of the monitored function. =20 If unsure, say N. + +config KSTACK_WATCH_TEST + tristate "KStackWatch Test Module" + depends on KSTACK_WATCH + help + This module provides controlled stack exhaustion and overflow scenarios + to verify the functionality of KStackWatch. It is particularly useful + for development and validation of the KStachWatch 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/test.c b/mm/kstackwatch/test.c new file mode 100644 index 000000000000..76dbfb042067 --- /dev/null +++ b/mm/kstackwatch/test.c @@ -0,0 +1,115 @@ +// SPDX-License-Identifier: GPL-2.0 +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "kstackwatch.h" + +MODULE_AUTHOR("Jinchao Wang"); +MODULE_DESCRIPTION("Simple KStackWatch Test Module"); +MODULE_LICENSE("GPL"); + +static struct proc_dir_entry *test_proc; +#define BUFFER_SIZE 4 +#define MAX_DEPTH 6 + +/* + * Test Case 0: Write to the canary position directly (Canary Test) + * use a u64 buffer array to ensure the canary will be placed + * corrupt the stack canary using the debug function + */ +static void canary_test_write(void) +{ + u64 buffer[BUFFER_SIZE]; + + pr_info("starting %s\n", __func__); + ksw_watch_show(); + ksw_watch_fire(); + + buffer[0] =3D 0; + + /* make sure the compiler do not drop assign action */ + barrier_data(buffer); + pr_info("canary write test completed\n"); +} + +static ssize_t test_proc_write(struct file *file, const char __user *buffe= r, + 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: + pr_info("triggering canary write test\n"); + canary_test_write(); + break; + default: + pr_err("Unknown test number %d\n", test_num); + return -EINVAL; + } + } else { + pr_err("invalid command format. Use 'test1', 'test2', or 'test3'.\n"); + return -EINVAL; + } + + return count; +} + +static ssize_t test_proc_read(struct file *file, char __user *buffer, + size_t count, loff_t *pos) +{ + static const char usage[] =3D + "KStackWatch Simplified Test Module\n" + "=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\n" + "Usage:\n" + " echo 'test0' > /proc/kstackwatch_test - Canary write test\n"; + + return simple_read_from_buffer(buffer, count, pos, usage, + strlen(usage)); +} + +static const struct proc_ops test_proc_ops =3D { + .proc_read =3D test_proc_read, + .proc_write =3D test_proc_write, +}; + +static int __init kstackwatch_test_init(void) +{ + test_proc =3D proc_create("kstackwatch_test", 0600, NULL, &test_proc_ops); + if (!test_proc) { + pr_err("Failed to create proc entry\n"); + return -ENOMEM; + } + pr_info("module loaded\n"); + return 0; +} + +static void __exit kstackwatch_test_exit(void) +{ + if (test_proc) + remove_proc_entry("kstackwatch_test", NULL); + pr_info("module unloaded\n"); +} + +module_init(kstackwatch_test_init); +module_exit(kstackwatch_test_exit); --=20 2.43.0 From nobody Thu Oct 2 19:01:00 2025 Received: from mail-pf1-f177.google.com (mail-pf1-f177.google.com [209.85.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 06E482F0C40 for ; Fri, 12 Sep 2025 10:13:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757672001; cv=none; b=ERFDvNDfnvAY6JPFKXh81JkaXQL57ViiPHEEwqKqoNlswjSlHTshtnPR/2YMOEDlacb0ZhFHKbT9XV1JHkDH918cb4LBxkDlOj/ldfB8gi9+Jd4AfVOSw/3SWdc+7G287/TCjyYUQNTJJ7wypSci/EEPPLm9O4/pSRvibzo7ZwA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757672001; c=relaxed/simple; bh=0pYLSOeA0PAf1TeSGJQVGULqR9LKSdf8J0mO6JXy6uc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=MPpEcMrmXq6W4otyvqnDYcGGVk/CDN0bEJfw988DYou77stMfH2CFiFme7K7239X0jlHy4TH8LJG42P58xFdUmdipXcIElKr+EbxRvqEUCsJYw9ErXTgurAThEQV/GYRJ2GiVtbQUrSsQW2N2X7OSZxCJpVjGJqE9GYf9xfYeoc= 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=Db3HAijE; arc=none smtp.client-ip=209.85.210.177 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Db3HAijE" Received: by mail-pf1-f177.google.com with SMTP id d2e1a72fcca58-7723cf6e4b6so1466598b3a.3 for ; Fri, 12 Sep 2025 03:13:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1757671998; x=1758276798; 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=C6BBsZfnmfgl1Jgn+pU00vd6g5c1DTmTteWqGp/Sk64=; b=Db3HAijEZOAxxCS4azI+v3897g+Px4fNXXX8O1J57b5GaVlBDxGdpcMW/NK0oxC1Hy AKBZdwFXD5RI0k3g1X5Bfm08BtJSpjbZaoolfuK/xgPDTaJFTaC5lT+EsN44WYulgcDT IqJIbHCL5SSWb8q04xRt917RijNp4uyDzvxLhNHfRFEeBqkViPBjVsQdLA/i27Ihqjob roogCkLcI1JphxyRD5NCgMQyvGy/eWVkyVB0ImXaKoJaNa58cWmIGxJvPfi1k8SEdR2c bEX3rP1mEkvfaZkzQoTHkYLy8pZhZDLUkhjYyumlvg4kspuTDl9j/kF5qzM8Iw0zcCxF nQXQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1757671998; x=1758276798; 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=C6BBsZfnmfgl1Jgn+pU00vd6g5c1DTmTteWqGp/Sk64=; b=TaRMmXDVohRMnle+o3+F/C24Q59nJeG8oIg/t39JZfx9mqFk/ZylFYxHvtFE3cTuNG bdWYeq+hk1bAx6wWv7FDwYRkEcwHFNME/ZupispPFe8Ir3ox6/2/DcqSGx5R4CFKr0Lm SxdJah6S+gl22Xu8gh/IvQNUpW93Hk0ZTbFykP87xAG/PBIgzr53GegSD6gEErHwf6oj H7L0TvDJMH6H6uBvcOWQRl/cK+4ZUj3mzTIX7ew1Zt6d3GVk4EQPa5QQ4LG2AYr5s2cM nmbg9MCEQ5q0w7FBUDZedWEihcvK4p2apDX9aMsjpu48CAWCSMmfwA0peIfysOrgczB4 Wp5g== X-Forwarded-Encrypted: i=1; AJvYcCUkZ1i1+Hy1i8InQQyAiIblPL00BOVSuR1illY06+yFcUd7ejy/WMEqT0jNrWTCz45agIZP+98zvr1JgtA=@vger.kernel.org X-Gm-Message-State: AOJu0YxwRfGHKeOvaSjEvW+WzO16eJ02Fn1QjKxrr8nXl3VbUHSwSqcI 1mh5zgW6+Fe/DAw2PKh3qlvt5Aght7C7mnk2zUNEw035ZxP4psKlDc8C X-Gm-Gg: ASbGncuUefx16kz/6uohexIPZ343Ezl/OKqZ1JvPcLFNQxoW1YPmBMzpMKHk5JzihDi SviTbGsEsjltgUuB7HELhcdMWtLB6T1B6+t9kPD/hoTrPc4DN6B4gGG7ylxMWn6UkBtZiZx7LtC Zu81GAE6CM9rdWava2LA2LSWlvVwQvCZW043BonuQZzTPLjt2DFEVqgfYi9+aAe7Ars92o0DTBt /GJSHYfHmXDsuHL+4YYtz5vx59QxTdz7i62CunlESWXXSvjgSBFBusk8ur7fG50S2N+YXSVWv/c pTkBxeow7SUEBWm4JTei92FkR9AbGk8cqzFeJOcF3ZE8BswSfS/MAJDQAZWAwbWIBj0dqCrcth9 ewVxrlajmlMBJ3t0JvKF147HAjl9wtBV/2AyKiknKJKDshA== X-Google-Smtp-Source: AGHT+IFP0Z697TA4h3v44yo8u1mt3XK26j9kYKC9Oe9buFWhspRDiIMhNWMUBIxM8GwcPJ0/MCOUpw== X-Received: by 2002:a05:6a21:33a6:b0:246:3a6:3e41 with SMTP id adf61e73a8af0-2602a5937a8mr3020791637.6.1757671998049; Fri, 12 Sep 2025 03:13:18 -0700 (PDT) Received: from localhost ([185.49.34.62]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-32dd98b43a7sm5206301a91.13.2025.09.12.03.13.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 12 Sep 2025 03:13:17 -0700 (PDT) From: Jinchao Wang To: Andrew Morton , Masami Hiramatsu , Peter Zijlstra , Mike Rapoport , Alexander Potapenko , 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 v4 16/21] mm/ksw: add stack overflow test Date: Fri, 12 Sep 2025 18:11:26 +0800 Message-ID: <20250912101145.465708-17-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250912101145.465708-1-wangjinchao600@gmail.com> References: <20250912101145.465708-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. This helps validate detection of stack corruption under overflow conditions. The proc interface is updated to document the new test: - test1: stack canary overflow test Signed-off-by: Jinchao Wang --- mm/kstackwatch/test.c | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/mm/kstackwatch/test.c b/mm/kstackwatch/test.c index 76dbfb042067..ab1a3f92b5e8 100644 --- a/mm/kstackwatch/test.c +++ b/mm/kstackwatch/test.c @@ -40,6 +40,27 @@ static void canary_test_write(void) pr_info("canary write test completed\n"); } =20 +/* + * Test Case 1: Stack Overflow (Canary Test) + * This function uses a u64 buffer 64-bit write + * to corrupt the stack canary with a single operation + */ +static void canary_test_overflow(void) +{ + u64 buffer[BUFFER_SIZE]; + + pr_info("starting %s\n", __func__); + pr_info("buffer 0x%lx\n", (unsigned long)buffer); + + /* intentionally overflow the u64 buffer. */ + ((u64 *)buffer + BUFFER_SIZE)[0] =3D 0xdeadbeefdeadbeef; + + /* make sure the compiler do not drop assign action */ + barrier_data(buffer); + + pr_info("canary overflow test completed\n"); +} + static ssize_t test_proc_write(struct file *file, const char __user *buffe= r, size_t count, loff_t *pos) { @@ -63,6 +84,10 @@ static ssize_t test_proc_write(struct file *file, const = char __user *buffer, pr_info("triggering canary write test\n"); canary_test_write(); break; + case 1: + pr_info("triggering canary overflow test\n"); + canary_test_overflow(); + break; default: pr_err("Unknown test number %d\n", test_num); return -EINVAL; @@ -82,7 +107,8 @@ static ssize_t test_proc_read(struct file *file, char __= user *buffer, "KStackWatch Simplified Test Module\n" "=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\n" "Usage:\n" - " echo 'test0' > /proc/kstackwatch_test - Canary write test\n"; + " echo 'test0' > /proc/kstackwatch_test - Canary write test\n" + " echo 'test1' > /proc/kstackwatch_test - Canary overflow test\n"; =20 return simple_read_from_buffer(buffer, count, pos, usage, strlen(usage)); --=20 2.43.0 From nobody Thu Oct 2 19:01:00 2025 Received: from mail-pj1-f49.google.com (mail-pj1-f49.google.com [209.85.216.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 524C72F0686 for ; Fri, 12 Sep 2025 10:13:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757672006; cv=none; b=Hzzof8liLZTo2VGdGzDDaRc96lRlMlfrY0ubvNueKW4KGGqveHn+owaGrVwCxjLBsOCXV11Igw0YBR2J6CxMfPd/hV47LDCpPHA9SeIAAtg07T/WbVpz8sH3gYHwpRxEuK9qL1bfeqefQ4AZsebdCAEEDtCYFKcZN10Fay5SHi0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757672006; c=relaxed/simple; bh=xBysK8gV2dBvim56r1xsBo0HiYvpD2t6feorIo85ANY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=FFXAr0TlJF3QaWGfJvE7/64gw59fcDecYKIMl71ug7gM1e/soN16Nhnpg2KMQr3Gnmuz7f2N3tra2f0wBk9BGPT+WACl4WBvbx/DwWCQeKV8XEsqXGQhVKJ223RbudBtgfeZZKdAv6OuW+43D1uHL7TBfeChyQBmOvfLRKPa1Po= 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=dRey67IO; arc=none smtp.client-ip=209.85.216.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="dRey67IO" Received: by mail-pj1-f49.google.com with SMTP id 98e67ed59e1d1-32b863ed6b6so1502214a91.2 for ; Fri, 12 Sep 2025 03:13:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1757672003; x=1758276803; 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=VbQZ2RA/ceP/Xd/vXrNH7xFxG1mfw2BEk3J2LPmN1HA=; b=dRey67IOHZ/2rMxXC5cSne2seOyJbyfXHa/e77+0PEVEfo1XnT7TskSsVG3VSUULQT zLMjmUsl/gBqlrPWc4C8YXxJD8MD9t/7disQwBMZFEwieOj6ZGVinY6CqpvpqJLYfKiK Z4ZA6sgVntr/qLxtUuBq2FmtuK6cH7oxHSF3GIBzYy8CDk+1ZxFnAHJ2d+0V1i3AgJjo I+drPd7KjNyOS7wcJCxkmBdiEpC/ERH0DnXNr7Di4JhLjsqNq2sVj5cg63QHUmnaM3Dp j/oBZxWdcckvaS4k7Ln2C9uEqqH3jXTsD8o+LZVQDuT3pl/Qda3k1KbqPF22cs+Q0ij2 5ieg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1757672003; x=1758276803; 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=VbQZ2RA/ceP/Xd/vXrNH7xFxG1mfw2BEk3J2LPmN1HA=; b=HnzXP/00gNuvA/zcvu4tlwAzj/zpvg1BuDx1APub+2gQacu9CdA7yOk6HNZxZ89x8s 4TwuJ672vDM+sLHBlMxHLSY3SmK0dLv59q7hNITOlqwg5xvPAmUt6WK6hZ0zA9N4/FFd rOG4C71/sGxQNOBHuyVF1k36LSeBSKy/RlMU3bm2kR/XW4cKcRQ/Ju1mElcI7Xi2OVNn c0oxdrbdNOz4DnMCsjO8wEHUe6uyF3jUGFEq583T290M6S4/vohXcjFl3Yc02VnTfAUE R2pk8qD/7mvwKgWz68Dcyib4Mg67i4zuhnU00hzFrn45o1mCxbGyFcUEtx2lSkw3OeeO fMvA== X-Forwarded-Encrypted: i=1; AJvYcCWnFORyMlb6iAftMO1ic3MsQBJo5CGpMPjP5EHjMscd/sDtbnKHVjCVDsRI6OsYdjLZLi3ugV7WqTzw/nA=@vger.kernel.org X-Gm-Message-State: AOJu0Yw2Bxn3crqTzFMlMJsAQ71kfFWgb4Xz8NEtbhuFva5iDohdmoAm T0ypu9oZhKqnb6XvjaN1wOg7DaNNFYNUXM/57wcoVXss+2Vf4SW2+T7v X-Gm-Gg: ASbGncuy0zWEwk2lqpwJzpJF+MmSkVm1EdnvZ+B+Xt2NzmiZal3ZV6VwF9cklXfi75Z 2K/F5RLjQhSTw88S1ZjUbAUkAvYohZMZjf0DnxnLrVMnJbCeQtlb8Ts/SPAUJs6eibljbwyhF+C +kuJ4FXr72/bWRLt5NecDRXQc/RanHlkg9EvReH3QieuL6GW+vENwkDyytqI/wqbFXNwQBM0dwC iA+cuCpq1aV8+gtZ8GEbkwHFE1iOUDd1TJaApfdfj6L2/68i1uFFwRKYSVwQtbXLbH9zsRNYhk4 IqWGAdFNkyoLRB31Tftjj7r+dGvzt3EbS9Y9p89vIG9cMvMrnCo+cDGTwjzOFTKle8cokdnXa8b heUsPZ3TAyirP5OEbznyae/Qj1S5qR3K5hNM= X-Google-Smtp-Source: AGHT+IF25l3C1E8p5GHeNvlIVkbp0kOIYt1wPzTaRq0s8H1fBwmcnKLuf8G6T/dCuiyhKBgfSsTJeA== X-Received: by 2002:a17:90b:2b46:b0:32d:7093:7f6b with SMTP id 98e67ed59e1d1-32de4f96188mr2888054a91.30.1757672003490; Fri, 12 Sep 2025 03:13:23 -0700 (PDT) Received: from localhost ([185.49.34.62]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-32dd98b3ea0sm5091462a91.18.2025.09.12.03.13.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 12 Sep 2025 03:13:22 -0700 (PDT) From: Jinchao Wang To: Andrew Morton , Masami Hiramatsu , Peter Zijlstra , Mike Rapoport , Alexander Potapenko , 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 v4 17/21] mm/ksw: add silent corruption test case Date: Fri, 12 Sep 2025 18:11:27 +0800 Message-ID: <20250912101145.465708-18-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250912101145.465708-1-wangjinchao600@gmail.com> References: <20250912101145.465708-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 new test scenario to simulate silent stack corruption: - silent_corruption_buggy(): exposes a local variable address globally without resetting it. - silent_corruption_unwitting(): reads the exposed pointer and modifies the memory, simulating a routine that unknowingly writes to another stack frame. - silent_corruption_victim(): demonstrates the effect of silent corruption on unrelated local variables. Signed-off-by: Jinchao Wang --- mm/kstackwatch/test.c | 96 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 95 insertions(+), 1 deletion(-) diff --git a/mm/kstackwatch/test.c b/mm/kstackwatch/test.c index ab1a3f92b5e8..2b196f72ffd7 100644 --- a/mm/kstackwatch/test.c +++ b/mm/kstackwatch/test.c @@ -20,6 +20,9 @@ static struct proc_dir_entry *test_proc; #define BUFFER_SIZE 4 #define MAX_DEPTH 6 =20 +/* global variables for Silent corruption test */ +static u64 *g_corrupt_ptr; + /* * Test Case 0: Write to the canary position directly (Canary Test) * use a u64 buffer array to ensure the canary will be placed @@ -61,6 +64,92 @@ static void canary_test_overflow(void) pr_info("canary overflow test completed\n"); } =20 +static void do_something(int min_ms, int max_ms) +{ + u32 rand; + + get_random_bytes(&rand, sizeof(rand)); + rand =3D min_ms + rand % (max_ms - min_ms + 1); + msleep(rand); +} + +static void silent_corruption_buggy(int i) +{ + u64 local_var; + + pr_info("starting %s\n", __func__); + + pr_info("%s %d local_var addr: 0x%lx\n", __func__, i, + (unsigned long)&local_var); + WRITE_ONCE(g_corrupt_ptr, &local_var); + + do_something(50, 150); + //buggy: return without resetting g_corrupt_ptr +} + +static void silent_corruption_victim(int i) +{ + u64 local_var; + + local_var =3D 0xdeadbeef; + pr_info("starting %s %dth\n", __func__, i); + pr_info("%s local_var addr: 0x%lx\n", __func__, + (unsigned long)&local_var); + + do_something(50, 150); + + if (local_var !=3D 0) + pr_info("%s %d happy with 0x%llx\n", __func__, i, local_var); + else + pr_info("%s %d unhappy with 0x%llx\n", __func__, i, local_var); +} + +static int silent_corruption_unwitting(void *data) +{ + u64 *local_ptr; + + pr_info("starting %s\n", __func__); + + do { + local_ptr =3D READ_ONCE(g_corrupt_ptr); + do_something(500, 1000); + } while (!local_ptr); + + local_ptr[0] =3D 0; + + return 0; +} + +/* + * Test Case 2: Silent Corruption + * buggy() does not protect its local var correctly + * unwitting() simply does its intended work + * victim() is unaware know what happened + */ +static void silent_corruption_test(void) +{ + struct task_struct *unwitting; + + pr_info("starting %s\n", __func__); + WRITE_ONCE(g_corrupt_ptr, NULL); + + unwitting =3D kthread_run(silent_corruption_unwitting, NULL, "unwitting"); + if (IS_ERR(unwitting)) { + pr_err("failed to create thread2\n"); + return; + } + + silent_corruption_buggy(0); + + /* + * An iteration-based bug: The unwitting thread corrupts the victim's + * stack. In a twist of fate, the victim's subsequent repetitions ensure + * the corruption is contained, protecting the caller's stack. + */ + for (int i =3D 0; i < 20; i++) + silent_corruption_victim(i); +} + static ssize_t test_proc_write(struct file *file, const char __user *buffe= r, size_t count, loff_t *pos) { @@ -88,6 +177,10 @@ static ssize_t test_proc_write(struct file *file, const= char __user *buffer, pr_info("triggering canary overflow test\n"); canary_test_overflow(); break; + case 2: + pr_info("triggering silent corruption test\n"); + silent_corruption_test(); + break; default: pr_err("Unknown test number %d\n", test_num); return -EINVAL; @@ -108,7 +201,8 @@ static ssize_t test_proc_read(struct file *file, char _= _user *buffer, "=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\n" "Usage:\n" " echo 'test0' > /proc/kstackwatch_test - Canary write test\n" - " echo 'test1' > /proc/kstackwatch_test - Canary overflow test\n"; + " echo 'test1' > /proc/kstackwatch_test - Canary overflow test\n" + " echo 'test2' > /proc/kstackwatch_test - Silent corruption test\n"; =20 return simple_read_from_buffer(buffer, count, pos, usage, strlen(usage)); --=20 2.43.0 From nobody Thu Oct 2 19:01:00 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 6A3632E283E for ; Fri, 12 Sep 2025 10:13:28 +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=1757672009; cv=none; b=RxLJruAR3D+OrP0WC8z52U8NjycbLV6GKq+j2cg80m2xEuz+N4egIQjj2G1Oscx/hLkIbGswJLkqOwbW4Jz29DtNGdMUyy8tk3VCpEu2Jo6YUcT/0VZhqOb08e/ETx3Ydyn69V5Fi8F/KfMpBGqtYNYzqHgHAxjrlLZM80rANKI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757672009; c=relaxed/simple; bh=k6timgyy8B4GPUl9IUPi95Oa04aVieHJCexEN+DVT5A=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=DD2nzuGLpBKEUuU3E8C6bi9JQhj9wglYGWpcjLmuPLa3XN9HSTbeJ+KJ0MQLxdOWGMZ/JVA2qbM5G2Q67eldRMrFsPi8Qz4rk/bAy8M39jA3faYG0Fgk5QsbMGasqH0jb+4kPDFHFXmdSRFWyHFgJQ9G1PTcGVOoZL7RKH1vCe4= 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=MwL2Tz0X; 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="MwL2Tz0X" Received: by mail-pl1-f182.google.com with SMTP id d9443c01a7336-24458272c00so18783795ad.3 for ; Fri, 12 Sep 2025 03:13:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1757672008; x=1758276808; 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=C5u/a2s8j5yqiSFbkPas+Re9l+zCPojPRf0oLtuMcdk=; b=MwL2Tz0XVsS+r5ozTCrIlMb06yMsEs8UVob0h1JVcrLV+Z3G355tyMmhBvyDldpfwO gn8PhuE70WA82Rrf4h+uTDiOkgIWnz+qN9b/HBSlPHHODyImOSkbwI8dMr7G6Z/iojfn hDKzeJLbX2gJ/Rmk59EpxX5GRVhwBdoqmH8OpjlNd7GyliXwnoeXtnl8MWvA/n9VCiHX GTovlx31S0rHMtYXf/Za7qkPTd091638SUjb7coZoMWdvCv2h8PJm867sYRfE2+uL7xN yUfme2a6ytDj7+yW4s1GG4ZDlEa92fHzLZPjEPvVTJMXE/lKW2GqRv2d+iZufspPfZYF Jwjg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1757672008; x=1758276808; 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=C5u/a2s8j5yqiSFbkPas+Re9l+zCPojPRf0oLtuMcdk=; b=l79270Um7k3x1KF6mbq3EeXVroQ0pnwT9x074yuWMO5iamAAsAovQt/d1atzGPsCeK 5WG9QczHz3x2CbnpECtfap6h+CUInEF8pQFKd0jrT39mFcO+koZVg7/QmXtfcwtW4N8I 6gTej/hJaWtw0Nh6gXuWL/+6d2GSKqvDTgYrdIAKF44MkMAWFAcfu0ork9JWA9sm7TEk XL2Av7GYmdZk6QHZPwZKDLhOzgzkuCkjWkSpxBzNM3MH2hgtsD5sdwNC7KaqdmG0UVUl gZLPqIc4ZgrXlIJYVpIyWFPlJJ7qqHdRNV+hwJNnCl+p+rvrGgDBJDX17hMITvxELCaS jA/g== X-Forwarded-Encrypted: i=1; AJvYcCWWwb6SnJKQl0TLdCJ6cgrabwIhOKvbGjtCG2QGFnGii0OJ80MV4gOGkHViSudMAQojfNIqMoCYraKLP4Y=@vger.kernel.org X-Gm-Message-State: AOJu0YzC+0QcF9zkk06hEL4/Lx3VIEmvLBML46mt83BLv3LQaCoHNf7b OlLc1dyywoQCiMhtauLqtgyWffCslJsNCkZgd3Ko6A3WOzQH9lsgN8Y8 X-Gm-Gg: ASbGncsvYmuFfn6rVFQEhTAVcihGKtqvurOdVQG5OnpFRvzwElYpPxG3yfDJvceiEnH JO35I3wmXPQZH/8D0lPHvLKOlEGRpuzGgm1zuNxtXicCYQlWfVc8oeH20O5y5IsNv0h8K2ZjQg1 T4KWyCtgZiiIRxVwI3HTN+G/tP1wMfuIy8TTfJdhkhMKN9W48m/Ojn6TDRKq6Ke4wge3+JzkNcO nhWI0+Nn8zCBmk1Id7i5q7WJgoUe1klt+Http8Bk1xmnxdxITCH1A4MGVKDPpPmAu4Dv9w7lwGH Iuapy5V4F3p/miEyrjYj2fZZjwfGFvQFGRYHBjhV9ZXvFcW2vElMWgwTIMr72RdNw6rsGfaC28q Q3TKp5ilEMsmyf4b3iqqpjhbfUKnUsrITdBw= X-Google-Smtp-Source: AGHT+IHfq4U4MFqDIc6ZxO6yNatWwL7n6+/zPGuAMGcOfOLtnumo4rnkiu74aB1UWkUMdayihYaGMA== X-Received: by 2002:a17:902:ebc2:b0:24a:ceea:b96f with SMTP id d9443c01a7336-25d24e9dc1dmr34403925ad.24.1757672007735; Fri, 12 Sep 2025 03:13:27 -0700 (PDT) Received: from localhost ([185.49.34.62]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-32dd9509002sm5179465a91.0.2025.09.12.03.13.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 12 Sep 2025 03:13:27 -0700 (PDT) From: Jinchao Wang To: Andrew Morton , Masami Hiramatsu , Peter Zijlstra , Mike Rapoport , Alexander Potapenko , 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 v4 18/21] mm/ksw: add recursive stack corruption test Date: Fri, 12 Sep 2025 18:11:28 +0800 Message-ID: <20250912101145.465708-19-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250912101145.465708-1-wangjinchao600@gmail.com> References: <20250912101145.465708-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 test that triggers stack writes across recursive calls,verifying detection at specific recursion depths. Signed-off-by: Jinchao Wang --- mm/kstackwatch/test.c | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/mm/kstackwatch/test.c b/mm/kstackwatch/test.c index 2b196f72ffd7..3e867d778e91 100644 --- a/mm/kstackwatch/test.c +++ b/mm/kstackwatch/test.c @@ -150,6 +150,27 @@ static void silent_corruption_test(void) silent_corruption_victim(i); } =20 +/* + * Test Case 3: Recursive Call Corruption + * Test corruption detection at specified recursion depth + */ +static void recursive_corruption_test(int depth) +{ + u64 buffer[BUFFER_SIZE]; + + pr_info("recursive call at depth %d\n", depth); + pr_info("buffer 0x%lx\n", (unsigned long)buffer); + if (depth <=3D MAX_DEPTH) + recursive_corruption_test(depth + 1); + + buffer[0] =3D depth; + + /* make sure the compiler do not drop assign action */ + barrier_data(buffer); + + pr_info("returning from depth %d\n", depth); +} + static ssize_t test_proc_write(struct file *file, const char __user *buffe= r, size_t count, loff_t *pos) { @@ -181,6 +202,11 @@ static ssize_t test_proc_write(struct file *file, cons= t char __user *buffer, pr_info("triggering silent corruption test\n"); silent_corruption_test(); break; + case 3: + pr_info("triggering recursive corruption test\n"); + /* depth start with 0 */ + recursive_corruption_test(0); + break; default: pr_err("Unknown test number %d\n", test_num); return -EINVAL; @@ -202,7 +228,8 @@ static ssize_t test_proc_read(struct file *file, char _= _user *buffer, "Usage:\n" " echo 'test0' > /proc/kstackwatch_test - Canary write test\n" " echo 'test1' > /proc/kstackwatch_test - Canary overflow test\n" - " echo 'test2' > /proc/kstackwatch_test - Silent corruption test\n"; + " echo 'test2' > /proc/kstackwatch_test - Silent corruption test\n" + " echo 'test3' > /proc/kstackwatch_test - Recursive corruption test\n"; =20 return simple_read_from_buffer(buffer, count, pos, usage, strlen(usage)); --=20 2.43.0 From nobody Thu Oct 2 19:01:00 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 A14552F3637 for ; Fri, 12 Sep 2025 10:13:33 +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=1757672015; cv=none; b=p+PnTxzMRbgxnlRTq4S9IoSNVP28ZMNqr1ITYGJh1jXRvhoG8nhdfcZdGMim9t3U6JtPVaALOKqxrQzc11Ie8iTNEyHiMZ8DXBWWi91cuiVu2jyuNdu9akfLnKMRatZpv6OxJVPkGncJSzD/+GdWezTiTh4EjMiU7adF/YjT/sw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757672015; c=relaxed/simple; bh=CEdClddGjVYx6HjPNGBFPBiAS3jsMfpyA1eRZqyA0js=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=KRM0yrGFmOwczVsZtbe0Ma25Nsw1tdgygzIao/nhfuw9Ass2rrY9dWbOnGtDm3IO/KSl9FYVW7BYh8aCf0WTSIM3XcVwaS6iueJc34rbjWEd2JBmpo6EVLkFF0qXd3mL0+Wg0cqIB/3gXeWK9Xdr31xwmVJK8+gB2ZfNGdSZSYs= 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=Phu1ClwF; 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="Phu1ClwF" Received: by mail-pf1-f175.google.com with SMTP id d2e1a72fcca58-7726c7ff7e5so1636127b3a.3 for ; Fri, 12 Sep 2025 03:13:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1757672013; x=1758276813; 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=pqWZ4PXPvcwGUSVpTO1OvKWC6TpQO7QLp3apqR6W4A4=; b=Phu1ClwF/WaPaErJMaPhPDE6D9pREb2vKlFKCLG5/QTZ5EdiId+kOCcrawUXVD8G5V Pqqmk5rFdMAPtDfGRKFTiKiak4JjE+aqt4sg0bTSJqBnr8RV3L5xuG83kAtC94UpfP+n 85uQ/GHXtIx0dXdxFQvzbKVNKIoBgBXmr3jAQrlCBtpz25JZf1gA0UAPXwbi0kan6cNQ YBwVyySuufVCMJYdzT04jsSuShSH2IqpDjs24IJrY0Jxs5EZkMKphHYKfJhhLzdJNEVL TQFy49G2jYxADX+XY2xkM5tK5UO6JYKAL0AEiEVzPr8dJNk6v7iQjw85MFvB6oG5vJ/e cElw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1757672013; x=1758276813; 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=pqWZ4PXPvcwGUSVpTO1OvKWC6TpQO7QLp3apqR6W4A4=; b=H7/IO1KD2FZj/Kw6OAak8B2gAovTSMkhv2tvOr5GVLmlizFR6kU409kecBidjDzqkS wB/LWUQPdHMlvPSi0IWtc86pUH//QcnCkPR/DshTOx4lSVWwjQFM2sJCNxgRsEO1TORL 01zbBkJLdMZAL+m/P8m0DzoZQZwCWNg5CrdSlHKP0spyLI1BUo6uVCyqHXOwOWoUa3XR jgTGmVpQenGHIJZbX6qJKSrCu8qOobMrdh3lXmt7bw2jPbOdjGtyvvscdWIxsu/ZaglX 1GEyVBvyrlACvYntrxrZ+5Q1bO3PHMu2u4oxJG7uSF1S+JzZLMMn0Pm1nX7TRRCIILSS becg== X-Forwarded-Encrypted: i=1; AJvYcCUaZ5pkTLhb8cvtDM7oiLt9xmKxifzXHRdG/H4XQ3KANo2C7JqYXtUVRbd4LnTxk/3jGT9pXi5jrK3gzHM=@vger.kernel.org X-Gm-Message-State: AOJu0YwisJtBDw1A3Wo8uRYYqQJCwGVAzKzHXwJw17olzBumSR4Sev7y p9QCAmmbuaaNxwW7Rq5WjA6PiErQV1qIX5okzLaHY3HDlfw+QJTAiw3W X-Gm-Gg: ASbGncv+4fqgIf9ktRlQoKEompZ2qvWrB39nJ7Jo8TRGlRymI65tHqUH7V4RC/nA1WK v/1wLpEAolWUFLrHC8QcfWPo0SGoGhijNU4ysjqFOcvVQ6EGPkEB1mVQH8IU3jktmeokphgTb6d 6unPYIxkIHxU+4eauxHw+avjAbTl6VTgEC7+/ekv5iOi/yp98MA1nuiviO+hc+vj5yIgfU6fdb9 WhmuTVcmiNlVa1YJHR9upjEk7nlCrVxp43CceOkWhGnhLZ8QOye0OvUfED2GHQxQodVaw/Sfenz Q/t1lrYZbwlu1AX9c7lbE4pUMzOe/vJOpE2pFmdtJ8FQZdRVjaPgNyhjUaGmeRjz7Be/RQo4uR5 Pz18y0GFfE90urkJaJJuCd/kcEMhHVEahGBk= X-Google-Smtp-Source: AGHT+IGdi0rU6u6yk/5j3je0obUk9yox4MEj0mpe+W9QIz9sLwr6j5n+alC3GBSeGbtzXzFiSEwqsw== X-Received: by 2002:a17:903:37c4:b0:248:811e:f86c with SMTP id d9443c01a7336-25d26663209mr26113005ad.34.1757672012838; Fri, 12 Sep 2025 03:13:32 -0700 (PDT) Received: from localhost ([185.49.34.62]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-25c3ad33e1esm44309995ad.105.2025.09.12.03.13.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 12 Sep 2025 03:13:32 -0700 (PDT) From: Jinchao Wang To: Andrew Morton , Masami Hiramatsu , Peter Zijlstra , Mike Rapoport , Alexander Potapenko , 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 v4 19/21] tools/ksw: add test script Date: Fri, 12 Sep 2025 18:11:29 +0800 Message-ID: <20250912101145.465708-20-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250912101145.465708-1-wangjinchao600@gmail.com> References: <20250912101145.465708-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 | 40 +++++++++++++++++++++++++++ 1 file changed, 40 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..61e171439ab6 --- /dev/null +++ b/tools/kstackwatch/kstackwatch_test.sh @@ -0,0 +1,40 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0 + +echo "IMPORTANT: Before running, make sure you have updated the offset val= ues!" + +usage() { + echo "Usage: $0 [0-3]" + echo " 0 - Canary Write Test" + echo " 1 - Canary Overflow Test" + echo " 2 - Silent Corruption Test" + echo " 3 - Recursive Corruption Test" +} + +run_test() { + local test_num=3D$1 + case "$test_num" in + 0) echo "canary_test_write+0x19" >/proc/kstackwatch + echo "test0" >/proc/kstackwatch_test ;; + 1) echo "canary_test_overflow+0x1a" >/proc/kstackwatch + echo "test1" >/proc/kstackwatch_test ;; + 2) echo "silent_corruption_victim+0x32 0:8" >/proc/kstackwatch + echo "test2" >/proc/kstackwatch_test ;; + 3) echo "recursive_corruption_test+0x21+3 0:8" >/proc/kstackwatch + echo "test3" >/proc/kstackwatch_test ;; + *) usage + exit 1 ;; + esac + # Reset watch after test + echo >/proc/kstackwatch +} + +# Check root and module +[ "$EUID" -ne 0 ] && echo "Run as root" && exit 1 +for f in /proc/kstackwatch /proc/kstackwatch_test; do + [ ! -f "$f" ] && echo "$f not found" && exit 1 +done + +# Run +[ -z "$1" ] && { usage; exit 0; } +run_test "$1" --=20 2.43.0 From nobody Thu Oct 2 19:01:00 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 4EFC02F49F2 for ; Fri, 12 Sep 2025 10:13: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=1757672021; cv=none; b=nA+cdZVP0/0r7tFM5DU3OeidARpzZ+YvLcrL756dK1CGKXkzo7JLqO69gewcWjiez/OP+O9GnMAS0P2xYQ0Bx7IMHk6+KIXtjEW+d5gn2P0864fbiyZBZbkTLFa7zwSFbH+aEtSWXetLpZQZh5qWL1yJVxImGqO5ZFFh22bcJQk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757672021; c=relaxed/simple; bh=L9AjRhWN6K9GCJF/+6ZwgVizRNTCCmqDO7KY/KLz4NY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=b6KsgR60AwuP4ivMvA776YOPLhx7KZZ7m0mTF0hc9FEGmlVRiwMbN22qhS7Wr97la70rboRn/isQ2S8hFm08wU4RvXRJ1tPML+ZQ4QkbPyRxFg1nm8PJ81qIDmsoOb1EdPMm/Mcl3Z/R7j2GzjNw9Y9Qi9q2hr5cYDZJfnGl6fw= 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=mFcT3Mu+; 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="mFcT3Mu+" Received: by mail-pf1-f170.google.com with SMTP id d2e1a72fcca58-772627dd50aso3215363b3a.1 for ; Fri, 12 Sep 2025 03:13:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1757672019; x=1758276819; 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=bn+/3FE5CmsLxOS0M5YahrLvDpar54OOYFHjkWGVE7o=; b=mFcT3Mu+4XaIgX/307J8T/feRXCtKSlmr8rq0uqDMPSSn0EAMlJuXBWFXCfHAsdedC K7rbCAdFHZ3qgXKwj2p9tN6m1WyJQdJfLLW2jk8po1Qd60supsMKC3EbZCJdh7kcFPNz mfRFESI/s+5fLJeU/QPjbnI2HddOBTQjRR4+6ARjuTZVsouZU1N73kj6dp2IJUJFnv3z NsrkmHRBsrp2gDc7JaFgGds1iXFyKyI8GgFtlsUpsIlBnrzMjjcX7ZPqfAq7yAQwCEih Ssp02dAy6oK/bzgNpnzABus6U4OfFaWsV7R4u9jHT9yKmszlSTZkS8tOed28cT0Mv1vH oMkQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1757672019; x=1758276819; 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=bn+/3FE5CmsLxOS0M5YahrLvDpar54OOYFHjkWGVE7o=; b=tLgQwbyccTsw2Almr3ZTRkZdBw1xbEFdoVtEI/neQ5AvQwP8wG4o2w8g0ytORD9tpD SO/TBI4xh1N8gvZvWWHbRtP3RT9UcMr6zGQLvUwbr1EkcsQa5MGs7U87ke1qYHr+DhQ2 qYPLSReYsyDAMRMVO+iZ950yhDc9pbfSMM6NH5q7CdlJ+lowtGRAxo5B3bDnAPm4t9Tm 6lzqZjUzLQ5PTX6UQXJL9vJ+N+TslrIFQXNFOqtLv+YfVtbUS2oLwupP+Qh8dNUoQL2a peQTwY17ABFoWUEsJB5OZdn+ftYzYRWppXDEL++9oOrvmN6eC/5x5arIhLy1Jo48s2Qe yL4g== X-Forwarded-Encrypted: i=1; AJvYcCWSEdQNZhwvDKELAhqikqVwHVZdasPnX2Z7GF5nVcVAkVAu77nZsz8qzkX68MO4zNaCYZ7zvzpdEj0wHOM=@vger.kernel.org X-Gm-Message-State: AOJu0YzkDOzqEsA8U1Rb+RK8K3LLfWpDSrLG/Pmj66iZrNrGwKuYZ5Xp AuTiC1aRJwkxbrtVPdSU5SqNeHpTWUytJecECQf2cH6l2Q+UfoKHsKCK X-Gm-Gg: ASbGncvuIvTYSlJ4owP4fklRNFo7wxBq/LxHl1yrcA9Lq4pLY7dtmPRRUtcF3n/wBQU njW3+OK7NIJW9a5lkf5yQrVrcSxZpQWVG3dO6vzlBwaqqDSssyKdQowkK3DJqKdmvZCOD5CRFkd F8N61cYMzp8Rs02e4clngOAHTBfFVWPMmrHj+Qb4BaVYzjzJ62xQ13Opq/qLgdsdLo8pHROnldD jOi2UuAzcryrKfnel33B+r5VCWxT2ylrfT1qbIeYLxq75OfyeuVNBFTJy1XVi6ahb1srTTfNJZo LyMU8LXRMbYTkemhJjTIRcUaXWkS/N+G3/NLyp374udxxwlhx9CKBY1/cZCDY6hpPWOovuzljw9 O5IqaX50O4fiwRXeagvCqFhaLMCsOfuZfc54eZBmM3xzqUPPTiZjGrXYC X-Google-Smtp-Source: AGHT+IE9hLw78GXki+Z9/2VgA5oux+LKfhhFZu5WvV1JUasShceVOJ3liaB3nQw7f//NCPosPLRn+w== X-Received: by 2002:a17:902:ef46:b0:246:571:4b51 with SMTP id d9443c01a7336-25d2da1100dmr32684915ad.29.1757672018598; Fri, 12 Sep 2025 03:13:38 -0700 (PDT) Received: from localhost ([185.49.34.62]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-25c37293f0asm45182095ad.43.2025.09.12.03.13.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 12 Sep 2025 03:13:37 -0700 (PDT) From: Jinchao Wang To: Andrew Morton , Masami Hiramatsu , Peter Zijlstra , Mike Rapoport , Alexander Potapenko , 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 v4 20/21] docs: add KStackWatch document Date: Fri, 12 Sep 2025 18:11:30 +0800 Message-ID: <20250912101145.465708-21-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250912101145.465708-1-wangjinchao600@gmail.com> References: <20250912101145.465708-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 new documentation file for KStackWatch, explaining its purpose, motivation, key features, configuration format, module parameters, implementation notes, limitations, and testing instructions. Signed-off-by: Jinchao Wang --- Documentation/dev-tools/kstackwatch.rst | 94 +++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 Documentation/dev-tools/kstackwatch.rst diff --git a/Documentation/dev-tools/kstackwatch.rst b/Documentation/dev-to= ols/kstackwatch.rst new file mode 100644 index 000000000000..f741de08ca56 --- /dev/null +++ b/Documentation/dev-tools/kstackwatch.rst @@ -0,0 +1,94 @@ +.. 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=3D=3D=3D +KStackWatch: Kernel Stack Watch +=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 + +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 helps developers capture the +moment corruption occurs, rather than only observing a later crash. + +Motivation +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D +Stack corruption may originate in one function but manifest much later +with no direct call trace linking the two. This makes such issues +extremely difficult to diagnose. KStackWatch addresses this by combining +hardware breakpoints with kprobe and fprobe instrumentation, monitoring +stack canaries or local variables at the point of corruption. + +Key Features +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D +- Lightweight overhead: + Minimal runtime cost, preserving bug reproducibility. +- Real-time detection: + Detect stack corruption immediately. +- Flexible configuration: + Control via a procfs interface. +- Depth filtering: + Optional recursion depth tracking per task. + +Configuration +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D +The control file is created at:: + + /proc/kstackwatch + +To configure, write a string in the following format:: + + function+ip_offset[+depth] [local_var_offset:local_var_len] + - function : name of the target function + - ip_offset : instruction pointer offset within the function + - depth : recursion depth to watch, starting from 0 + - local_var_offset : offset from the stack pointer at function+ip_offs= et + - local_var_len : length of the local variable(1,2,4,8) + +Fields +------ +- ``function``: + Name of the target function to watch. +- ``ip_offset``: + Instruction pointer offset within the function. +- ``depth`` (optional): + Maximum recursion depth for the watch. +- ``local_var_offset:local_var_len`` (optional): + A region of a local variable to monitor, relative to the stack pointer. + If not given, KStackWatch monitors the stack canary by default. + +Examples +-------- +1. Watch the canary at the entry of ``canary_test_write``:: + + echo 'canary_test_write+0x12' > /proc/kstackwatch + +2. Watch a local variable of 8 bytes at offset 0 in + ``silent_corruption_victim``:: + + echo 'silent_corruption_victim+0x7f 0:8' > /proc/kstackwatch + +Module Parameters +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D +``panic_on_catch`` (bool) + - If true, trigger a kernel panic immediately on detecting stack + corruption. + - Default is false (log a message only). + +Implementation Notes +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D +- Hardware breakpoints are preallocated at watch start. +- Function exit is monitored using ``fprobe``. +- Per-task depth tracking is used to handle recursion across scheduling. +- The procfs interface allows dynamic reconfiguration at runtime. +- Active state is cleared before applying new settings. + +Limitations +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D +- Only one active watch can be configured at a time (singleton). +- Local variable offset and size must be known in advance. + +Testing +=3D=3D=3D=3D=3D=3D=3D +KStackWatch includes a companion test module (`kstackwatch_test`) and +a helper script (`kstackwatch_test.sh`) to exercise different stack +corruption scenarios: --=20 2.43.0 From nobody Thu Oct 2 19:01:00 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 A00092F5462 for ; Fri, 12 Sep 2025 10:13:44 +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=1757672026; cv=none; b=HJH9pQpJQUgWp2NqDzLysSUbtsS/ueU27ss6yy2wPwU40qGw0z+FD/bU8FoHZC82ctha/I7P6qVUnFNbIAXwuHzldacZ5M2gZBTTPwFi/mFup8ui9tVxfcrjZwaOfiAzzpn0BNJBxoyLEnV8f9u6TlNLgkjz8XRrM7+fnzs7VV0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757672026; c=relaxed/simple; bh=Y4IVRGt4gY6CeNENuQfFMwDoOjrFFT/8PJdPjuvJ4cs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=pdHTtXk6L70W8PSrD+XAjsr+Yi/iK+IDdmwo0wmjI9rLV0hUBujLmE+OKpUJ+siDcjEtzhmYm6PlC0iASAw+v2su67o5Mwb8rORxw8TWek9wCBb5Esg404R9l3qoQEZVO914M3xugyMjwVgZwU6xSIQgUoD15x3OMfHRC/GHMfk= 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=BqB0A8Nr; 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="BqB0A8Nr" Received: by mail-pf1-f173.google.com with SMTP id d2e1a72fcca58-77251d7cca6so1708202b3a.3 for ; Fri, 12 Sep 2025 03:13:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1757672024; x=1758276824; 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=I55bZq7ZFzzpD1DxoyTRdsSYeFKQhRWPVd7TpHbtt7w=; b=BqB0A8NraNWmI/g9eWEjwuUs03vZr+6jF1scr8Z0C0j3tZlufwEalQgqxouGTUTUAx QFn4nayB0gwNYyI1P4qat2hjPKoMHGUf/0NWH/FCW5n4DcaVVb54106BIZv1l9kY4Pzu Kpsc7UO3nd0yzNxIqBApWfFYgrykwBKdJX98Ukx06IPIpzg+dLuvL0rEvXWwY7LzEUvV GSZfrHOPVyo+RXZmH+nyxRU7GHns5QWPhUKbioZUjK/IW8qkYT7HQa6+FnlFh0P9KG1R bkzpf6rb23CJoWsTu7iXTKyu7eEiRKcPnJxbzIJJhN7JYodBIMgK+t5f5nErohzICzXL hlYA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1757672024; x=1758276824; 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=I55bZq7ZFzzpD1DxoyTRdsSYeFKQhRWPVd7TpHbtt7w=; b=HH9H/9qtGGW4j0OP+LEqxBa9I3WtGxMUlcSBba9f9OkmVN6NP6vvM9Absi2JI1D7U5 QqudXJiPUVRAghMO4kOlNX7rLqiy/utCFEMB1OCwSZytuDGgrkeo1Rhi9084oFbocZMB yAQVPpVGi4Ude2s1etYnTj8FsKVXIeLDgDLmWTdCJQ0rFhoYRy+SXdO6OHovUYfflurk TLlcFgE5ewvS6y0MnXo/wzMOsTA3q0gxxtvnl6lL0R41petJeNX0P8VovA/oMax8q+T9 BmvruevM4ZpHKHLnKZLgCR0Mm01q12yUkNZxqZ20vU8IudyOx4MLRThzQn7gOgeUy4qt CLLw== X-Forwarded-Encrypted: i=1; AJvYcCUxtyCounVuFN6a1UseKQ0ZmgSD2SyIgO0YMmKH8LY8vWdsh1WpdSEK8NROw7fnXmQQuF6i6tl2X9H4UaI=@vger.kernel.org X-Gm-Message-State: AOJu0Yz3SCgdi3HQWJcrQEWDzrzAcqG9UuvarqTZgJlzy5gkbIqNyW2W M/GKit2jahpOWe6Ep+GxXsgTyrFgHYiYn5+Pjiqp9xPEJhpmVPfoszms X-Gm-Gg: ASbGncseM0uvUf+Ae1DgvphmL9io0xwKcWg/7nKw0TQZlYqn1VTpsX+uJSQBinue19x bZlxucu++1ap/F/NV1Nczt5gSJomdj6CEQgHQBOD/aA/7HuQiIBVKG8Ltqje4Uw02E0s+gdSeR5 ZX9cBcCvDw81zybEDc76nUwbDHMBcI75Ec4J+6Gl+Pa7ZpTsat6t6hx2FBdye0ux9ZbqBkSrJXv KZfihmb46Nj7uNF1CZUg9CwCqpHHZdUKkDMYTI50SP2n5I23+Mi5eU4ZbITWBJNhjSj0iixOsFh K4ddKi6urUBUGEcyozdDSmaaex6Nwj95gsvclCeMrt2pt6HQkAMZw1q3janLIKoAVoFWxm3VZfC SQ9T/H0urzMZZVONj2OsQ5CcCueL3P6N847BP6hoMh08crQ== X-Google-Smtp-Source: AGHT+IEmU8/7QYE28ulPnmQWl8v4TOjFN/LND+vjp/ORoshKulgXE7ro2NJTOczUKB1xsXbgHPgJeg== X-Received: by 2002:a05:6a20:734d:b0:24f:53e8:cca2 with SMTP id adf61e73a8af0-2602cf104d0mr2912224637.60.1757672023846; Fri, 12 Sep 2025 03:13:43 -0700 (PDT) Received: from localhost ([185.49.34.62]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-b54a3aa0f8asm4307035a12.48.2025.09.12.03.13.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 12 Sep 2025 03:13:43 -0700 (PDT) From: Jinchao Wang To: Andrew Morton , Masami Hiramatsu , Peter Zijlstra , Mike Rapoport , Alexander Potapenko , 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 v4 21/21] MAINTAINERS: add entry for KStackWatch Date: Fri, 12 Sep 2025 18:11:31 +0800 Message-ID: <20250912101145.465708-22-wangjinchao600@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250912101145.465708-1-wangjinchao600@gmail.com> References: <20250912101145.465708-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 cd7ff55b5d32..1baa989abf2d 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -13355,6 +13355,14 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/g= it/shuah/linux-kselftest.git F: Documentation/dev-tools/kselftest* F: tools/testing/selftests/ =20 +KERNEL STACK WATCH +M: Jinchao Wang +S: Maintained +F: Documentation/dev-tools/kstackwatch.rst +F: include/linux/kstackwatch_types.h +F: mm/kstackwatch/ +F: tools/kstackwatch/ + KERNEL SMB3 SERVER (KSMBD) M: Namjae Jeon M: Namjae Jeon --=20 2.43.0