Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 3 Jun 2025 04:07:40 GMT
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 6d43260d49e6 - main - ktrace: generate events on extended errors
Message-ID:  <202506030407.55347esq071205@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by kib:

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

commit 6d43260d49e6af7de43a0a3181178d7a3ee20613
Author:     Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2025-05-31 21:42:49 +0000
Commit:     Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2025-06-03 02:47:38 +0000

    ktrace: generate events on extended errors
    
    The ktrexterr() function is provided unconditionally, to mitigate the
    issue of missed include of "opt_ktrace.h" before using exterrvar.h
    otherwise.
    
    Reviewed by:    brooks
    Sponsored by:   The FreeBSD Foundation
    MFC after:      1 week
    Differential revision:  https://reviews.freebsd.org/D50633
---
 sys/kern/kern_ktrace.c | 29 +++++++++++++++++++++++++++++
 sys/sys/exterrvar.h    |  2 ++
 2 files changed, 31 insertions(+)

diff --git a/sys/kern/kern_ktrace.c b/sys/kern/kern_ktrace.c
index 973f19d1d060..96ab5c26973f 100644
--- a/sys/kern/kern_ktrace.c
+++ b/sys/kern/kern_ktrace.c
@@ -106,6 +106,7 @@ struct ktr_request {
 		struct	ktr_fault ktr_fault;
 		struct	ktr_faultend ktr_faultend;
 		struct  ktr_struct_array ktr_struct_array;
+		struct	ktr_exterr ktr_exterr;
 	} ktr_data;
 	STAILQ_ENTRY(ktr_request) ktr_list;
 };
@@ -128,6 +129,7 @@ static const int data_lengths[] = {
 	[KTR_STRUCT_ARRAY] = sizeof(struct ktr_struct_array),
 	[KTR_ARGS] = 0,
 	[KTR_ENVS] = 0,
+	[KTR_EXTERR] = sizeof(struct ktr_exterr),
 };
 
 static STAILQ_HEAD(, ktr_request) ktr_free;
@@ -1035,8 +1037,35 @@ ktrfaultend(int result)
 	ktr_enqueuerequest(td, req);
 	ktrace_exit(td);
 }
+
+void
+ktrexterr(struct thread *td)
+{
+	struct ktr_request *req;
+	struct ktr_exterr *ktre;
+
+	if (!KTRPOINT(td, KTR_EXTERR))
+		return;
+
+	req = ktr_getrequest(KTR_EXTERR);
+	if (req == NULL)
+		return;
+	ktre = &req->ktr_data.ktr_exterr;
+	if (exterr_to_ue(td, &ktre->ue) == 0)
+		ktr_enqueuerequest(td, req);
+	else
+		ktr_freerequest(req);
+	ktrace_exit(td);
+}
 #endif /* KTRACE */
 
+#ifndef KTRACE
+void
+ktrexterr(struct thread *td __unused)
+{
+}
+#endif
+
 /* Interface and common routines */
 
 #ifndef _SYS_SYSPROTO_H_
diff --git a/sys/sys/exterrvar.h b/sys/sys/exterrvar.h
index 7e842f553866..4b168446e23b 100644
--- a/sys/sys/exterrvar.h
+++ b/sys/sys/exterrvar.h
@@ -46,12 +46,14 @@
 		_Td->td_kexterr.p1 = (uintptr_t)pp1;		\
 		_Td->td_kexterr.p2 = (uintptr_t)pp2;		\
 		_Td->td_kexterr.src_line = __LINE__;		\
+		ktrexterr(_Td);					\
 	}							\
 } while (0)
 #define	SET_ERROR0(eerror, mmsg)	SET_ERROR2(eerror, mmsg, 0, 0)
 #define	SET_ERROR1(eerror, mmsg, pp1)	SET_ERROR2(eerror, mmsg, pp1, 0)
 
 int exterr_to_ue(struct thread *td, struct uexterror *ue);
+void ktrexterr(struct thread *td);
 
 #else	/* _KERNEL */
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202506030407.55347esq071205>