From nobody Sat Jul 25 15:51:52 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 256DA422536; Thu, 16 Jul 2026 13:02:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784206957; cv=none; b=aerh+LU2GkOYHVEgk3xCJtrv4btFdfBGPn5foMY1FFX+53xyC67zxhKz7JnDvJmzo5OyEtmITY16+i6B3d9YT64o2LIK3H7H63lFMcI2X8zZcA9+CJwi09iyTr1BmoyUxNKIt8sfVyV5dMYTDGAVV57DLjkUOKfrWrsZIG4dnmM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784206957; c=relaxed/simple; bh=P9UPmJMz3AA6eRI9/OSTVoLVwNjsmQ+mX4uw+c/SZFA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=IbmvBqwJrlo/6WblhWYCwa1eUZZpMYpXDSSOXnTcKy5hUuAStRYzVFGpxR5agQ7o+h+kc+0WRZncMvEQnbRqHDtuwj1LnlNajX7Zv2+AAaJSmJxmAKBvcVBuDLpAOOSTtlaZ9cHHKfN2wEreA9aIVUm0An//msB+XXSe2TqZabk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=C850MqgX; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="C850MqgX" Received: by smtp.kernel.org (Postfix) with ESMTPS id C73AAC2BCF4; Thu, 16 Jul 2026 13:02:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1784206956; bh=P9UPmJMz3AA6eRI9/OSTVoLVwNjsmQ+mX4uw+c/SZFA=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=C850MqgXIcaSeUtXGKp3itwQje5PijjZHrClLyHTR7r+0DmDcAFILXacrAhjJMZWV TGI+upzKbfYvs6sRyc/xldRR/yyB5pDPaMxpjK1V0o6DMfDezW32MnKSwnvdwEyMru /Nnm2qIgSEP7F4juMj1CsSuZVTK0V/ukaJ3ETLcXeNmWsqAv4pt2elyWbcjAFEhIA6 Zly3pEzKuqdFlD/0kXJsLj3SZncNpVBVA7iS3MZvLI+vxqZvnb7epI+d7jBdvFqykg oJYA0xS/emOpHsq00LTRpKSgjJHIF1gN6NB0r+eIF7JGVLkvACHrC2Dk7QM7BKhZP2 cGr4KogKplwwQ== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id A7D18C44501; Thu, 16 Jul 2026 13:02:36 +0000 (UTC) From: Jahnavi MN via B4 Relay Date: Thu, 16 Jul 2026 13:02:34 +0000 Subject: [PATCH 1/3] rust_binder: Update defer_work bitmaps to use kernel::impl_flags! 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: <20260716-b4-rust_binder_impl_flags-v1-1-b4201d3f15b3@google.com> References: <20260716-b4-rust_binder_impl_flags-v1-0-b4201d3f15b3@google.com> In-Reply-To: <20260716-b4-rust_binder_impl_flags-v1-0-b4201d3f15b3@google.com> To: Greg Kroah-Hartman , =?utf-8?q?Arve_Hj=C3=B8nnev=C3=A5g?= , Todd Kjos , Christian Brauner , Carlos Llamas , Alice Ryhl , Benno Lossin , Gary Guo Cc: linux-kernel@vger.kernel.org, rust-for-linux@vger.kernel.org, Jahnavi MN X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1784206955; l=3623; i=jahnavimn@google.com; s=20260702; h=from:subject:message-id; bh=/uxVIdRsjjzzayVpGS2ftrtM8UPE7MkaSdizzzP0eRo=; b=zbpP0nXpy6VPAfq11Yz/3KU5NwqiCk3ADs9Ti8zOM85dpUUFLvs5IuzYThnIbkXkcwoG5Q6Br 3Er+j6wOXlfB8L/tJcXLwmWlluf9eKBJDvO4YIj8lsOfnjIjCgNZADZ X-Developer-Key: i=jahnavimn@google.com; a=ed25519; pk=9aLfw3FepTOJwTS7jRXm7pDH87eBeZMXBPrqwU0//RE= X-Endpoint-Received: by B4 Relay for jahnavimn@google.com/20260702 with auth_id=849 X-Original-From: Jahnavi MN Reply-To: jahnavimn@google.com From: Jahnavi MN - Define `DeferWorks(u8)` and `DeferWork` enum using `bit_u8` offsets. - Change `ProcessInner.defer_work` type from `u8` to `DeferWorks`. - Update `Process::release()` and `Process::flush()` to check for empty states using `DeferWorks::empty()`. - Update the workqueue runner to inspect flags using `.contains()`. Signed-off-by: Jahnavi MN Reviewed-by: Alice Ryhl --- drivers/android/binder/process.rs | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/drivers/android/binder/process.rs b/drivers/android/binder/pro= cess.rs index 0555c4bd503e..84747d998636 100644 --- a/drivers/android/binder/process.rs +++ b/drivers/android/binder/process.rs @@ -16,6 +16,7 @@ =20 use kernel::{ bindings, + bits::bit_u8, cred::Credential, error::Error, fs::file::{self, File}, @@ -70,9 +71,18 @@ fn new(address: usize, size: usize) -> Self { } } =20 -// bitflags for defer_work. -const PROC_DEFER_FLUSH: u8 =3D 1; -const PROC_DEFER_RELEASE: u8 =3D 2; +kernel::impl_flags!( + /// Represents multiple deferred work flags. + #[derive(Debug, Clone, Default, Copy, PartialEq, Eq)] + pub struct DeferWorks(u8); + + /// Represents a single deferred work category. + #[derive(Debug, Clone, Copy, PartialEq, Eq)] + pub enum DeferWork { + Flush =3D bit_u8(0), + Release =3D bit_u8(1), + } +); =20 #[derive(Copy, Clone)] pub(crate) enum IsFrozen { @@ -121,7 +131,7 @@ pub(crate) struct ProcessInner { started_thread_count: u32, =20 /// Bitmap of deferred work to do. - defer_work: u8, + defer_work: DeferWorks, =20 /// Number of transactions to be transmitted before processes in freez= e_wait /// are woken up. @@ -151,7 +161,7 @@ fn new() -> Self { requested_thread_count: 0, max_threads: 0, started_thread_count: 0, - defer_work: 0, + defer_work: DeferWorks::default(), outstanding_txns: 0, is_frozen: IsFrozen::No, sync_recv: false, @@ -489,13 +499,13 @@ fn run(me: Arc) { { let mut inner =3D me.inner.lock(); defer =3D inner.defer_work; - inner.defer_work =3D 0; + inner.defer_work =3D DeferWorks::default(); } =20 - if defer & PROC_DEFER_FLUSH !=3D 0 { + if defer.contains(DeferWork::Flush) { me.deferred_flush(); } - if defer & PROC_DEFER_RELEASE !=3D 0 { + if defer.contains(DeferWork::Release) { me.deferred_release(); } } @@ -1649,8 +1659,8 @@ pub(crate) fn release(this: Arc, _file: &Fil= e) { let should_schedule; { let mut inner =3D this.inner.lock(); - should_schedule =3D inner.defer_work =3D=3D 0; - inner.defer_work |=3D PROC_DEFER_RELEASE; + should_schedule =3D inner.defer_work =3D=3D DeferWorks::empty(= ); + inner.defer_work |=3D DeferWork::Release; binderfs_file =3D inner.binderfs_file.take(); } =20 @@ -1667,8 +1677,8 @@ pub(crate) fn flush(this: ArcBorrow<'_, Process>) -> = Result { let should_schedule; { let mut inner =3D this.inner.lock(); - should_schedule =3D inner.defer_work =3D=3D 0; - inner.defer_work |=3D PROC_DEFER_FLUSH; + should_schedule =3D inner.defer_work =3D=3D DeferWorks::empty(= ); + inner.defer_work |=3D DeferWork::Flush; } =20 if should_schedule { --=20 2.55.0.229.g6434b31f56-goog From nobody Sat Jul 25 15:51:52 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 2584E4229B7; Thu, 16 Jul 2026 13:02:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784206957; cv=none; b=LQmyiAEDUgG3MTOFVsQaeSkzuQESctLsT00TBG9pDtZUOwYfMyQuZaSMc6w/vyXgtzkH6me8jGiHtbP2uyRHl2rT4tB5fu3dVMQ4hIe5zBri2/j5TWvQ4GMbdfMMTPfApVB9q0wWVbpLV5KXWvvi+FizwSNGlgEGMQ0/Ux7F3Tw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784206957; c=relaxed/simple; bh=dQMV+W2VfC1tmU2YeNGRNWA1g2lP1PKU+Dgx9Fu46/U=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=M41mig9lcQnTcPbGxrg7U+98fa4NED/y1b6t4Pamn8185iRuQ2BLX6TQ12uQwMOpMUwc7gLXzUBWmZvKWrAWrYIFH4v+4dSXvypIdOGBqh3xbRq7zQ86km6o/0DBLnvpQvq8+nZ6AtH3pJFfZMKA+5f+jAyyarrxrEVWZ2UXXS8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Uui9YvxU; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Uui9YvxU" Received: by smtp.kernel.org (Postfix) with ESMTPS id D2E24C2BCC9; Thu, 16 Jul 2026 13:02:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1784206956; bh=dQMV+W2VfC1tmU2YeNGRNWA1g2lP1PKU+Dgx9Fu46/U=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=Uui9YvxUgwvBeLNTPWvHi+iYcX8dNFTbzGU3t36gGdQjzPLqDIZD+Tf/+uhN4WoFw JN25fXlgfWQlm4LHsoc9zctxOKYoMzxZDq6aRXAK6uX6TxmOMltTOBDMMo24dDR+w0 6SpzzbaEQyjVjs36Ve/pS2TP4fBhx0abgwJVSbsKXPpCASVx7GgUf1GZ2VT63rnoHD 0TwdlAZSIqxFmrSZc9MEfV3MwTYbU17IV+OGTPcd/e2MzH44S8hs06oUp+wN4xHQxP INbqReq+pjAD/VkNZ0aCAX2JLFDyNs+wGkE24Y+hZnmOn7j9622gO9aaUx126aGde8 XMhfBWXPmHZrw== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id B53C0C44516; Thu, 16 Jul 2026 13:02:36 +0000 (UTC) From: Jahnavi MN via B4 Relay Date: Thu, 16 Jul 2026 13:02:35 +0000 Subject: [PATCH 2/3] rust_binder: Update looper_flags bitmaps to use kernel::impl_flags! 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: <20260716-b4-rust_binder_impl_flags-v1-2-b4201d3f15b3@google.com> References: <20260716-b4-rust_binder_impl_flags-v1-0-b4201d3f15b3@google.com> In-Reply-To: <20260716-b4-rust_binder_impl_flags-v1-0-b4201d3f15b3@google.com> To: Greg Kroah-Hartman , =?utf-8?q?Arve_Hj=C3=B8nnev=C3=A5g?= , Todd Kjos , Christian Brauner , Carlos Llamas , Alice Ryhl , Benno Lossin , Gary Guo Cc: linux-kernel@vger.kernel.org, rust-for-linux@vger.kernel.org, Jahnavi MN X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1784206955; l=6991; i=jahnavimn@google.com; s=20260702; h=from:subject:message-id; bh=NHc7ZxdM2zz9/HTYVSkr7TYNCRdc60q71RVGZ/8qDbE=; b=5yLBiMhon1Np9NeNBX8RToCG2jzFL6fT70EeKXgB/xeUHFvGImu0DknVwa0nJ21OoXWlQJduD Yq1BXz/Nm6PCioVcO0wjJEfKJ5qrURs4mvQGHgH6IS/3LpxUgu0WHd3 X-Developer-Key: i=jahnavimn@google.com; a=ed25519; pk=9aLfw3FepTOJwTS7jRXm7pDH87eBeZMXBPrqwU0//RE= X-Endpoint-Received: by B4 Relay for jahnavimn@google.com/20260702 with auth_id=849 X-Original-From: Jahnavi MN Reply-To: jahnavimn@google.com From: Jahnavi MN - Define `LooperFlags(u32)` and `LooperFlag` enum with 7 variants. - Change `InnerThread.looper_flags` type to `LooperFlags`. - Update looper state transitions and checks to use type-safe methods. - Convert `looper_flags` to `u32` for hex formatting in `debug_print`. Signed-off-by: Jahnavi MN Reviewed-by: Alice Ryhl --- drivers/android/binder/thread.rs | 63 ++++++++++++++++++++++++------------= ---- 1 file changed, 38 insertions(+), 25 deletions(-) diff --git a/drivers/android/binder/thread.rs b/drivers/android/binder/thre= ad.rs index 19f881948a84..e5bf1eaeeb17 100644 --- a/drivers/android/binder/thread.rs +++ b/drivers/android/binder/thread.rs @@ -9,6 +9,7 @@ =20 use kernel::{ bindings, + bits::bit_u32, fs::{File, LocalFile}, list::{AtomicTracker, List, ListArc, ListLinks, TryNewListArc}, prelude::*, @@ -243,7 +244,7 @@ fn is_ok(&self) -> bool { struct InnerThread { /// Determines the looper state of the thread. It is a bit-wise combin= ation of the constants /// prefixed with `LOOPER_`. - looper_flags: u32, + looper_flags: LooperFlags, =20 /// Determines whether the looper should return. looper_need_return: bool, @@ -270,13 +271,23 @@ struct InnerThread { extended_error: ExtendedError, } =20 -const LOOPER_REGISTERED: u32 =3D 0x01; -const LOOPER_ENTERED: u32 =3D 0x02; -const LOOPER_EXITED: u32 =3D 0x04; -const LOOPER_INVALID: u32 =3D 0x08; -const LOOPER_WAITING: u32 =3D 0x10; -const LOOPER_WAITING_PROC: u32 =3D 0x20; -const LOOPER_POLL: u32 =3D 0x40; +kernel::impl_flags!( + /// Represents multiple looper flags. + #[derive(Debug, Clone, Default, Copy, PartialEq, Eq)] + pub struct LooperFlags(u32); + + /// Represents a single looper flag. + #[derive(Debug, Clone, Copy, PartialEq, Eq)] + pub enum LooperFlag { + Registered =3D bit_u32(0), + Entered =3D bit_u32(1), + Exited =3D bit_u32(2), + Invalid =3D bit_u32(3), + Waiting =3D bit_u32(4), + WaitingProc =3D bit_u32(5), + Poll =3D bit_u32(6), + } +); =20 impl InnerThread { fn new() -> Result { @@ -286,7 +297,7 @@ fn next_err_id() -> u32 { } =20 Ok(Self { - looper_flags: 0, + looper_flags: LooperFlags::default(), looper_need_return: false, is_dead: false, process_work_list: false, @@ -373,26 +384,27 @@ fn pop_transaction_replied(&mut self, transaction: &D= Arc) -> bool { } =20 fn looper_enter(&mut self) { - self.looper_flags |=3D LOOPER_ENTERED; - if self.looper_flags & LOOPER_REGISTERED !=3D 0 { - self.looper_flags |=3D LOOPER_INVALID; + self.looper_flags |=3D LooperFlag::Entered; + if self.looper_flags.contains(LooperFlag::Registered) { + self.looper_flags |=3D LooperFlag::Invalid; } } =20 fn looper_register(&mut self, valid: bool) { - self.looper_flags |=3D LOOPER_REGISTERED; - if !valid || self.looper_flags & LOOPER_ENTERED !=3D 0 { - self.looper_flags |=3D LOOPER_INVALID; + self.looper_flags |=3D LooperFlag::Registered; + if !valid || self.looper_flags.contains(LooperFlag::Entered) { + self.looper_flags |=3D LooperFlag::Invalid; } } =20 fn looper_exit(&mut self) { - self.looper_flags |=3D LOOPER_EXITED; + self.looper_flags |=3D LooperFlag::Exited; } =20 /// Determines whether the thread is part of a pool, i.e., if it is a = looper. fn is_looper(&self) -> bool { - self.looper_flags & (LOOPER_ENTERED | LOOPER_REGISTERED) !=3D 0 + self.looper_flags + .contains_any(LooperFlag::Entered | LooperFlag::Registered) } =20 /// Determines whether the thread should attempt to fetch work items f= rom the process queue. @@ -404,7 +416,7 @@ fn should_use_process_work_queue(&self) -> bool { } =20 fn poll(&mut self) -> u32 { - self.looper_flags |=3D LOOPER_POLL; + self.looper_flags |=3D LooperFlag::Poll; if self.process_work_list || self.looper_need_return { bindings::POLLIN } else { @@ -470,7 +482,7 @@ pub(crate) fn debug_print(self: &Arc, m: &SeqFile= , print_all: bool) -> Res m, " thread {}: l {:02x} need_return {}\n", self.id, - inner.looper_flags, + u32::from(inner.looper_flags), inner.looper_need_return, ); } @@ -543,9 +555,9 @@ fn get_work_local(self: &Arc, wait: bool) -> Resu= lt, wait: bool) -> Result) -> (bool, u32) { /// Make the call to `get_work` or `get_work_local` return immediately= , if any. pub(crate) fn exit_looper(&self) { let mut inner =3D self.inner.lock(); - let should_notify =3D inner.looper_flags & LOOPER_WAITING !=3D 0; + let should_notify =3D inner.looper_flags.contains(LooperFlag::Wait= ing); if should_notify { inner.looper_need_return =3D true; } @@ -1603,7 +1615,8 @@ pub(crate) fn exit_looper(&self) { pub(crate) fn notify_if_poll_ready(&self, sync: bool) { // Determine if we need to notify. This requires the lock. let inner =3D self.inner.lock(); - let notify =3D inner.looper_flags & LOOPER_POLL !=3D 0 && inner.sh= ould_use_process_work_queue(); + let notify =3D + inner.looper_flags.contains(LooperFlag::Poll) && inner.should_= use_process_work_queue(); drop(inner); =20 // Now that the lock is no longer held, notify the waiters if we h= ave to. --=20 2.55.0.229.g6434b31f56-goog From nobody Sat Jul 25 15:51:52 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 2578342254B; Thu, 16 Jul 2026 13:02:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784206957; cv=none; b=dwm85J5WDTlf9of22F3GWOELsnHpkAke8SY8YKP1Bun1jIURZKHbc5TsZj6NXEq9+U7TjIILgmiCAu7zHkR8hP+XPcMU+s/WpCIECnH92ta9EZBTMx6GP2I08qXNMw5+YW7Kzq+0MwtHFfYCv8Eq5ptyx4frLRhBYgPM/xmV6yY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784206957; c=relaxed/simple; bh=qIL8QuHbUrwyzTpKXzVBIOWwCUaj9QgegeYC6ojWEy0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=cDHQ2qzcsSE/lUWfS2I4TksOJPB5CAnXk5rojfmozLSTE6tqQMAA0r7UVh6N8wTKpPQFN6w51GIcVOgIoYy+RW7UXXgnqgrm9ZtT9kAg7yqHIC9c01bANcXghh+oCLqtHPSZz72ZHW3QpAeLBIlr8cfRJuViG3lSS+bXqkPHV8w= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=PYjLGdPb; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="PYjLGdPb" Received: by smtp.kernel.org (Postfix) with ESMTPS id DDB1CC2BCF6; Thu, 16 Jul 2026 13:02:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1784206956; bh=qIL8QuHbUrwyzTpKXzVBIOWwCUaj9QgegeYC6ojWEy0=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=PYjLGdPbooPjffAH5Ib5ru0AQUIigUOC73xeKa6w1zLSVQYmWbna37c6LzNtOOJU7 CVyfy3z5pcJbGY2u8bWeVwqdU1z9oydTVo/r4iXMBFEEZWfpqb+uBGZYojKaej38yH M34pFEIXmWntkr4+0nfuR7APf9QeWhzdcLjwuVTb5wuBkZfaxD9ikNburFzkxtQf3J DU6KqHSwg7P+WlwY0e1r4pedoin9nj+99pyar0/geDWS/rImNfLlIoFZrVOfH+3vU7 vbkdE0C1culs2T9Oyv1fdtYimC1CzcY1FgPUTinkDfZrQUzvLgSrlCVFJeFaX9O2Vf jpDJCQfF2vXEA== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id C3862C4450A; Thu, 16 Jul 2026 13:02:36 +0000 (UTC) From: Jahnavi MN via B4 Relay Date: Thu, 16 Jul 2026 13:02:36 +0000 Subject: [PATCH 3/3] rust_binder: Update transaction flags to use kernel::impl_flags! 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: <20260716-b4-rust_binder_impl_flags-v1-3-b4201d3f15b3@google.com> References: <20260716-b4-rust_binder_impl_flags-v1-0-b4201d3f15b3@google.com> In-Reply-To: <20260716-b4-rust_binder_impl_flags-v1-0-b4201d3f15b3@google.com> To: Greg Kroah-Hartman , =?utf-8?q?Arve_Hj=C3=B8nnev=C3=A5g?= , Todd Kjos , Christian Brauner , Carlos Llamas , Alice Ryhl , Benno Lossin , Gary Guo Cc: linux-kernel@vger.kernel.org, rust-for-linux@vger.kernel.org, Jahnavi MN X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1784206955; l=8816; i=jahnavimn@google.com; s=20260702; h=from:subject:message-id; bh=GcxzYl/7E1EvBuuuo65EndTTI/b1qEm8RIoCciK/dwQ=; b=8q4Z4Kwau2V3LVZUyqnhDmGnyims9ifNRA+omX0dJUc8ZKHmMVglyDZkAwjXTYffoswfF0zsC jxlgIm6KT5JAZkqhtdcwK8oC1R4Kxu/qp7wqICTYHAA5RQhr/XP64yw X-Developer-Key: i=jahnavimn@google.com; a=ed25519; pk=9aLfw3FepTOJwTS7jRXm7pDH87eBeZMXBPrqwU0//RE= X-Endpoint-Received: by B4 Relay for jahnavimn@google.com/20260702 with auth_id=849 X-Original-From: Jahnavi MN Reply-To: jahnavimn@google.com From: Jahnavi MN - Define `TransactionFlags(u32)` and `TransactionFlag` with 4 variants. - Change flags field type to `TransactionFlags` in structs. - Add `is_oneway` helper on `TransactionFlags` to simplify checks. - Update `can_replace` logic to use type-safe combined flag checks. - Convert `flags` to `u32` for FFI boundaries and logging. Signed-off-by: Jahnavi MN Reviewed-by: Alice Ryhl --- drivers/android/binder/thread.rs | 6 ++-- drivers/android/binder/transaction.rs | 56 ++++++++++++++++++++++++++-----= ---- 2 files changed, 45 insertions(+), 17 deletions(-) diff --git a/drivers/android/binder/thread.rs b/drivers/android/binder/thre= ad.rs index e5bf1eaeeb17..1d10c6a95ff5 100644 --- a/drivers/android/binder/thread.rs +++ b/drivers/android/binder/thread.rs @@ -31,7 +31,7 @@ process::{GetWorkOrRegister, Process}, ptr_align, stats::GLOBAL_STATS, - transaction::{Transaction, TransactionInfo}, + transaction::{Transaction, TransactionFlag, TransactionFlags, Transact= ionInfo}, BinderReturnWriter, DArc, DLArc, DTRWrap, DeliverCode, DeliverToRead, }; =20 @@ -1244,7 +1244,7 @@ fn read_transaction_info( info.from_pid =3D self.process.task.pid(); info.from_tid =3D self.id; info.code =3D td.transaction_data.code; - info.flags =3D td.transaction_data.flags; + info.flags =3D TransactionFlags::from_bits(td.transaction_data.fla= gs); info.data_ptr =3D UserPtr::from_addr(trd_data_ptr.buffer as usize); info.data_size =3D td.transaction_data.data_size as usize; info.offsets_ptr =3D UserPtr::from_addr(trd_data_ptr.offsets as us= ize); @@ -1350,7 +1350,7 @@ fn reply_inner(self: &Arc, info: &mut Transacti= onInfo) -> BinderResult { let out =3D (|| -> BinderResult<_> { let completion =3D DTRWrap::arc_try_new(DeliverCode::new(BR_TR= ANSACTION_COMPLETE))?; let process =3D orig.from.process.clone(); - let allow_fds =3D orig.flags & TF_ACCEPT_FDS !=3D 0; + let allow_fds =3D orig.flags.contains(TransactionFlag::AcceptF= ds); let reply =3D Transaction::new_reply(self, process, info, allo= w_fds)?; self.inner.lock().push_work(completion); orig.from.deliver_reply(Ok(reply), &orig, None); diff --git a/drivers/android/binder/transaction.rs b/drivers/android/binder= /transaction.rs index afef5b46eac2..4e2ef99e512f 100644 --- a/drivers/android/binder/transaction.rs +++ b/drivers/android/binder/transaction.rs @@ -25,6 +25,33 @@ BinderReturnWriter, DArc, DLArc, DTRWrap, DeliverToRead, }; =20 +kernel::impl_flags!( + /// Represents multiple transaction flags. + #[derive(Debug, Clone, Default, Copy, PartialEq, Eq, Zeroable)] + pub struct TransactionFlags(u32); + + /// Represents a single transaction flag. + #[derive(Debug, Clone, Copy, PartialEq, Eq)] + pub enum TransactionFlag { + OneWay =3D TF_ONE_WAY, + AcceptFds =3D TF_ACCEPT_FDS, + ClearBuf =3D TF_CLEAR_BUF, + UpdateTxn =3D TF_UPDATE_TXN, + } +); + +impl TransactionFlags { + /// Creates a `TransactionFlags` from a raw `u32` value. + pub(crate) fn from_bits(bits: u32) -> Self { + Self(bits) + } + + /// Checks if the Oneway flag is set. + pub(crate) fn is_oneway(self) -> bool { + self.contains(TransactionFlag::OneWay) + } +} + #[derive(Zeroable)] pub(crate) struct TransactionInfo { pub(crate) from_pid: Pid, @@ -32,7 +59,7 @@ pub(crate) struct TransactionInfo { pub(crate) to_pid: Pid, pub(crate) to_tid: Pid, pub(crate) code: u32, - pub(crate) flags: u32, + pub(crate) flags: TransactionFlags, pub(crate) data_ptr: UserPtr, pub(crate) data_size: usize, pub(crate) offsets_ptr: UserPtr, @@ -49,7 +76,7 @@ pub(crate) struct TransactionInfo { impl TransactionInfo { #[inline] pub(crate) fn is_oneway(&self) -> bool { - self.flags & TF_ONE_WAY !=3D 0 + self.flags.is_oneway() } } =20 @@ -75,7 +102,7 @@ pub(crate) struct Transaction { allocation: SpinLock>, is_outstanding: Atomic, code: u32, - pub(crate) flags: u32, + pub(crate) flags: TransactionFlags, data_size: usize, offsets_size: usize, data_address: usize, @@ -121,7 +148,7 @@ pub(crate) fn new( } alloc.set_info_oneway_node(node_ref.node.clone()); } - if info.flags & TF_CLEAR_BUF !=3D 0 { + if info.flags.contains(TransactionFlag::ClearBuf) { alloc.set_info_clear_on_drop(); } let target_node =3D node_ref.node.clone(); @@ -161,7 +188,7 @@ pub(crate) fn new_reply( return Err(err); } }; - if info.flags & TF_CLEAR_BUF !=3D 0 { + if info.flags.contains(TransactionFlag::ClearBuf) { alloc.set_info_clear_on_drop(); } Ok(DTRWrap::arc_pin_init(pin_init!(Transaction { @@ -194,7 +221,7 @@ pub(crate) fn debug_print_inner(&self, m: &SeqFile, pre= fix: &str) { self.from.id, self.to.task.pid(), self.code, - self.flags, + u32::from(self.flags), self.start_time.elapsed().as_millis(), ); if let Some(target_node) =3D &self.target_node { @@ -273,7 +300,7 @@ pub(crate) fn submit(self: DLArc, info: &mut Tran= sactionInfo) -> BinderRes let _t_outdated; let _oneway_node; =20 - let oneway =3D self.flags & TF_ONE_WAY !=3D 0; + let oneway =3D self.flags.is_oneway(); let process =3D self.to.clone(); let mut process_inner =3D process.inner.lock(); =20 @@ -284,7 +311,7 @@ pub(crate) fn submit(self: DLArc, info: &mut Tran= sactionInfo) -> BinderRes crate::trace::trace_transaction(false, &self, None); if process_inner.is_frozen.is_frozen() { process_inner.async_recv =3D true; - if self.flags & TF_UPDATE_TXN !=3D 0 { + if self.flags.contains(TransactionFlag::UpdateTxn) { if let Some(t_outdated) =3D target_node.take_outdated_transaction(&self, &= mut process_inner) { @@ -355,7 +382,8 @@ pub(crate) fn can_replace(&self, old: &Transaction) -> = bool { return false; } =20 - if self.flags & old.flags & (TF_ONE_WAY | TF_UPDATE_TXN) !=3D (TF_= ONE_WAY | TF_UPDATE_TXN) { + let required =3D TransactionFlag::OneWay | TransactionFlag::Update= Txn; + if !(self.flags.contains_all(required) && old.flags.contains_all(r= equired)) { return false; } =20 @@ -392,7 +420,7 @@ fn do_work( writer: &mut BinderReturnWriter<'_>, ) -> Result { let send_failed_reply =3D ScopeGuard::new(|| { - if self.target_node.is_some() && self.flags & TF_ONE_WAY =3D= =3D 0 { + if self.target_node.is_some() && !self.flags.is_oneway() { let reply =3D Err(BR_FAILED_REPLY); self.from.deliver_reply(reply, &self, None); } @@ -415,7 +443,7 @@ fn do_work( tr.cookie =3D cookie as uapi::binder_uintptr_t; }; tr.code =3D self.code; - tr.flags =3D self.flags; + tr.flags =3D u32::from(self.flags); tr.data_size =3D self.data_size as uapi::binder_size_t; tr.data.ptr.buffer =3D self.data_address as uapi::binder_uintptr_t; tr.offsets_size =3D self.offsets_size as uapi::binder_size_t; @@ -425,7 +453,7 @@ fn do_work( } tr.sender_euid =3D self.sender_euid.into_uid_in_current_ns(); tr.sender_pid =3D 0; - if self.target_node.is_some() && self.flags & TF_ONE_WAY =3D=3D 0 { + if self.target_node.is_some() && !self.flags.is_oneway() { // Not a reply and not one-way. tr.sender_pid =3D self.from.process.pid_in_current_ns(); } @@ -477,7 +505,7 @@ fn cancel(self: DArc) { drop(allocation); =20 // If this is not a reply or oneway transaction, then send a dead = reply. - if self.target_node.is_some() && self.flags & TF_ONE_WAY =3D=3D 0 { + if self.target_node.is_some() && !self.flags.is_oneway() { let reply =3D Err(BR_DEAD_REPLY); self.from.deliver_reply(reply, &self, None); } @@ -486,7 +514,7 @@ fn cancel(self: DArc) { } =20 fn should_sync_wakeup(&self) -> bool { - self.flags & TF_ONE_WAY =3D=3D 0 + !self.flags.is_oneway() } =20 fn debug_print(&self, m: &SeqFile, _prefix: &str, tprefix: &str) -> Re= sult<()> { --=20 2.55.0.229.g6434b31f56-goog