From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.remote-ip=100.103.45.18 ARC-Seal: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; cv=none; t=1794298442; b=W9OWkFsRPoMznChLZxzuYbrxMlTJoSTikO8JUY03fsZggz64Pjpp7SpYBljs008/i+kW mDe5OCce+ucOAB4BqL0XipWYv5xpU+isfpFZu7S+iK9jKxICkWXVMsPQ6Niuvxsmv7LJF 1bWRuMCJFvWyB+B+oC8WaEMyI9JvLkcr/67Y+S9tZgkq307CfbN+i61oCpWLURaHd204x He0YgAKM/NvsgRPovZJA1gfyXnn2Lx52aZ4nTIy2CFVErALy35/5xR7v38fufkgE1iyF5 XtvWfKE4S0OH9X6HxbQSyLIkIWj0XbXEYUeL3U/erPms57IJXOFwLqOtVwY9Ye51iMQ== ARC-Message-Signature: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; c=relaxed/relaxed; t=1794298442; h=Received:DKIM-Signature:From:To:Cc:Subject:In-Reply-To:References: Date:Message-ID:MIME-Version:Content-Type; bh=gMycr7807LolwYYXBGXWxdyF4BE05wA7uJvTcdiuEbo=; b=fZW4nQRgV9eqPHj/2CUaV2iEyPIU3UdwSARuMx8CvWW1UqJZZVtaA6Ru7dgc3iQ4YuI4 yYn3+V7O6QjbpM1c4dCH40vPDOqPup0op311AleZZRfwn/miTFrIU6AqMvAdcZex9wZ0K R4thPbKlscMo2CVumQ6nr7kFWwNskOTDQNjNl3ywCLcn/368dpgtULhyyT1aw3Ibnfo+1 9l9nAI6/KVRR5LjM6La8kJKvC8kieCC/6m5k4b/6km3i41wy9w5EXnTzRflj01AQo15Sw NcKc3c3QlqiaGBJ6pQLhPh5eV+7xMfijdHAKAjt5nwYbbfXNu/UH5gmNs5iGq/p5KRw== ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20260515 header.b=cnU6FVC2; arc=none smtp.remote-ip=100.103.45.18 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1A402606A31C; Tue, 10 Nov 2026 08:14:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20260515 header.b=cnU6FVC2 Received: by smtp.kernel.org (Postfix) with ESMTPSA id DBF4E1F0089F; Tue, 10 Nov 2026 08:13:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1794298441; bh=gMycr7807LolwYYXBGXWxdyF4BE05wA7uJvTcdiuEbo=; h=From:To:Cc:Subject:In-Reply-To:References:Date; b=cnU6FVC2ndoDYMpl545KxokiHxlnQqHTbTLejYLhBQhUQU0OD/VFpHftOK/lxk4lC 3VyP/a/2B9xenXOWtoSSAn9+DMG+CKapLR9pYs/PJsriNlbUmNUzMD2lzwHgH0ov6q ZNtSsd75vVE5fDwCydkWm+Oereo7xmeZwVfE8g470RFFu22pGQ2ivD4hdkDzgZovrr +9ISZ4NMx0HTXZJmcqPYsIQAXhA8Qg2F2aUADY+jaonjV+ICbppVU27mkW6USZzS/u mQw15LZKOH2l5VELJvGlsIcS0UGEiD/Wwy2fejksI9viXKqrIqAkkntm2HqWxU0IPs ZQhbeSihbCvNA== From: Andreas Hindborg To: Gary Guo , Miguel Ojeda , Boqun Feng , Gary Guo , =?utf-8?Q?Bj=C3=B6rn?= Roy Baron , Benno Lossin , Alice Ryhl , Trevor Gross , Danilo Krummrich , Daniel Almeida , David Airlie , Simona Vetter , Tamir Duberstein , Alexandre Courbot , Onur =?utf-8?Q?=C3=96zkan?= Cc: rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org Subject: Re: [PATCH v3 1/2] rust: impl_flags: add conversion functions In-Reply-To: References: <20261105-impl-flags-additions-v3-0-5b17c01c2b15@kernel.org> <20261105-impl-flags-additions-v3-1-5b17c01c2b15@kernel.org> Date: Tue, 10 Nov 2026 09:11:32 +0100 Message-ID: <87mrrhqf63.fsf@t14s.mail-host-address-is-not-set> X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain "Gary Guo" writes: > On Thu Nov 5, 2026 at 3:42 PM GMT, Andreas Hindborg wrote: >> Add two conversion functions to the `impl_flags!` macro: >> >> - A `From<_>` implementation to convert from the flag value enum to >> underlying type. >> >> - A `TryFrom<_>` implementation to convert from the underlying >> representation to flag container type. >> >> Drop the hand-written `TryFrom for VmMapFlags` in tyr, which now >> conflicts with the implementation generated by `impl_flags!`. The two are >> equivalent. >> >> Signed-off-by: Andreas Hindborg >> --- >> drivers/gpu/drm/tyr/vm.rs | 13 ------------- >> rust/kernel/impl_flags.rs | 31 +++++++++++++++++++++++++++++++ >> 2 files changed, 31 insertions(+), 13 deletions(-) >> >> diff --git a/drivers/gpu/drm/tyr/vm.rs b/drivers/gpu/drm/tyr/vm.rs >> index 1dd11b2b1253..0d6e841a31ed 100644 >> --- a/drivers/gpu/drm/tyr/vm.rs >> +++ b/drivers/gpu/drm/tyr/vm.rs >> @@ -141,19 +141,6 @@ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { >> } >> } >> >> -impl TryFrom for VmMapFlags { >> - type Error = Error; >> - >> - fn try_from(value: u32) -> Result { >> - let valid = VmFlag::Readonly as u32 | VmFlag::Noexec as u32 | VmFlag::Uncached as u32; >> - >> - if value & !valid != 0 { >> - return Err(EINVAL); >> - } >> - Ok(Self(value)) >> - } >> -} >> - >> /// Arguments for a virtual memory map operation. >> struct VmMapArgs<'drm> { >> /// Access permissions and caching behavior for the mapping. >> diff --git a/rust/kernel/impl_flags.rs b/rust/kernel/impl_flags.rs >> index 6051487f6e28..052759b8038d 100644 >> --- a/rust/kernel/impl_flags.rs >> +++ b/rust/kernel/impl_flags.rs >> @@ -73,6 +73,17 @@ >> /// // useful for passing the value to a C API. >> /// let raw: u32 = read_only.bits(); >> /// assert_eq!(raw, Permission::Read as u32); >> +/// >> +/// // Convert a single flag value to its underlying integer representation. >> +/// let raw_read: u32 = Permission::Read.into(); >> +/// assert_eq!(raw_read, Permission::Read as u32); >> +/// >> +/// // Construct a `Permissions` value from a raw integer. `TryFrom` rejects >> +/// // integers whose set bits do not all correspond to declared flags. >> +/// let parsed = Permissions::try_from(raw_read | Permission::Write as u32).unwrap(); >> +/// assert!(parsed.contains(Permission::Read)); >> +/// assert!(parsed.contains(Permission::Write)); >> +/// assert!(Permissions::try_from(1 << 7).is_err()); >> /// ``` >> #[macro_export] >> macro_rules! impl_flags { >> @@ -115,6 +126,26 @@ fn from(value: $flags) -> Self { >> } >> } >> >> + impl ::core::convert::From<$flag> for $ty { >> + #[inline] >> + fn from(value: $flag) -> Self { >> + value as Self >> + } >> + } >> + >> + impl ::core::convert::TryFrom<$ty> for $flags { >> + type Error = ::kernel::error::Error; >> + >> + #[inline] >> + fn try_from(value: $ty) -> Result { >> + if value & !Self::all_bits() != 0 { >> + return Err(::kernel::error::code::EINVAL); > > IMO this should be a new type, perhaps something like > `kernel::bitflags::UnknownFlags`. Is really useful? If this happens, you probably cannot recover anyway. Best regards, Andreas Hindborg