Re: git: da81cc6035f8 - main - dtrace: conditionally load the systrace_linux klds when loading dtrace.
Date: Tue, 24 Jan 2023 05:30:16 UTC
On 24 Jan 2023, at 14:38, Andrew Gallatin wrote:
> The branch main has been updated by gallatin:
>
> URL: https://cgit.FreeBSD.org/src/commit/?id=da81cc6035f8283b6adda1ef466977e8c1c5389e
>
> commit da81cc6035f8283b6adda1ef466977e8c1c5389e
> Author: Andrew Gallatin <gallatin@FreeBSD.org>
> AuthorDate: 2023-01-24 01:27:17 +0000
> Commit: Andrew Gallatin <gallatin@FreeBSD.org>
> CommitDate: 2023-01-24 01:36:24 +0000
>
> dtrace: conditionally load the systrace_linux klds when loading dtrace.
>
> When dtrace starts, it tries to detect if the dtrace klds are loaded,
> and if not, it loads them by loading the dtraceall kld. This module
> depends on most dtrace modules, including systrace for the native
> freebsd and freebsd32 ABIs. However, it does not depend on the
> systrace_linux klds, as they in turn depend on the linux ABI klds, and
> we don't want to load an ABI module that the user has not explicitly
> requested. This can leave a naive user in a state where they think all
> syscall providers have been loaded, yet linux ABI syscalls are
> "invisible" to dtrace.
>
> To fix this, check to see if the linux ABI modules are loaded. If they
> are, then load their systrace klds.
>
> Reviewed by: markj, (emaste & jhb, earlier versions)
> Sponsored by: Netflix
> Differential Revision: https://reviews.freebsd.org/D37986
> ---
> cddl/contrib/opensolaris/lib/libdtrace/common/dt_open.c | 9 +++++++++
> 1 file changed, 9 insertions(+)
>
> diff --git a/cddl/contrib/opensolaris/lib/libdtrace/common/dt_open.c b/cddl/contrib/opensolaris/lib/libdtrace/common/dt_open.c
> index 867259b5d77c..e11cdc954683 100644
> --- a/cddl/contrib/opensolaris/lib/libdtrace/common/dt_open.c
> +++ b/cddl/contrib/opensolaris/lib/libdtrace/common/dt_open.c
> @@ -1115,6 +1115,15 @@ dt_vopen(int version, int flags, int *errp,
> */
> if (err == ENOENT && modfind("dtraceall") < 0) {
> kldload("dtraceall"); /* ignore the error */
> +#if __SIZEOF_LONG__ == 8
> + if (modfind("linux64elf") >= 0)
> + kldload("systrace_linux");
> + if (modfind("linuxelf") >= 0)
> + kldload("systrace_linux32");
> +#else
> + if (modfind("linuxelf") >= 0) {
Trond spotted the extra brace here.
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=269128
> + kldload("systrace_linux");
> +#endif
> dtfd = open("/dev/dtrace/dtrace", O_RDWR | O_CLOEXEC);
> err = errno;
> }
—
Kristof