From nobody Wed Apr 02 15:14:51 2025 X-Original-To: dev-commits-src-branches@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 4ZST1l6tFfz5sQMt; Wed, 02 Apr 2025 15:14:51 +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 4ZST1l4QVYz3gBy; Wed, 02 Apr 2025 15:14:51 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1743606891; 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=bPrL7SeIp2CzeNI8abD6cNVDmoqVK9p2lYt77rt9e44=; b=FSDmUtqT2uKjcQwPvbGQHnXQ/zXAs8w0/Ix1NGiwkDKC1ldG08WNEwJxaIQ5aFnB7FIrZQ 38/HKWUK8A5yslhRL1eyq8LOASAjeahVmK7DbJFs6m6C8qSc8IBTUhVEO9MgFKDJEaf28O q6TFOamcIQMO9AOGPMhk3cJNDpuwULxvQXfUNECpmQC3XwE4ZU9bUMQs0KwnSEgd1+8qVi USbSKwJnj4Pd3dp5E5xllUxGeVsLT0SMDruu8UirieoTSLvCVhOtA+VV8vVi2kjxkm1CBc pJwPqx/l6gWMQb9CwScZf6mn+iyHrLS65l9gK85udQHHcQKVXqIUyQ+08fj8+g== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1743606891; a=rsa-sha256; cv=none; b=ghEPKRN7+p9N7v6sgfKuvIWng6180l5MJlJ8DNg/DBxJijR26V2ceKxozg85AKQ5z86UnI kcGzHtLPk28qOQ+eEDrhHmzE+tyx132tTct1PxA89OHmB6CEK1C7WtJcK+aMvfzhnhUXOd d83hD64P15zQLLFJkLl/H7JuMpV3F5C90VIdotAcmL6zHakWWY11qVOx4h9kSbpsdL3Cj8 n3kMK6gL+O+uyaImiHI7BEe8xCjtqiTyFDeDVYVxVHnkKrYdWe7ufXH6hNX8XMSuCW97f0 Mq3xYZAMoOJr7Wgu58RcdXS4U4nV8jeIHYueJs8lCPNOOCLcmTQHYzhXqqG7rA== 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=1743606891; 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=bPrL7SeIp2CzeNI8abD6cNVDmoqVK9p2lYt77rt9e44=; b=MfwrTvK1OdAFOY9sk1pnbhr+B4etD+WM9oPyQiON14yGUHVsekk+Mk6J51itD+jVCIXa9x Xkbzlv/7qCCZqg17NYU+qBY8rs/TKORU9VRzuqN9KLjpNfsDx2NjB5k1JQ/9+c8KWyYEb2 mSeD7P7LheLQ79eIHAzab635kVcUf+R8MiP+uI8ZWVSp6hw+m9bNBVa1IQpihkL6xnCuUb MVCxM34+gUKlqXPPcbQzBgBN7W1yYoJwEtJXRwjL2L2I8KOXmhTSDIMjXmeLM7uuvtEJRW n4xZ65t4+rgXA+mCmOGSMIJD5I0tnNWtq/UE9qBwZeP3F+xU/dzRZnrAdjyBhg== 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 4ZST1l3R0jz6Kt; Wed, 02 Apr 2025 15:14:51 +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 532FEpLl061448; Wed, 2 Apr 2025 15:14:51 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 532FEpuj061445; Wed, 2 Apr 2025 15:14:51 GMT (envelope-from git) Date: Wed, 2 Apr 2025 15:14:51 GMT Message-Id: <202504021514.532FEpuj061445@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Mark Johnston Subject: git: 0ae0226cd12a - stable/14 - libdtrace: Fix an off-by-one in CPU ID handling List-Id: Commits to the stable branches of the FreeBSD src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-branches@freebsd.org Sender: owner-dev-commits-src-branches@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/stable/14 X-Git-Reftype: branch X-Git-Commit: 0ae0226cd12a0c77ad0c299896fa8792ea7f9cbe Auto-Submitted: auto-generated The branch stable/14 has been updated by markj: URL: https://cgit.FreeBSD.org/src/commit/?id=0ae0226cd12a0c77ad0c299896fa8792ea7f9cbe commit 0ae0226cd12a0c77ad0c299896fa8792ea7f9cbe Author: Mark Johnston AuthorDate: 2025-03-10 03:00:59 +0000 Commit: Mark Johnston CommitDate: 2025-04-02 15:14:37 +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 (cherry picked from commit 9a30c8d347bf9aaa89277b6e5a275f737be8edce) --- .../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. */