From nobody Mon Mar 10 03:04:10 2025 X-Original-To: dev-commits-src-main@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 4ZB1vG4pBSz5qBhb; Mon, 10 Mar 2025 03:04:10 +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 "R10" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4ZB1vG2GbBz3j5x; Mon, 10 Mar 2025 03:04:10 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1741575850; 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=QEz1VOoB/TpVNKqKGEURyagDarR8rSfPZGHBLVCOm4w=; b=BDqVAq9Nv0bq76IadldaP/7pMMwLM2MyupddvC5x+Hn+WMZ10SvCcDrQILKAhhfbq42w2p nNlIRyrSoLltGRmT6iqrsf7MXYP/oPOMNWwIWxwa8BMyX4+lEZa3/SkqndS9whBv9F92CX 4DhRNYpNmykAX9mf3RMcZQdmBxpmmK1fFzGC+Qjzg4F9j/wWaY16abgP16bz364UUfTPE8 pfSXg+53WFs+asnpnuzSDwzIGFWwmqz/szsVCuiYCgaRVI3MHLA3eD8dx+WOln8+TFQ1j2 xObTVUat13+6OKacuXk+P4v7f4dJ2Wo2znxikUHOQjcEQBH8QOHkPcAkLCAgtA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1741575850; a=rsa-sha256; cv=none; b=SlEUJCsH4CoNkU0M7zpNk1qY5s4tPWXi3M6RKkMX22zC+sKoTWPoPrLc9nhmPIxljqPza1 3ytUM7iKEAsP9sIMkeKlvvsRLYUwlH5VQhDqVjnq3AlcXGqN8hZeqzByCx4xcFvKVsSSS+ 2tBSyoqiraxq9Jp6xxM8BD9FE/Qv2Madp0ExKqB3Qq5UWCy7363f/hz1HqBH3ohx/PhVcG ZeTRkEVjlmUDwRq6NTzY+4SlWBD7OK5FPwyqqj5uwQRc57t/nTRcbjmPHdHUU+2Xf0Zx4K EBhATEvLtSiackC131I/LjRpF14B1hadFlREkCs/4C+X0YNgkUHEXc4Uq+5j9w== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1741575850; 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=QEz1VOoB/TpVNKqKGEURyagDarR8rSfPZGHBLVCOm4w=; b=MMwMZhzDhTDm0SC0YPfnuW74ETdGqrOq6R3S60TEmyS63rsuG3rMX0biNoDgaqKOPIfmBo 3NnuIMv4GBJpu7J2LjV1ZeOg4Ps8m9A9Pg5rdFWSJpoPF0ePf37+ocdjfty4K76EI5ReZ3 LC64DYoX3Rv780d2QnjYt/BJRu5IrjvdmoLX62oyXmI/R0oqZnlOqebFVvGpXJiu1zARok PzydBNZ/BjZWkzn9d2s6s+xoJHLuuvq9TJZkGDaTIfy7X0AbmB5UhUsJg4+/0cITXvhppK AdXnOL8bt6T6bBzfIbLg81fioU+r9R20Urqe/9nZdDWHy/s2pX12dA9gfX5CaA== 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 4ZB1vG1rHbz60w; Mon, 10 Mar 2025 03:04:10 +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 52A34AXo099030; Mon, 10 Mar 2025 03:04:10 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 52A34AGF099027; Mon, 10 Mar 2025 03:04:10 GMT (envelope-from git) Date: Mon, 10 Mar 2025 03:04:10 GMT Message-Id: <202503100304.52A34AGF099027@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Mark Johnston Subject: git: 9a30c8d347bf - main - libdtrace: Fix an off-by-one in CPU ID handling List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: markj X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 9a30c8d347bf9aaa89277b6e5a275f737be8edce Auto-Submitted: auto-generated The branch main has been updated by markj: URL: https://cgit.FreeBSD.org/src/commit/?id=9a30c8d347bf9aaa89277b6e5a275f737be8edce commit 9a30c8d347bf9aaa89277b6e5a275f737be8edce Author: Mark Johnston AuthorDate: 2025-03-10 03:00:59 +0000 Commit: Mark Johnston CommitDate: 2025-03-10 03:00:59 +0000 libdtrace: Fix an off-by-one in CPU ID handling The illumos-specific _SC_CPUID_MAX is the largest CPU ID in the system. This was mapped to _SC_NPROCESSORS_CONF, which is the total number of CPUs recognized by the kernel. If CPU IDs are contiguous, as is the case on amd64 and arm64, this value is one greater than the maximum ID. As a result, when consuming per-CPU dtrace buffers, libdtrace tries to fetch from a non-existent CPU. This is mostly harmless in practice, but still wrong. As we don't have a sysconf value for the maximum CPU ID, add a wrapper which fetches it using the kern.smp.maxid sysctl. MFC after: 2 weeks Sponsored by: Innovate UK Differential Revision: https://reviews.freebsd.org/D49243 --- .../opensolaris/lib/libdtrace/common/dt_aggregate.c | 6 ++++-- cddl/contrib/opensolaris/lib/libdtrace/common/dt_consume.c | 8 ++++---- cddl/contrib/opensolaris/lib/libdtrace/common/dt_impl.h | 1 + cddl/contrib/opensolaris/lib/libdtrace/common/dt_subr.c | 14 ++++++++++++++ cddl/contrib/opensolaris/lib/libdtrace/common/dtrace.h | 5 ----- 5 files changed, 23 insertions(+), 11 deletions(-) diff --git a/cddl/contrib/opensolaris/lib/libdtrace/common/dt_aggregate.c b/cddl/contrib/opensolaris/lib/libdtrace/common/dt_aggregate.c index 643e7fae8ace..1c3131e74cb0 100644 --- a/cddl/contrib/opensolaris/lib/libdtrace/common/dt_aggregate.c +++ b/cddl/contrib/opensolaris/lib/libdtrace/common/dt_aggregate.c @@ -1092,8 +1092,10 @@ dt_aggregate_go(dtrace_hdl_t *dtp) assert(agp->dtat_ncpu == 0); assert(agp->dtat_cpus == NULL); - agp->dtat_maxcpu = dt_sysconf(dtp, _SC_CPUID_MAX) + 1; - agp->dtat_ncpu = dt_sysconf(dtp, _SC_NPROCESSORS_MAX); + agp->dtat_maxcpu = dt_cpu_maxid(dtp) + 1; + if (agp->dtat_maxcpu <= 0) + return (-1); + agp->dtat_ncpu = dt_sysconf(dtp, _SC_NPROCESSORS_CONF); agp->dtat_cpus = malloc(agp->dtat_ncpu * sizeof (processorid_t)); if (agp->dtat_cpus == NULL) diff --git a/cddl/contrib/opensolaris/lib/libdtrace/common/dt_consume.c b/cddl/contrib/opensolaris/lib/libdtrace/common/dt_consume.c index 6a32235f7e39..a760642c33bb 100644 --- a/cddl/contrib/opensolaris/lib/libdtrace/common/dt_consume.c +++ b/cddl/contrib/opensolaris/lib/libdtrace/common/dt_consume.c @@ -3949,8 +3949,8 @@ dt_consume_begin(dtrace_hdl_t *dtp, FILE *fp, return (rval); } - if (max_ncpus == 0) - max_ncpus = dt_sysconf(dtp, _SC_CPUID_MAX) + 1; + if (max_ncpus == 0 && (max_ncpus = dt_cpu_maxid(dtp) + 1) <= 0) + return (-1); for (i = 0; i < max_ncpus; i++) { dtrace_bufdesc_t *nbuf; @@ -4040,8 +4040,8 @@ dtrace_consume(dtrace_hdl_t *dtp, FILE *fp, if (!dtp->dt_active) return (dt_set_errno(dtp, EINVAL)); - if (max_ncpus == 0) - max_ncpus = dt_sysconf(dtp, _SC_CPUID_MAX) + 1; + if (max_ncpus == 0 && (max_ncpus = dt_cpu_maxid(dtp) + 1) <= 0) + return (-1); if (pf == NULL) pf = (dtrace_consume_probe_f *)dt_nullprobe; diff --git a/cddl/contrib/opensolaris/lib/libdtrace/common/dt_impl.h b/cddl/contrib/opensolaris/lib/libdtrace/common/dt_impl.h index 1be984f28001..b73ecc3e57f4 100644 --- a/cddl/contrib/opensolaris/lib/libdtrace/common/dt_impl.h +++ b/cddl/contrib/opensolaris/lib/libdtrace/common/dt_impl.h @@ -620,6 +620,7 @@ extern int dt_version_defined(dt_version_t); */ extern char *dt_cpp_add_arg(dtrace_hdl_t *, const char *); extern char *dt_cpp_pop_arg(dtrace_hdl_t *); +extern int dt_cpu_maxid(dtrace_hdl_t *); #ifdef illumos extern int dt_set_errno(dtrace_hdl_t *, int); diff --git a/cddl/contrib/opensolaris/lib/libdtrace/common/dt_subr.c b/cddl/contrib/opensolaris/lib/libdtrace/common/dt_subr.c index 5976333e1b16..5dc8e1648fd3 100644 --- a/cddl/contrib/opensolaris/lib/libdtrace/common/dt_subr.c +++ b/cddl/contrib/opensolaris/lib/libdtrace/common/dt_subr.c @@ -463,6 +463,20 @@ dt_cpp_pop_arg(dtrace_hdl_t *dtp) return (arg); } +int +dt_cpu_maxid(dtrace_hdl_t *dtp) +{ + size_t len; + u_int count; + int error; + + len = sizeof(count); + error = sysctlbyname("kern.smp.maxid", &count, &len, NULL, 0); + if (error != 0) + return (dt_set_errno(dtp, errno)); + return (count); +} + /*PRINTFLIKE1*/ void dt_dprintf(const char *format, ...) diff --git a/cddl/contrib/opensolaris/lib/libdtrace/common/dtrace.h b/cddl/contrib/opensolaris/lib/libdtrace/common/dtrace.h index 1f4c5a2efd6b..c9496c2df5ba 100644 --- a/cddl/contrib/opensolaris/lib/libdtrace/common/dtrace.h +++ b/cddl/contrib/opensolaris/lib/libdtrace/common/dtrace.h @@ -620,11 +620,6 @@ extern int _dtrace_debug; } #endif -#ifndef illumos -#define _SC_CPUID_MAX _SC_NPROCESSORS_CONF -#define _SC_NPROCESSORS_MAX _SC_NPROCESSORS_CONF -#endif - /* * Values for the dt_oformat property. */