From nobody Mon Feb 9 08:55:40 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 46DFC239E83; Tue, 10 Jun 2025 14:59:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749567598; cv=none; b=p1D3ZQT2m092ZNcJJ/NRFB2g9OHkf8Njlrr6ftrsOgGULJOlZKwisdXBOBhx4vI0Z+QW0lUw/S48Fo5WkTCgQGeDcPqk8iGMzRe2CAL6fF/r7Pe6/aVa1wqHnVDt61Oj78Lon3yVvF5BL4zOnXvMAR0vtSTAbPH2oOJr4TNWf34= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749567598; c=relaxed/simple; bh=7m03JAiZi1htmYekkvb9rqbrYXBGjMPA6O2hU2YNZfg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=eRse7GjUbmFM2xxh3pGrKF+5I+PebwQ4i/PfEuVHQPwxhVdC2QokyhWJWJ5hCDvDCPzWk4rZyYL/YMFVdcXtx+xuaqjj+mh0AtfXTjFZXb3f/6GJ1YoV3FxfIkWuZZNT2QfNVtbNjE8uYyFBKZP7SNjlmij0OHwNgDzxUshdfUE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=X1mBI/Br; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="X1mBI/Br" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 0C9FCC4CEF0; Tue, 10 Jun 2025 14:59:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1749567597; bh=7m03JAiZi1htmYekkvb9rqbrYXBGjMPA6O2hU2YNZfg=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=X1mBI/BrkIVVEi+7ujtAIxmQkOD0Q6zJvDHYsEFEsjx6XHANtrx0AIjuPAdMRZA2s mmUJonEAmz/SXll8JOLXEKuK53RMgRk77nBiZ53uWzsm0Swt2GaDRlx/ILeUZ2QuHI ug33Cvpb5WsLgQqaSqUxQixugGUB/Wb8EqR/OQqTtv79mxsDxqagtNl9jFcuf7cZpo YokBQsWzbj3F+uiiU8LGWd/S4ZckjcVv2VQFypZzqwmrJwg6rzuccitMIGhz09KVwZ UFTRea9e/hgEjvg+vndDCSQgIGE2Ye3v8GCiHExlGQndDEt6Da3W3Ohn1JZfEkjiFd XqGjOJPs0u6Sg== From: Jeff Layton Date: Tue, 10 Jun 2025 10:59:27 -0400 Subject: [PATCH v14 7/9] ref_tracker: add a way to create a symlink to the ref_tracker_dir debugfs file Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250610-reftrack-dbgfs-v14-7-efb532861428@kernel.org> References: <20250610-reftrack-dbgfs-v14-0-efb532861428@kernel.org> In-Reply-To: <20250610-reftrack-dbgfs-v14-0-efb532861428@kernel.org> To: Andrew Morton , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Jani Nikula , Joonas Lahtinen , Rodrigo Vivi , Tvrtko Ursulin Cc: Krzysztof Karas , Kuniyuki Iwashima , Qasim Ijaz , Nathan Chancellor , Andrew Lunn , linux-kernel@vger.kernel.org, netdev@vger.kernel.org, dri-devel@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, Jeff Layton X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=4362; i=jlayton@kernel.org; h=from:subject:message-id; bh=7m03JAiZi1htmYekkvb9rqbrYXBGjMPA6O2hU2YNZfg=; b=owEBbQKS/ZANAwAKAQAOaEEZVoIVAcsmYgBoSEhcWNIJlZnhzGeL+qd5tiKogrC7IEUHAoeQK t1pfDqVMsOJAjMEAAEKAB0WIQRLwNeyRHGyoYTq9dMADmhBGVaCFQUCaEhIXAAKCRAADmhBGVaC FdCCD/9LbCB1ebJIYKI+eoqgpNwqW3aTFJ7tA44mMMmfutC61PKkSsKyo5uqkjFFWGNJK9ks4w2 VWtCcInLhjQv1y5eyaSXJYpvsO2Bq0AN7cYotbEKRECILXHGeMuhgRFeTHRRvlWr/1NZEfquf0I yp+StaxcLp0cGwglPEcPrJt3TG5rEfkR6krnUgRUSBuWG9Mc23VRXL3H9ZHctWaegIPPqpT8WMC zlcddrtnepAqTXMHvADW+ay0LmlsDnZU4CUHfBJrQjT/TfIntT05O5IBvJjeTPSWmHxOEkaSVPD 6rbLTfNva5i4Xf4dDp1LCWO1svJDvuxWJ3gJg/ymyE3jWhdU9eLfR/S5+1CpG8qCLRjKEUgna8/ 4luzUmakSd+N7JynGyBWo3nuXgP21+KPiu9VXRw/z1EDP0nepDxestwAvXBpqertI+2G4x7itBz Pj9doyav+xYb76++p1/9MRSMlmrzLa1G2bz3xobfSKwIdF2SQguu6gCLN71wCivVNzEHKe9Xszh Iz0uVLsq27x6JW717pSd/bIi1qOohun4jimiJgbefaEZ+9OxnUZf0pslvdZtvedgnm8R3HqqChx Z9+xRYptUJMzJX+rFF5yiKLeS20DT4ECRduC/crgtLz/FuRk6mkdAYBRPi8j1UAHJGAUkW9WVPR Zq5Vm/5SMnP+XRA== X-Developer-Key: i=jlayton@kernel.org; a=openpgp; fpr=4BC0D7B24471B2A184EAF5D3000E684119568215 Add the ability for a subsystem to add a user-friendly symlink that points to a ref_tracker_dir's debugfs file. Add a separate debugfs_symlinks xarray and use that to track symlinks. The reaper workqueue job will remove symlinks before their corresponding dentries. Signed-off-by: Jeff Layton --- include/linux/ref_tracker.h | 11 +++++++++++ lib/ref_tracker.c | 47 +++++++++++++++++++++++++++++++++++++++++= ++++ 2 files changed, 58 insertions(+) diff --git a/include/linux/ref_tracker.h b/include/linux/ref_tracker.h index 28bbf436a8f4646cfac181d618195a9460bda196..e1323de93bf6b891aa14ad8d9b4= b28d02e10f9f7 100644 --- a/include/linux/ref_tracker.h +++ b/include/linux/ref_tracker.h @@ -29,6 +29,7 @@ struct ref_tracker_dir { #ifdef CONFIG_DEBUG_FS =20 void ref_tracker_dir_debugfs(struct ref_tracker_dir *dir); +void ref_tracker_dir_symlink(struct ref_tracker_dir *dir, const char *fmt,= ...); =20 #else /* CONFIG_DEBUG_FS */ =20 @@ -36,6 +37,11 @@ static inline void ref_tracker_dir_debugfs(struct ref_tr= acker_dir *dir) { } =20 +static inline __ostream_printf +void ref_tracker_dir_symlink(struct ref_tracker_dir *dir, const char *fmt,= ...) +{ +} + #endif /* CONFIG_DEBUG_FS */ =20 static inline void ref_tracker_dir_init(struct ref_tracker_dir *dir, @@ -85,6 +91,11 @@ static inline void ref_tracker_dir_debugfs(struct ref_tr= acker_dir *dir) { } =20 +static inline __ostream_printf +void ref_tracker_dir_symlink(struct ref_tracker_dir *dir, const char *fmt,= ...) +{ +} + static inline void ref_tracker_dir_exit(struct ref_tracker_dir *dir) { } diff --git a/lib/ref_tracker.c b/lib/ref_tracker.c index 4f1c4fe5e6b1274b6aeb733a3f8c06d1dff003f5..a78741308a2c2dc7aff65519970= ad081b59e0de5 100644 --- a/lib/ref_tracker.c +++ b/lib/ref_tracker.c @@ -44,11 +44,13 @@ struct ref_tracker_dir_stats { * dentries asynchronously. */ static struct xarray debugfs_dentries; +static struct xarray debugfs_symlinks; static struct work_struct debugfs_reap_worker; =20 #define REF_TRACKER_DIR_DEAD XA_MARK_0 static inline void ref_tracker_debugfs_mark(struct ref_tracker_dir *dir) { + xa_set_mark(&debugfs_symlinks, (unsigned long)dir, REF_TRACKER_DIR_DEAD); xa_set_mark(&debugfs_dentries, (unsigned long)dir, REF_TRACKER_DIR_DEAD); schedule_work(&debugfs_reap_worker); } @@ -446,6 +448,45 @@ void ref_tracker_dir_debugfs(struct ref_tracker_dir *d= ir) } EXPORT_SYMBOL(ref_tracker_dir_debugfs); =20 +void __ostream_printf ref_tracker_dir_symlink(struct ref_tracker_dir *dir,= const char *fmt, ...) +{ + char name[NAME_MAX + 1]; + struct dentry *symlink, *dentry; + va_list args; + int ret; + + symlink =3D xa_load(&debugfs_symlinks, (unsigned long)dir); + dentry =3D xa_load(&debugfs_dentries, (unsigned long)dir); + + /* Already created?*/ + if (symlink && !xa_is_err(symlink)) + return; + + if (!dentry || xa_is_err(dentry)) + return; + + va_start(args, fmt); + ret =3D vsnprintf(name, sizeof(name), fmt, args); + va_end(args); + name[sizeof(name) - 1] =3D '\0'; + + if (ret < sizeof(name)) { + symlink =3D debugfs_create_symlink(name, ref_tracker_debug_dir, + dentry->d_name.name); + if (!IS_ERR(symlink)) { + void *old; + + old =3D xa_store(&debugfs_symlinks, (unsigned long)dir, + symlink, GFP_KERNEL); + if (xa_is_err(old)) + debugfs_remove(symlink); + else + WARN_ON_ONCE(old); + } + } +} +EXPORT_SYMBOL(ref_tracker_dir_symlink); + static void debugfs_reap_work(struct work_struct *work) { struct dentry *dentry; @@ -454,6 +495,11 @@ static void debugfs_reap_work(struct work_struct *work) =20 do { reaped =3D false; + xa_for_each_marked(&debugfs_symlinks, index, dentry, REF_TRACKER_DIR_DEA= D) { + xa_erase(&debugfs_symlinks, index); + debugfs_remove(dentry); + reaped =3D true; + } xa_for_each_marked(&debugfs_dentries, index, dentry, REF_TRACKER_DIR_DEA= D) { xa_erase(&debugfs_dentries, index); debugfs_remove(dentry); @@ -466,6 +512,7 @@ static int __init ref_tracker_debugfs_init(void) { INIT_WORK(&debugfs_reap_worker, debugfs_reap_work); xa_init_flags(&debugfs_dentries, XA_FLAGS_LOCK_IRQ); + xa_init_flags(&debugfs_symlinks, XA_FLAGS_LOCK_IRQ); ref_tracker_debug_dir =3D debugfs_create_dir("ref_tracker", NULL); return 0; } --=20 2.49.0