From nobody Tue May 13 12:42:45 2025 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4ZxbjL2VSqz5wnVD; Tue, 13 May 2025 12:42:46 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R11" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4ZxbjK3ycgz3sd5; Tue, 13 May 2025 12:42:45 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1747140165; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=4erBud+QQJXrq4mZXKmKnATtEyhQObwGIeSacadwzcs=; b=SZo+L8TcycaCW6mRwlgkB8RJIiwk4IFEQm1OAFInrUwHJjiLwOqt05C+eZT93k7VULAVUM fB3Y/c78+eHlYPC1mMPjhNhM/JS3BtN+9AnACyJChVoIbc2Jzw8OiNQtOAvBMt0cW4K/2l 84Rp41REoO55XNSamITvOxd5dFCwc284jaI/FN+7D7NKLB94AxbK21sp/tt34wQujeTNUz NEmXUELhyyct7Ye91f/IGSuQ/iHMnkqRuMk+X2faiqVB6FOhy2bbW7JUGyyzzGYNhJEKkh d6BD5c0/AAx0J3D6QmgOE5P7MPFFqB39gpP4wgpKrMzGWdl6s84Yv8/RjgZYHA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1747140165; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=4erBud+QQJXrq4mZXKmKnATtEyhQObwGIeSacadwzcs=; b=Fd1iPa1HrLkIM+Bl4ghxus2oaSzRRypDTVNSzdzFLcLFY1lUwjMdwfibpcso9ZzyxJzSJN ODwLnMM6miUPyEnrM2BhR35gniwWDHub/dG7fChGgQJX331/cwAF9l/2m6HBegnSHqpb7n TZJp4TDKEEpwZgT9t2rN2BNiAc/0+xTdmSZRY4Tgd2bTevLuKh4xJpRWAXBWkoxnTi5GxG nAUJrKE5S7x0Xr1679v3WNoQC+/fnGx2lD46g99LuxdWvZ1Iqbvm2DaxI8DFy2fnHoGTua Bau5LbKMsT+LjfSPEIs3rTOpi/Mfh0nPl6NpDN883J+3VT0BUaWrolUkSZ6fUg== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1747140165; a=rsa-sha256; cv=none; b=W4PVGNmWObiYbauV069TcjYdBoClucG3ku/UmNgYSNQCQrawXTsOs9KVtP2lGufu2MlkO8 7159y9fANOUoRsq5XtJD8iqhBIuQIxel8oVcu/9gi5XHPZtlv3ZPymNk89/PMAmU6uAoIX kc3OlUA68YK4UINL1JvpiQybURtqLt+iKCeMW6DzX/854Dq98qu40iYpkk/oopVe6liQsV bIseKh1BR00mJCfjY1GAVlbUigVa2Aq7a3LD3mMgfYs8fLR8btXelkz9gWHUMV0V5PZw3q lWwQ8ydEehLARXC80BSDBpE0gPlgRhUqwruY0ryp6nwWTYC1fSRZcMlqPp+7tA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4ZxbjK3WGdzmrv; Tue, 13 May 2025 12:42:45 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 54DCgjGM072764; Tue, 13 May 2025 12:42:45 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 54DCgjkM072761; Tue, 13 May 2025 12:42:45 GMT (envelope-from git) Date: Tue, 13 May 2025 12:42:45 GMT Message-Id: <202505131242.54DCgjkM072761@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Olivier Certner Subject: git: de6a4418eec9 - releng/14.3 - sysctl(9): Ease exporting struct sizes; Discourage doing that List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: olce X-Git-Repository: src X-Git-Refname: refs/heads/releng/14.3 X-Git-Reftype: branch X-Git-Commit: de6a4418eec91dc8802defce0159c126a2c7b6d2 Auto-Submitted: auto-generated The branch releng/14.3 has been updated by olce: URL: https://cgit.FreeBSD.org/src/commit/?id=de6a4418eec91dc8802defce0159c126a2c7b6d2 commit de6a4418eec91dc8802defce0159c126a2c7b6d2 Author: Olivier Certner AuthorDate: 2025-05-01 16:02:44 +0000 Commit: Olivier Certner CommitDate: 2025-05-13 12:41:33 +0000 sysctl(9): Ease exporting struct sizes; Discourage doing that Introduce two helpers, the more general SYSCTL_SIZEOF() and a struct-specific one SYSCTL_SIZEOF_STRUCT() which prepends 'struct' in the description and in the use of sizeof() but uses the raw structure name as the knob's name. The size of the object/structure is exported under 'debug.sizeof'. Existing knobs under 'debug.sizeof' were all converted to use the helpers. Add a note before the helpers discouraging the introduction of new leaves for ad-hoc reasons. List alternative means for developers to obtain the size of arbitrary kernel structures easily (thanks to markj@ for providing these). No functional change (intended). Reviewed by: kib, markj MFC after: 3 days Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D50121 (cherry picked from commit 713abc9880aabe0ff924ff644bceb6ff404ed3cd) (cherry picked from commit efce9f8a510b60736994e50288b78fc7b32b5d90) Approved by: re (cperciva) --- .../openzfs/module/os/freebsd/zfs/zfs_znode_os.c | 4 ++++ sys/fs/devfs/devfs_devs.c | 7 ++----- sys/geom/geom_kern.c | 15 +++++---------- sys/kern/kern_mib.c | 18 ++++++------------ sys/kern/subr_devstat.c | 3 +-- sys/kern/vfs_cache.c | 3 +-- sys/sys/sysctl.h | 21 +++++++++++++++++++++ 7 files changed, 40 insertions(+), 31 deletions(-) diff --git a/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_znode_os.c b/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_znode_os.c index fea34273baef..61a59be9f78b 100644 --- a/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_znode_os.c +++ b/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_znode_os.c @@ -66,8 +66,12 @@ #include "zfs_comutil.h" /* Used by fstat(1). */ +#ifdef SYSCTL_SIZEOF +SYSCTL_SIZEOF(znode, znode_t); +#else SYSCTL_INT(_debug_sizeof, OID_AUTO, znode, CTLFLAG_RD, SYSCTL_NULL_INT_PTR, sizeof (znode_t), "sizeof(znode_t)"); +#endif /* * Define ZNODE_STATS to turn on statistic gathering. By default, it is only diff --git a/sys/fs/devfs/devfs_devs.c b/sys/fs/devfs/devfs_devs.c index c6dcd4fc7646..124f9f0449af 100644 --- a/sys/fs/devfs/devfs_devs.c +++ b/sys/fs/devfs/devfs_devs.c @@ -121,11 +121,8 @@ SYSCTL_PROC(_kern, OID_AUTO, devname, CTLTYPE_OPAQUE|CTLFLAG_RW|CTLFLAG_ANYBODY|CTLFLAG_MPSAFE, NULL, 0, sysctl_devname, "", "devname(3) handler"); -SYSCTL_INT(_debug_sizeof, OID_AUTO, cdev, CTLFLAG_RD, - SYSCTL_NULL_INT_PTR, sizeof(struct cdev), "sizeof(struct cdev)"); - -SYSCTL_INT(_debug_sizeof, OID_AUTO, cdev_priv, CTLFLAG_RD, - SYSCTL_NULL_INT_PTR, sizeof(struct cdev_priv), "sizeof(struct cdev_priv)"); +SYSCTL_SIZEOF_STRUCT(cdev); +SYSCTL_SIZEOF_STRUCT(cdev_priv); struct cdev * devfs_alloc(int flags) diff --git a/sys/geom/geom_kern.c b/sys/geom/geom_kern.c index 14707403215d..f8f99087ad9c 100644 --- a/sys/geom/geom_kern.c +++ b/sys/geom/geom_kern.c @@ -230,13 +230,8 @@ SYSCTL_INT(_kern_geom, OID_AUTO, collectstats, CTLFLAG_RW, &g_collectstats, 0, "Control statistics collection on GEOM providers and consumers"); -SYSCTL_INT(_debug_sizeof, OID_AUTO, g_class, CTLFLAG_RD, - SYSCTL_NULL_INT_PTR, sizeof(struct g_class), "sizeof(struct g_class)"); -SYSCTL_INT(_debug_sizeof, OID_AUTO, g_geom, CTLFLAG_RD, - SYSCTL_NULL_INT_PTR, sizeof(struct g_geom), "sizeof(struct g_geom)"); -SYSCTL_INT(_debug_sizeof, OID_AUTO, g_provider, CTLFLAG_RD, - SYSCTL_NULL_INT_PTR, sizeof(struct g_provider), "sizeof(struct g_provider)"); -SYSCTL_INT(_debug_sizeof, OID_AUTO, g_consumer, CTLFLAG_RD, - SYSCTL_NULL_INT_PTR, sizeof(struct g_consumer), "sizeof(struct g_consumer)"); -SYSCTL_INT(_debug_sizeof, OID_AUTO, g_bioq, CTLFLAG_RD, - SYSCTL_NULL_INT_PTR, sizeof(struct g_bioq), "sizeof(struct g_bioq)"); +SYSCTL_SIZEOF_STRUCT(g_class); +SYSCTL_SIZEOF_STRUCT(g_geom); +SYSCTL_SIZEOF_STRUCT(g_provider); +SYSCTL_SIZEOF_STRUCT(g_consumer); +SYSCTL_SIZEOF_STRUCT(g_bioq); diff --git a/sys/kern/kern_mib.c b/sys/kern/kern_mib.c index d60c72a00f63..f69275fc3d1d 100644 --- a/sys/kern/kern_mib.c +++ b/sys/kern/kern_mib.c @@ -722,11 +722,9 @@ SYSCTL_STRING(_user, USER_LOCALBASE, localbase, CTLFLAG_RWTUN, localbase, sizeof(localbase), "Prefix used to install and locate add-on packages"); #include -SYSCTL_INT(_debug_sizeof, OID_AUTO, vnode, CTLFLAG_RD, - SYSCTL_NULL_INT_PTR, sizeof(struct vnode), "sizeof(struct vnode)"); +SYSCTL_SIZEOF_STRUCT(vnode); -SYSCTL_INT(_debug_sizeof, OID_AUTO, proc, CTLFLAG_RD, - SYSCTL_NULL_INT_PTR, sizeof(struct proc), "sizeof(struct proc)"); +SYSCTL_SIZEOF_STRUCT(proc); static int sysctl_kern_pid_max(SYSCTL_HANDLER_ARGS) @@ -758,19 +756,15 @@ SYSCTL_PROC(_kern, OID_AUTO, pid_max, CTLTYPE_INT | #include #include -SYSCTL_INT(_debug_sizeof, OID_AUTO, bio, CTLFLAG_RD, - SYSCTL_NULL_INT_PTR, sizeof(struct bio), "sizeof(struct bio)"); -SYSCTL_INT(_debug_sizeof, OID_AUTO, buf, CTLFLAG_RD, - SYSCTL_NULL_INT_PTR, sizeof(struct buf), "sizeof(struct buf)"); +SYSCTL_SIZEOF_STRUCT(bio); +SYSCTL_SIZEOF_STRUCT(buf); #include -SYSCTL_INT(_debug_sizeof, OID_AUTO, kinfo_proc, CTLFLAG_RD, - SYSCTL_NULL_INT_PTR, sizeof(struct kinfo_proc), "sizeof(struct kinfo_proc)"); +SYSCTL_SIZEOF_STRUCT(kinfo_proc); /* Used by kernel debuggers. */ const int pcb_size = sizeof(struct pcb); -SYSCTL_INT(_debug_sizeof, OID_AUTO, pcb, CTLFLAG_RD, - SYSCTL_NULL_INT_PTR, sizeof(struct pcb), "sizeof(struct pcb)"); +SYSCTL_SIZEOF_STRUCT(pcb); /* XXX compatibility, remove for 6.0 */ #include diff --git a/sys/kern/subr_devstat.c b/sys/kern/subr_devstat.c index 6c0977d1cc35..3a107ac30390 100644 --- a/sys/kern/subr_devstat.c +++ b/sys/kern/subr_devstat.c @@ -600,5 +600,4 @@ devstat_free(struct devstat *dsp) } } -SYSCTL_INT(_debug_sizeof, OID_AUTO, devstat, CTLFLAG_RD, - SYSCTL_NULL_INT_PTR, sizeof(struct devstat), "sizeof(struct devstat)"); +SYSCTL_SIZEOF_STRUCT(devstat); diff --git a/sys/kern/vfs_cache.c b/sys/kern/vfs_cache.c index ab28540be8a8..92e9d77eb891 100644 --- a/sys/kern/vfs_cache.c +++ b/sys/kern/vfs_cache.c @@ -511,8 +511,7 @@ SYSCTL_INT(_debug, OID_AUTO, vfscache, CTLFLAG_RW, &doingcache, 0, #endif /* Export size information to userland */ -SYSCTL_INT(_debug_sizeof, OID_AUTO, namecache, CTLFLAG_RD, SYSCTL_NULL_INT_PTR, - sizeof(struct namecache), "sizeof(struct namecache)"); +SYSCTL_SIZEOF_STRUCT(namecache); /* * The new name cache statistics diff --git a/sys/sys/sysctl.h b/sys/sys/sysctl.h index 5fce4b8e1713..f08080d4e4fa 100644 --- a/sys/sys/sysctl.h +++ b/sys/sys/sysctl.h @@ -38,6 +38,7 @@ #define _SYS_SYSCTL_H_ #ifdef _KERNEL +#include #include #include #endif @@ -934,6 +935,26 @@ TAILQ_HEAD(sysctl_ctx_list, sysctl_ctx_entry); CTLFLAG_RD | CTLFLAG_CAPRD | CTLTYPE_INT | CTLFLAG_MPSAFE, \ NULL, 1, sysctl_handle_int, "I", desc, "feature"); +/* + * Adding new leaves to the 'debug.sizeof' MIB tree for ad-hoc reasons is + * discouraged, and in particular for reporting to developers the size of some + * kernel structures, which can be obtained by the following alternative means: + * 1. In GDB, load a full kernel image and use 'print(sizeof(struct XXX))'. + * Alternatively, use 'ptype/o struct XXX' to additionally get the offsets + * and size of all structure's fields. + * 2. If the structure is allocated from UMA, then 'vmstat -z' reports its size + * (the mapping between structure types and zones is usually + * straightforward). + */ +/* Generates a read-only sysctl reporting the size of an object/structure. */ +#define SYSCTL_SIZEOF(name, expr) \ + SYSCTL_INT(_debug_sizeof, OID_AUTO, name, CTLFLAG_RD, \ + SYSCTL_NULL_INT_PTR, sizeof(expr), \ + "sizeof(" __STRING(expr) ")"); +/* Same, specialized for structures. */ +#define SYSCTL_SIZEOF_STRUCT(struct_name) \ + SYSCTL_SIZEOF(struct_name, struct struct_name) + #endif /* _KERNEL */ /*