git: 6d43260d49e6 - main - ktrace: generate events on extended errors
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 03 Jun 2025 04:07:40 UTC
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 */