Re: git: 4e207e3849d4 - main - exterr: make SET_ERRORX() macros an expression evaluating to the errno
Date: Sat, 14 Jun 2025 12:50:54 UTC
On 6/13/25 15:40, Konstantin Belousov wrote:
> The branch main has been updated by kib:
>
> URL: https://cgit.FreeBSD.org/src/commit/?id=4e207e3849d47648ced17da16aad39355b99d9b2
>
> commit 4e207e3849d47648ced17da16aad39355b99d9b2
> Author: Konstantin Belousov <kib@FreeBSD.org>
> AuthorDate: 2025-06-13 17:32:50 +0000
> Commit: Konstantin Belousov <kib@FreeBSD.org>
> CommitDate: 2025-06-13 19:39:55 +0000
>
> exterr: make SET_ERRORX() macros an expression evaluating to the errno
>
> And move the actual td_kexterr fill code into the function, saving some
> text.
>
> Suggested and reviewed by: markj
> Sponsored by: The FreeBSD Foundation
> Differential revision: https://reviews.freebsd.org/D50836
> ---
> sys/kern/sys_generic.c | 20 ++++++++++++++++++++
> sys/sys/exterrvar.h | 22 +++++++---------------
> 2 files changed, 27 insertions(+), 15 deletions(-)
>
> diff --git a/sys/kern/sys_generic.c b/sys/kern/sys_generic.c
> index ec61d0bdc541..d31ff3b939cc 100644
> --- a/sys/kern/sys_generic.c
> +++ b/sys/kern/sys_generic.c
> @@ -2281,3 +2281,23 @@ sys_exterrctl(struct thread *td, struct exterrctl_args *uap)
> return (EINVAL);
> }
> }
> +
> +int
> +exterr_set(int eerror, int category, const char *mmsg, uintptr_t pp1,
> + uintptr_t pp2, int line)
> +{
> + struct thread *td;
> +
> + td = curthread;
> + if ((td->td_pflags2 & TDP2_UEXTERR) != 0) {
> + td->td_pflags2 |= TDP2_EXTERR;
> + td->td_kexterr.error = eerror;
> + td->td_kexterr.cat = category;
> + td->td_kexterr.msg = mmsg;
> + td->td_kexterr.p1 = pp1;
> + td->td_kexterr.p2 = pp2;
> + td->td_kexterr.src_line = line;
> + ktrexterr(td);
> + }
> + return (eerror);
> +}
> diff --git a/sys/sys/exterrvar.h b/sys/sys/exterrvar.h
> index 4b168446e23b..d3c2c7c92d06 100644
> --- a/sys/sys/exterrvar.h
> +++ b/sys/sys/exterrvar.h
> @@ -31,27 +31,19 @@
> #endif
>
> #ifdef BLOAT_KERNEL_WITH_EXTERR
> -#define SET_ERROR_MSG(mmsg) _Td->td_kexterr.msg = mmsg
> +#define SET_ERROR_MSG(mmsg) (mmsg)
> #else
> -#define SET_ERROR_MSG(mmsg) _Td->td_kexterr.msg = NULL
> +#define SET_ERROR_MSG(mmsg) NULL
> #endif
>
> -#define SET_ERROR2(eerror, mmsg, pp1, pp2) do { \
> - struct thread *_Td = curthread; \
> - if ((_Td->td_pflags2 & TDP2_UEXTERR) != 0) { \
> - _Td->td_pflags2 |= TDP2_EXTERR; \
> - _Td->td_kexterr.error = eerror; \
> - _Td->td_kexterr.cat = EXTERR_CATEGORY; \
> - SET_ERROR_MSG(mmsg); \
> - _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_ERROR2(eerror, mmsg, pp1, pp2) \
> + exterr_set(eerror, EXTERR_CATEGORY, SET_ERROR_MSG(mmsg), \
> + (uintptr_t)(pp1), (uintptr_t)(pp2), __LINE__)
> #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_set(int eerror, int category, const char *mmsg, uintptr_t pp1,
> + uintptr_t pp2, int line);
> int exterr_to_ue(struct thread *td, struct uexterror *ue);
> void ktrexterr(struct thread *td);
BTW, you could have a single SET_ERROR(eerror, mmsg, ...) wrapper around SET_ERRORx
following what is done for CTR() (vs CTRx()).
--
John Baldwin