From nobody Mon Jul 28 20:33:04 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 4brVXw2zL5z63SJQ; Mon, 28 Jul 2025 20:33:04 +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 4brVXw1yQpz43P1; Mon, 28 Jul 2025 20:33:04 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1753734784; 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=fYMKcHCh4QlsLtcI9H4AUOWfNaSyMaAslBhuh3OF9a0=; b=Ho4DXWqBl/WhiT9XohvRt4RVU/qIaLRaqhMSetoJhN6eFojbCUgeHzkdhCXSZgS4A7uBai z7A5aW85RT5J9fO+F5ziRc3bSthqD5MIj3kmpxR2poz+gXPU5QbulxeBov66R3j5A4G/T2 qn0/gva7x9fCj1sEC4cpC8DVPeQKKlhVll3u3xgJVkjcM6KKp2MuPwBVCFHX+5SbDp37EO u8WXZ2N24/8NbB9S1jSywO8r6kb9ssrQQUH9hR7sJD/J+zUpZlQ9eiiNOkYKIaJ9t8snNn jX/7qCI1qqz7q45vXuJwAAwIN/uXtvr9wOVpxV9MEvvEtq1gdCYJ/eqHudlp4w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1753734784; 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=fYMKcHCh4QlsLtcI9H4AUOWfNaSyMaAslBhuh3OF9a0=; b=XrsIAlzhd+QlxesKJWzsHYg3oKchSObKRPngIB22NCvOoN04GTgKSY/9Hc9+fTObiBAXQF 8amSzWft+iBp2zJ2P4+DKKqq4kO1P/xgWRkWrloq7TWXlg6V+lt7custUyp5OEm/LMm4dl EGHAkbO7pfqGDiFsvd7/+vbjMAIlzUcrt26C/8jaPtgBwOTLLxHpCF27erzt2/D5xdpXTR nB9+jcpYBSdL+MaztZhKNFgeuXMQozThXEGuRGafCJUojqupwn/5y/dl80ht3P2uPQvkUS uwbpbbdcKgBXgfAwOC6KeHTb2kN8vrH1DDuvr5HWGcKHzbMuLT+1hRxN8Ax9yQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1753734784; a=rsa-sha256; cv=none; b=N0UPXnxtgfDTnpnkyWrAax6dWOVWxoz28CMQrQLWbGfQ6RzVxYvoWT2F0VhKgp8v3KEl9d 7hwRU3vkBxP8duHsNtGCYp8UcqHuz0wjmv+3WG48uZr2RPm0dK4enpo9eHSO9raPxsmQwz LTUS8Mp0CElYLgTiBxMC1pGnw7ATsaZzP5vkUPEuqj4UpM5iVcTH/sJCtId+h+vRKzG8eK wtWgmDOjcaYsQMuVBpMbtvg5gsRcNzffG7oQ5WXihd7XhpC4cl99hIO0zZ6DFC6ftA1ZKB 3hKMxl2EDuPBkGkje5JnaVzrq3hOUfNWRENpKatWw+44uvFYU/YlarXoB3Y5qg== 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 4brVXw1W5Vz11Jp; Mon, 28 Jul 2025 20:33:04 +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 56SKX4ub079552; Mon, 28 Jul 2025 20:33:04 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 56SKX49Y079549; Mon, 28 Jul 2025 20:33:04 GMT (envelope-from git) Date: Mon, 28 Jul 2025 20:33:04 GMT Message-Id: <202507282033.56SKX49Y079549@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: 9a6ba186e0ca - main - sdt: Initialize probes in two passes 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: markj X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 9a6ba186e0ca4269021d8843dbc8409ea78da4a6 Auto-Submitted: auto-generated The branch main has been updated by markj: URL: https://cgit.FreeBSD.org/src/commit/?id=9a6ba186e0ca4269021d8843dbc8409ea78da4a6 commit 9a6ba186e0ca4269021d8843dbc8409ea78da4a6 Author: Mark Johnston AuthorDate: 2025-07-28 19:30:37 +0000 Commit: Mark Johnston CommitDate: 2025-07-28 20:32:39 +0000 sdt: Initialize probes in two passes Suppose a kernel module A defines an SDT provider and probes, and kernel linker file B, dependant on A, contains tracepoints for those probes. When sdt.ko is loaded, it iterates over all loaded KLDs to initialize probe structures and register them with dtrace. In particular it uses linker_file_foreach(), which is not sorted; in the above scenario, B may be visited before A. Thus, it's possible for sdt_kld_load_probes() to try to add tracepoints to an uninitialized SDT probe. An example of the above arises when pfsync, pf, and sdt are loaded in that exact order after commit 4bb3b36577645. Fix this by initializing probe structures in the first pass over loaded KLDs. Then, the second pass can safely add tracepoints to any probe structure. Note that the scenario where B and A are loaded after sdt.ko is already handled properly, as there, the kld_load eventhandler is responsible for registering probes with dtrace, and that eventhandler fires for dependencies before it does for the dependent KLD. This presumes, however, that there are no cycles in the dependency graph. Reported by: jenkins MFC after: 2 weeks --- sys/cddl/dev/sdt/sdt.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/sys/cddl/dev/sdt/sdt.c b/sys/cddl/dev/sdt/sdt.c index a8da618204af..0a9059104671 100644 --- a/sys/cddl/dev/sdt/sdt.c +++ b/sys/cddl/dev/sdt/sdt.c @@ -72,6 +72,7 @@ static void sdt_load(void); static int sdt_unload(void); static void sdt_create_provider(struct sdt_provider *); static void sdt_create_probe(struct sdt_probe *); +static void sdt_init_probe(struct sdt_probe *, linker_file_t); static void sdt_kld_load(void *, struct linker_file *); static void sdt_kld_unload_try(void *, struct linker_file *, int *); @@ -204,6 +205,14 @@ sdt_create_probe(struct sdt_probe *probe) (void)dtrace_probe_create(prov->id, mod, func, name, aframes, probe); } +static void +sdt_init_probe(struct sdt_probe *probe, linker_file_t lf) +{ + probe->sdtp_lf = lf; + TAILQ_INIT(&probe->argtype_list); + STAILQ_INIT(&probe->tracepoint_list); +} + /* * Probes are created through the SDT module load/unload hook, so this function * has nothing to do. It only exists because the DTrace provider framework @@ -361,12 +370,19 @@ static void sdt_kld_load_providers(struct linker_file *lf) { struct sdt_provider **prov, **begin, **end; + struct sdt_probe **p_begin, **p_end; if (linker_file_lookup_set(lf, "sdt_providers_set", &begin, &end, NULL) == 0) { for (prov = begin; prov < end; prov++) sdt_create_provider(*prov); } + + if (linker_file_lookup_set(lf, "sdt_probes_set", &p_begin, &p_end, + NULL) == 0) { + for (struct sdt_probe **probe = p_begin; probe < p_end; probe++) + sdt_init_probe(*probe, lf); + } } static void @@ -378,13 +394,8 @@ sdt_kld_load_probes(struct linker_file *lf) if (linker_file_lookup_set(lf, "sdt_probes_set", &p_begin, &p_end, NULL) == 0) { - for (struct sdt_probe **probe = p_begin; probe < p_end; - probe++) { - (*probe)->sdtp_lf = lf; + for (struct sdt_probe **probe = p_begin; probe < p_end; probe++) sdt_create_probe(*probe); - TAILQ_INIT(&(*probe)->argtype_list); - STAILQ_INIT(&(*probe)->tracepoint_list); - } } if (linker_file_lookup_set(lf, "sdt_argtypes_set", &a_begin, &a_end,