git: 6c9c924b4387 - stable/13 - dtrace: Disable getf() as it is broken on FreeBSD

From: Mark Johnston <markj_at_FreeBSD.org>
Date: Mon, 27 Dec 2021 00:15:37 UTC
The branch stable/13 has been updated by markj:

URL: https://cgit.FreeBSD.org/src/commit/?id=6c9c924b43876469d8654d2f368661c7bd14f73e

commit 6c9c924b43876469d8654d2f368661c7bd14f73e
Author:     Domagoj Stolfa <domagoj.stolfa@gmail.com>
AuthorDate: 2021-12-17 16:01:54 +0000
Commit:     Mark Johnston <markj@FreeBSD.org>
CommitDate: 2021-12-27 00:15:07 +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
    
    (cherry picked from commit 30ec3138edc9d491446409910f52ccb1b158253e)
---
 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 ca6fa5481856..40ef286805ab 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;