git: 30ec3138edc9 - main - dtrace: Disable getf() as it is broken on FreeBSD
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Fri, 17 Dec 2021 18:11:48 UTC
The branch main has been updated by markj:
URL: https://cgit.FreeBSD.org/src/commit/?id=30ec3138edc9d491446409910f52ccb1b158253e
commit 30ec3138edc9d491446409910f52ccb1b158253e
Author: Domagoj Stolfa <domagoj.stolfa@gmail.com>
AuthorDate: 2021-12-17 16:01:54 +0000
Commit: Mark Johnston <markj@FreeBSD.org>
CommitDate: 2021-12-17 18:10:22 +0000
dtrace: Disable getf() as it is broken on FreeBSD
getf() on FreeBSD calls _sx_slock(), _sx_sunlock() and fget_locked().
Furthermore, it does not set the per-core fault flag, meaning it
usually ends up in a double fault panic once getf() does get called,
especially from fbt.
Reviewing the DTrace Toolkit + a number of other scripts scattered
around FreeBSD, I have not been able to find one use of getf(). Given
how broken the implementation currently is, we disable it until it
can be implemented properly.
Also comment out a test in aggs/tst.subr.d for getf().
Reviewed by: markj
MFC after: 1 week
Differential Revision: https://reviews.freebsd.org/D33378
---
cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/aggs/tst.subr.d | 2 +-
sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c | 4 ++++
2 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/aggs/tst.subr.d b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/aggs/tst.subr.d
index 9b02e982fe0d..6668f80d81a0 100644
--- a/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/aggs/tst.subr.d
+++ b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/aggs/tst.subr.d
@@ -98,7 +98,7 @@ INTFUNC(ntohll(0x1234567890abcdefL))
STRFUNC(inet_ntoa((ipaddr_t *)alloca(sizeof (ipaddr_t))))
STRFUNC(inet_ntoa6((in6_addr_t *)alloca(sizeof (in6_addr_t))))
STRFUNC(inet_ntop(AF_INET, (void *)alloca(sizeof (ipaddr_t))))
-INTFUNC(getf(0))
+/* INTFUNC(getf(0)) */
INTFUNC(strtoll("0x12EE5D5", 16))
STRFUNC(json("{\"systemtap\": false}", "systemtap"))
diff --git a/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c b/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c
index ad14482b80b5..4798db98f6fe 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c
@@ -10014,6 +10014,9 @@ dtrace_difo_validate(dtrace_difo_t *dp, dtrace_vstate_t *vstate, uint_t nregs,
}
if (subr == DIF_SUBR_GETF) {
+#ifdef __FreeBSD__
+ err += efunc(pc, "getf() not supported");
+#else
/*
* If we have a getf() we need to record that
* in our state. Note that our state can be
@@ -10024,6 +10027,7 @@ dtrace_difo_validate(dtrace_difo_t *dp, dtrace_vstate_t *vstate, uint_t nregs,
*/
if (vstate->dtvs_state != NULL)
vstate->dtvs_state->dts_getf++;
+#endif
}
break;