The branch main has been updated by kib:

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

commit 6d43260d49e6af7de43a0a3181178d7a3ee20613
Author:     Konstantin Belousov <k...@freebsd.org>
AuthorDate: 2025-05-31 21:42:49 +0000
Commit:     Konstantin Belousov <k...@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 */
 

Reply via email to