From nobody Mon Jun 8 05:24:56 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 10CFD3B14DC; Fri, 5 Jun 2026 13:05:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780664705; cv=none; b=AhMoSlE6UMb0J8fJ1fOCLwSmuoWTcbL5+NnJ/ngko+c5/LTJO2CQ+/gnDN4e1kC8+sdhGus8Il0rkQgc5gkE6YVMQt2Aqo+7JekG6AEWYPfqDCiyqdVzDxVayQiYsCnL/1Fdry/1xTpA6xnT4GxaJrQJPcoky43w4OGsrK/An48= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780664705; c=relaxed/simple; bh=ioMw3xPGSMtDGXeeXbbiCBXt5yGAIRMASDj8ubWaMeM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=aWrHsF1uCnbagYTLSn1MvybpLJYpe+pTFxS2/o5cTKPXPXTOo1KdcWVQ6aoNriBt70+LeiZSLfxH7UR9HKHd1LqYl+I/WVnCiwFCYPjBgU9NJ3QkbmivsCERmqb4oJQ4tp3nULX5wKuSA95v4d3SF2ucGakY/2Guk8aptELzUTE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=BxiVQDvI; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="BxiVQDvI" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 016E41F0089A; Fri, 5 Jun 2026 13:05:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1780664703; bh=Odg6jQOIPJGRNnkKjmmS4IoAqIuyjP6bRgIbkVWP8WM=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=BxiVQDvIHPhR7jGy3urehVvP/UBfpbOxgCeGuU13XlJuw4Hmx8ADtZklmnt5vjwN4 7BO0P7+szIxIZD+iFkYMGFZy9ifZlNM8DnnXcVfoiLkRWxYdk5HQiY0X7K9dmnNPWJ 9TTaftf7RBz8NqPqCJIjLknFY8IwHKpv/RS3QMbrLTWgUXFVEQqqYKDitchBwoXcof /uqwb0PANeeUhvW3UaVLQzmuShK0+DIkR+OWgNrIBrxG416CGm2L69fpckBbwjmKVb BE+gU83ZV/gh4GV6cGXzP9WYXmzTmH7LiIvZpC0qS0b+V6IXS5BxSC9CgdTBvKQ3aO oIHssDXRKNqiQ== From: Andreas Hindborg Date: Fri, 05 Jun 2026 15:04:38 +0200 Subject: [PATCH v2 1/2] rust: impl_flags: add conversion functions Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260605-impl-flags-additions-v2-1-0d27242f460b@kernel.org> References: <20260605-impl-flags-additions-v2-0-0d27242f460b@kernel.org> In-Reply-To: <20260605-impl-flags-additions-v2-0-0d27242f460b@kernel.org> To: Miguel Ojeda , Gary Guo , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Benno Lossin , Alice Ryhl , Trevor Gross , Danilo Krummrich , Boqun Feng , Boqun Feng Cc: rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, Andreas Hindborg X-Mailer: b4 0.16-dev X-Developer-Signature: v=1; a=openpgp-sha256; l=2232; i=a.hindborg@kernel.org; h=from:subject:message-id; bh=ioMw3xPGSMtDGXeeXbbiCBXt5yGAIRMASDj8ubWaMeM=; b=owEBbQKS/ZANAwAKAfpQKQiqxb3QAcsmYgBqIslnAcmiQK04rwXfchu57Cxi5cKsxAWbbHkIt qkOkJe0VkCJAjMEAAEKAB0WIQRXitnI2WZ2JirAaob6UCkIqsW90AUCaiLJZwAKCRD6UCkIqsW9 0MtQD/9KJ31whqzYpkryipluRwxxZV2IlfYh39WLBY4dBcMJ4s9fM6wceppcdy1NYJGefFXEXGF 2EYVX656D7psoc1+TyeYVsDxOyRG48U09FTxJgSIMFOHsYZHMIzF0g5y3HBgPCXK9pYMF4j6Ffk mwgW7NfNHhzVD5KUtW9ACYGWjEOHBVy9aDzxYxuyrPLrxpyJM/dmY+T5hU/21chRgxEVsxu7xr3 0EyGyHV3Et6yUvB40kB5ZwgT5TgaliqhUiT11kcM1v/QiFpBl780qQ6sJtSe2XmMHsdayZUVjbW g+O60ewOUUFmcXNJC+EdtRC3GPMn50Yh+eJWPyuufw2ynaGo+edWaa8OcViUGUDmsd/9rqqNhgK KryU6SktdRgI2b4yCJB5kt4zua/iQ9LR8u+nxSYcn52/V+4Vn9vo7BxAf1/xa02ghGb6r1mh2Ub kbwg21t0gF1Oaw9f2owcXDttTkQTGeLxgTJPvL71EdZ8fQuBVFV+k7Qr0JDCACpstgduqjDtITR 5tVxOOXw9RQHzAfWmGCN6nGJypDS5ab4uea5o3AE/tFEs7FlpEDECW3btgVRVu8aP1snEL92R04 +WzIp45ja9wpwztNhYdjAHe+BNaXiR4rHV/Ts4+NbTREjRE5FDxubo4tn8p4gWjOt9McNpPi+yz ZYXOGSaU38uk/Og== X-Developer-Key: i=a.hindborg@kernel.org; a=openpgp; fpr=3108C10F46872E248D1FB221376EB100563EF7A7 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. Signed-off-by: Andreas Hindborg --- rust/kernel/impl_flags.rs | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/rust/kernel/impl_flags.rs b/rust/kernel/impl_flags.rs index 1d39d54540dc..04a4b0a356df 100644 --- a/rust/kernel/impl_flags.rs +++ b/rust/kernel/impl_flags.rs @@ -77,6 +77,17 @@ /// // representation =E2=80=94 useful for passing the value to a C API. /// let raw: u32 =3D read_only.bits(); /// assert_eq!(raw, Permission::Read as u32); +/// +/// // Convert a single flag value to its underlying integer representatio= n. +/// let raw_read: u32 =3D Permission::Read.into(); +/// assert_eq!(raw_read, Permission::Read as u32); +/// +/// // Construct a `Permissions` value from a raw integer. `TryFrom` rejec= ts +/// // integers whose set bits do not all correspond to declared flags. +/// let parsed =3D Permissions::try_from(raw_read | Permission::Write as u= 32).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 { @@ -119,6 +130,26 @@ fn from(value: $flags) -> Self { } } =20 + 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 =3D ::kernel::error::Error; + + #[inline] + fn try_from(value: $ty) -> Result { + if value & !$flags::all_bits() !=3D 0 { + return Err(::kernel::error::code::EINVAL); + } + + Ok(Self(value)) + } + } + impl ::core::ops::BitOr for $flags { type Output =3D Self; #[inline] --=20 2.51.2 From nobody Mon Jun 8 05:24:56 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 621903B14AB; Fri, 5 Jun 2026 13:04:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780664698; cv=none; b=SboThdtvgnjkgY7y/Q6DQ4WNc5TWf2TcxUs2hqkqVHLlqexPnbPoGUAkxU35K0s7lYOKjf9n8qBPECziVmRnq+am2KybMwYKK+vX07fixxV96JHT+Z3tzROCI9Dies9yhFSpDBO9HXHHIRqH2yh7w499eGAIJerIxXYaYZl/Hnc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780664698; c=relaxed/simple; bh=y8SrsZf4Er1k5T4KxEmOkOYdCLVERYK0qajWVQobk+g=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=tdJyMlm5fu2CuNHQBUFON5UEcHNQJ1R889oZDZJXRCqNgLeVOPRsDnz5gRnN82rjrUvnxTU915t2/kR95MCt4vjOv+dJqkOBaX1yeKrxaO7aYMuPa27QrtBjVBWq1JcKYwmfty/6dRltJuZ+paolUdp7++3eSv+kPcVYjJojBAY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=JSEgcKUs; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="JSEgcKUs" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 590441F00893; Fri, 5 Jun 2026 13:04:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1780664697; bh=J8xWN6FwFJntxASihgK6OAXFm1JzLZteeOE+ZioOK3g=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=JSEgcKUsg+yJVkb9iYduhcgHuxOM0UK445MNEB/QOyjamoX/C8+KLCaoR9SMuJQZz OJIuqpR+XCAlSTE1ILatHnBZLNwgUWnZCe+I005hQhpkb8yF54rnm6Ll+A5qucRHbV JoRfa3T6cFocEQkJ61mwDqbfyoD0rVx4fG1FoookV5v3ktcG4cTff1DX2aDs5TDgVj +2fI17BXd0ZydDzZjnQdZrcy3Hk615Z/58e6XinXW9xFzLnTmtCgUadh2HFvUiuteO Jne+fZ4x5gR3FK6dkxekj6VmO4i4/KOPRCJb4WuX65F8HNuL5tNUQsroOJIUZK4jE3 49Jp/lo7rNByQ== From: Andreas Hindborg Date: Fri, 05 Jun 2026 15:04:39 +0200 Subject: [PATCH v2 2/2] rust: impl_flags: add bitwise operations with the underlying type Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260605-impl-flags-additions-v2-2-0d27242f460b@kernel.org> References: <20260605-impl-flags-additions-v2-0-0d27242f460b@kernel.org> In-Reply-To: <20260605-impl-flags-additions-v2-0-0d27242f460b@kernel.org> To: Miguel Ojeda , Gary Guo , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Benno Lossin , Alice Ryhl , Trevor Gross , Danilo Krummrich , Boqun Feng , Boqun Feng Cc: rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, Andreas Hindborg X-Mailer: b4 0.16-dev X-Developer-Signature: v=1; a=openpgp-sha256; l=1476; i=a.hindborg@kernel.org; h=from:subject:message-id; bh=y8SrsZf4Er1k5T4KxEmOkOYdCLVERYK0qajWVQobk+g=; b=owEBbQKS/ZANAwAKAfpQKQiqxb3QAcsmYgBqIsloYZBCseRps0SseKyEZHcMuXu4a1vgsADpn NP2dRMVpnyJAjMEAAEKAB0WIQRXitnI2WZ2JirAaob6UCkIqsW90AUCaiLJaAAKCRD6UCkIqsW9 0H86D/4pSci7tqXk4gsSChFFDPjYVNmSnDk1ukzTJWo66JIjGq0KKM10xlONbxtti9nmCkxxj6b hYjSY+u4AkFwVXtwdtGA7jxAAmHcD9xIqLw9beJpLLuTuDUFXGh2nEbxt3erU1UtjQrSzAd/1oK Ul/TVqafteiinMz6jeeY4VGUVe8c1RQU33CUxdLC6q4pKpN0e0L+NDiJn0mA2ZeFYhrcCEOj8QT Gbq48gXCcYTXetPBMcGkyqg+EAOijBJVg39e3JtpBlghi/mKSr802QSM1rzrLhyzNQaOc+fDvWj YRbaZcP1LNRLmCoVIWtNbqKmEZ4PXLYyxG+6N7XWT0Q6XIjy7cOt/sy+x1UxOwq6qondIPTVLhJ BEyr0Rzev5pQRUqk2AFqYgHAazTfHunH/AW0dHtqVoYzIMqWx8puRlsryR8V1XnF/LqXvrb2ziv fUk2smGUMyFFR9b+6DNaIrf8DJo8SvXKEHzb4mTbrsKJJdRzJEqvyE6P4ehvP7+bRNEAFWkm/Mc bhO82+TbKFaKrVyidQJSSdC8FzlxhZbFSJnFmp49XaLZpuDOggeUD9507/wLozEGyuZC7NfjnQo xn4qZJOJcCDJsb7GxgYTDQQSICy3ZvElMYU3Iz8P8SgiXCjSDAro73aNRBSxwChaHmBWumI9Tjg ojmN+24K3TwuQPQ== X-Developer-Key: i=a.hindborg@kernel.org; a=openpgp; fpr=3108C10F46872E248D1FB221376EB100563EF7A7 Add bitwise or operations between the flag value enum and the underlying type. This is useful when manipulating flags from C API without round tripping into the Rust flag container type: let mut lim: bindings::queue_limits =3D unsafe { core::mem::zeroed() }; ... if self.write_cache { lim.features |=3D request::Feature::WriteCache; } The above code would be needlessly verbose without this direct assignment option. Signed-off-by: Andreas Hindborg --- rust/kernel/impl_flags.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/rust/kernel/impl_flags.rs b/rust/kernel/impl_flags.rs index 04a4b0a356df..8340740b2efb 100644 --- a/rust/kernel/impl_flags.rs +++ b/rust/kernel/impl_flags.rs @@ -280,6 +280,22 @@ fn not(self) -> Self::Output { } } =20 + impl ::core::ops::BitOr<$flag> for $ty { + type Output =3D Self; + + #[inline] + fn bitor(self, rhs: $flag) -> Self::Output { + self | <$flag as Into>::into(rhs) + } + } + + impl ::core::ops::BitOrAssign<$flag> for $ty { + #[inline] + fn bitor_assign(&mut self, rhs: $flag) { + *self =3D *self | <$flag as Into>::into(rhs) + } + } + impl $flags { /// Returns an empty instance where no flags are set. #[inline] --=20 2.51.2