From nobody Sat Jul 12 17:07:28 2025 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4bfZl56Bb2z60s4n; Sat, 12 Jul 2025 17:07:29 +0000 (UTC) (envelope-from jhb@FreeBSD.org) Received: from smtp.freebsd.org (smtp.freebsd.org [IPv6:2610:1c1:1:606c::24b:4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "smtp.freebsd.org", Issuer "R11" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4bfZl55GdWz3mqm; Sat, 12 Jul 2025 17:07:29 +0000 (UTC) (envelope-from jhb@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1752340049; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=IAwjODVkQtbTfXAaP5fLVk0nw5L+W2b2s/pDribMrCc=; b=vcE+JgNcoolx2RdkSYsj0QQLjdKCUitZE//+M4v+9MFphUIBCmpFJMUNBSptT/+lSqv4C0 SkyYsDPAJO5h7hajSZiOUtzb2B+WtsXjsyrEy7loobgUfKk34putLe8vZMMSd4FWBEeUWb RbktjaqvfaL94NY8fEnnmo1DsjfDyMKIz3r+dpTMJPMlGO1xcKxMsMuT8RcfYBr5YVdQP+ 8+gEVzKsXtyDUokZf/L4kxsLzXkdWtyb5pc0mLORS92E1AJO+GvzwJj1iCx+ZKvCVcY0/C Cqo0tBj0Pv5nXvAfF/PTalkO/ORAmsxx6zfmh+4i8J6KQTYg1egPUDOCkuFa6w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1752340049; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=IAwjODVkQtbTfXAaP5fLVk0nw5L+W2b2s/pDribMrCc=; b=GatC8Z1BdjVopGG1GcP35GvLIXtMSVCbCwwUsNPPWWENsR0eTVDRhHqvYy9Z1lN5SY4rkS NH6B4jbHyvlyuVTewrsmGDT/Bz6GBFUefopHHnNmpuoZ+vCSqDxVV763UCa2Zc5FJRW+/8 Ld+xlcigA3b6LqmBHlEjG0YD9HyUGKUwHJc6ETPzX0Q0R5LzOvYnfNiZglO5IW0rDVqmPp C7gBWrnHc9p0Fa5kDPrBzeeow3c25SOE9VvXIRSwZ+/GCxsjNiiiOh8lFznOxBAq8UXyaw 7ar28vXSuMZPBxtcG0WsdjkPLgo7x83fjH5S8zDJjp1VKzbK+ycha5zfXuzegA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1752340049; a=rsa-sha256; cv=none; b=NaqvHLBR3FSQrbwuF1e1POtNW0VkqIU9kxNdK4Tr46gCA62Dd3BOZ5vsd+GNH3TdBTeWEL Acbkc8adXIQtDskPq1SmL2fdt53q/vB01r94nMZ/e/l69JNPcgUeNubBPRCm1s8k27v2eu Btg0sZKjwH2QDRrRGy9lLmxnPNBib8VR1wk3IE4O3GaAwgcyhKemlaSZE4AJ1pK53b/GMh xRPU9hfXnkeB/QJYyPxB/rly2IzDqHV0o8uImgj5N4GH1KawzXKelLBxWUUr9X+8qRQHK7 HkoT0Uu0Z2eaO2jKtmd6mwsVc2oogSDIgxdTwG6HAiW95ol0tULJNb4mJZ1vdA== Received: from [IPV6:2601:5c0:4200:b830:d81d:ac36:2f10:9f48] (unknown [IPv6:2601:5c0:4200:b830:d81d:ac36:2f10:9f48]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) (Authenticated sender: jhb) by smtp.freebsd.org (Postfix) with ESMTPSA id 4bfZl53LkrzwGb; Sat, 12 Jul 2025 17:07:29 +0000 (UTC) (envelope-from jhb@FreeBSD.org) Message-ID: <85f6ca74-b557-4658-93a0-62774d7da196@FreeBSD.org> Date: Sat, 12 Jul 2025 13:07:28 -0400 List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: git: ba0d9b43e940 - main - kern_descrip.c: provide helpers to translate between fd flags namespace Content-Language: en-US To: Konstantin Belousov Cc: src-committers@freebsd.org, dev-commits-src-all@freebsd.org, dev-commits-src-main@freebsd.org References: <202507082149.568LnGOU086303@gitrepo.freebsd.org> From: John Baldwin In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 7/11/25 15:00, Konstantin Belousov wrote: > On Fri, Jul 11, 2025 at 11:46:33AM -0400, John Baldwin wrote: >> On 7/8/25 17:49, Konstantin Belousov wrote: >>> The branch main has been updated by kib: >>> >>> URL: https://cgit.FreeBSD.org/src/commit/?id=ba0d9b43e940077f4025e7e4e85d16c8d525db79 >>> >>> commit ba0d9b43e940077f4025e7e4e85d16c8d525db79 >>> Author: Konstantin Belousov >>> AuthorDate: 2025-07-08 16:30:29 +0000 >>> Commit: Konstantin Belousov >>> CommitDate: 2025-07-08 21:48:59 +0000 >>> >>> kern_descrip.c: provide helpers to translate between fd flags namespace >>> Reviewed by: markj >>> Sponsored by: The FreeBSD Foundation >>> Differential revision: https://reviews.freebsd.org/D51206 >>> --- >>> sys/kern/kern_descrip.c | 110 +++++++++++++++++++++++++++++++++++++++--------- >>> 1 file changed, 90 insertions(+), 20 deletions(-) >>> >>> diff --git a/sys/kern/kern_descrip.c b/sys/kern/kern_descrip.c >>> index 406236fc2723..2e1da2fdee29 100644 >>> --- a/sys/kern/kern_descrip.c >>> +++ b/sys/kern/kern_descrip.c >>> @@ -480,6 +480,90 @@ kern_fcntl_freebsd(struct thread *td, int fd, int cmd, intptr_t arg) >>> return (error); >>> } >>> +struct flags_trans_elem { >>> + u_int f; >>> + u_int t; >>> +}; >>> + >>> +static u_int >>> +flags_trans(const struct flags_trans_elem *ftes, int nitems, u_int from_flags) >>> +{ >>> + u_int res; >>> + int i; >>> + >>> + res = 0; >>> + for (i = 0; i < nitems; i++) { >>> + if ((from_flags & ftes[i].f) != 0) >>> + res |= ftes[i].t; >>> + } >>> + return (res); >>> +} >>> + >>> +static uint8_t >>> +fd_to_fde_flags(int fd_flags) >>> +{ >>> + static const struct flags_trans_elem fd_to_fde_flags_s[] = { >>> + { .f = FD_CLOEXEC, .t = UF_EXCLOSE }, >>> + { .f = FD_CLOFORK, .t = UF_FOCLOSE }, >>> + { .f = FD_RESOLVE_BENEATH, .t = UF_RESOLVE_BENEATH }, >>> + }; >>> + >>> + return (flags_trans(fd_to_fde_flags_s, nitems(fd_to_fde_flags_s), >>> + fd_flags)); >>> +} >>> + >>> +static int >>> +fde_to_fd_flags(uint8_t fde_flags) >>> +{ >>> + static const struct flags_trans_elem fde_to_fd_flags_s[] = { >>> + { .f = UF_EXCLOSE, .t = FD_CLOEXEC }, >>> + { .f = UF_FOCLOSE, .t = FD_CLOFORK }, >>> + { .f = UF_RESOLVE_BENEATH, .t = FD_RESOLVE_BENEATH }, >>> + }; >>> + >>> + return (flags_trans(fde_to_fd_flags_s, nitems(fde_to_fd_flags_s), >>> + fde_flags)); >>> +} >>> + >>> +static uint8_t >>> +fddup_to_fde_flags(int fddup_flags) >>> +{ >>> + static const struct flags_trans_elem fddup_to_fde_flags_s[] = { >>> + { .f = FDDUP_FLAG_CLOEXEC, .t = UF_EXCLOSE }, >>> + { .f = FDDUP_FLAG_CLOFORK, .t = UF_FOCLOSE }, >>> + }; >>> + >>> + return (flags_trans(fddup_to_fde_flags_s, nitems(fddup_to_fde_flags_s), >>> + fddup_flags)); >>> +} >>> + >>> +static uint8_t >>> +close_range_to_fde_flags(int close_range_flags) >>> +{ >>> + static const struct flags_trans_elem close_range_to_fde_flags_s[] = { >>> + { .f = CLOSE_RANGE_CLOEXEC, .t = UF_EXCLOSE }, >>> + { .f = CLOSE_RANGE_CLOFORK, .t = UF_FOCLOSE }, >>> + }; >>> + >>> + return (flags_trans(close_range_to_fde_flags_s, >>> + nitems(close_range_to_fde_flags_s), close_range_flags)); >>> +} >>> + >>> +static uint8_t >>> +open_to_fde_flags(int open_flags, bool sticky_orb) >>> +{ >>> + static const struct flags_trans_elem open_to_fde_flags_s[] = { >>> + { .f = O_CLOEXEC, .t = UF_EXCLOSE }, >>> + { .f = O_CLOFORK, .t = UF_FOCLOSE }, >>> + { .f = O_RESOLVE_BENEATH, .t = UF_RESOLVE_BENEATH }, >>> + }; >>> + _Static_assert(open_to_fde_flags_s[nitems(open_to_fde_flags_s) - 1].f == >>> + O_RESOLVE_BENEATH, "O_RESOLVE_BENEATH must be last, for sticky_orb"); >> >> This broke the GCC builds it seems. GCC doesn't think that it can compute this >> expression at compile time. >> >> From https://ci.freebsd.org/job/FreeBSD-main-amd64-gcc14_build/1022/console: >> >> 10:32:02 /workspace/src/sys/kern/kern_descrip.c: In function 'open_to_fde_flags': >> 10:32:02 /workspace/src/sys/kern/kern_descrip.c:560:79: error: expression in static = >> 10:32:02 assertion is not constant >> 10:32:02 560 | _Static_assert(open_to_fde_flags_s[nitems(open_to_fde_flags= >> 10:32:02 _s) - 1].f =3D=3D >> > > I am unable to propose anything better than the patch below. We have enough > #ifdef __clang__ in non-contrib sources already, so this should be not a > huge crime? > > % rg -g '!contrib/*' __clang__ | wc -l > 171 > > commit 96e6b15b0a1407af45ebe1ad38ee53627d09d16b > Author: Konstantin Belousov > Date: Fri Jul 11 21:57:32 2025 +0300 > > kern_descrip.c: only allow complex expression in Static_assert() for clang > > gcc cannot compute the assert expression. > > Reported by: jhb > > diff --git a/sys/kern/kern_descrip.c b/sys/kern/kern_descrip.c > index 93bdd41d1515..c4f5e586b0ed 100644 > --- a/sys/kern/kern_descrip.c > +++ b/sys/kern/kern_descrip.c > @@ -557,8 +557,10 @@ open_to_fde_flags(int open_flags, bool sticky_orb) > { .f = O_CLOFORK, .t = UF_FOCLOSE }, > { .f = O_RESOLVE_BENEATH, .t = UF_RESOLVE_BENEATH }, > }; > +#ifdef __clang__ > _Static_assert(open_to_fde_flags_s[nitems(open_to_fde_flags_s) - 1].f == > O_RESOLVE_BENEATH, "O_RESOLVE_BENEATH must be last, for sticky_orb"); > +#endif I think this is fine. Mark Millard followed up with me offline and it may be that GCC is technically more correct here with what is allowed to be computed as a static constant at compile time FWIW. C++' constexpr allows for a wider range of compile-time constant values compared to C and this sort of thing feels very constexpr-like. -- John Baldwin