From nobody Sat Jul 25 03:46:55 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 2C30434DCD2; Sun, 19 Jul 2026 11:51:14 +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=1784461874; cv=none; b=Jzyz9gnYiYVY4FM9RCglsMr5rcgWUKr8yFJY2uUdtfUxAH2a2khE2yL8X6wbmZH2lmaMTdeb32idbrC/9BmGMasGkDRQ3uNjZ9b/5LP79+AWchZDCnlL4NGb8euxcDu2ZPzTHfNYugISL9af50vf+mZC3OUHeYroyRNb+j49fRQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784461874; c=relaxed/simple; bh=C+x7ECEHApFMtKzLlNwSijg76cHNCIUgFI+K0ZegEpA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Yf4CkoXh/hEahYY3KnGAbXRYrxnQX1zpF+4uwAJuZyN2gck+u7At9vpdEG8p0Uyjk6wK2XF5FH1JZg3ojj2RQqSblr8to8hFL+zggRwdMHJAIBqlLjlcpZoeNDBgLk0IOwKZltBAYtT4kkb6+WwRHeUkznP60pKaxnGe69KEg/M= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=f2LL0f8n; 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="f2LL0f8n" Received: by smtp.kernel.org (Postfix) with ESMTPS id B0404C2BCC9; Sun, 19 Jul 2026 11:51:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1784461873; bh=C+x7ECEHApFMtKzLlNwSijg76cHNCIUgFI+K0ZegEpA=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=f2LL0f8nvZpLzu2YbD1S+80t9YZQJqmJrl4ahKijNmjKHraDTrfVvcOejeLaQMbG6 DBh/y/YU+8rZKspS4ZctJ7qu0a5pm4db7V4Dr9LBrFw1+h65VPabew/knMnqUnWn4z UTtCRgg/kBZI4NvD9KAkPwhfi/HybcQW6c3L/TWRix+Q0CrQXDvceNVkbEaGCru2vp FWnJREfOGZg6we3n7o73/MTkyR2TDemNQdcYSyvtd8uC9fvemMFV6J7dylJZpJRcNg TKUnlt+eG56kqQpOcRaZMYZkPpwMcZFITz4kOw0f3U71NveDlzy+vbKdeqAFYkhhIO BTGlQIz2/XLfg== 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 910D1C44512; Sun, 19 Jul 2026 11:51:13 +0000 (UTC) From: Jahnavi MN via B4 Relay Date: Sun, 19 Jul 2026 11:51:09 +0000 Subject: [PATCH v3 1/2] 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: <20260719-b4-rust_binder_impl_flags-v3-1-f8d0b3ea1b87@google.com> References: <20260719-b4-rust_binder_impl_flags-v3-0-f8d0b3ea1b87@google.com> In-Reply-To: <20260719-b4-rust_binder_impl_flags-v3-0-f8d0b3ea1b87@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=1784461872; l=7173; i=jahnavimn@google.com; s=20260702; h=from:subject:message-id; bh=hxc8jUT8MkoLpc4LyydGeVIak3Yp0sCbRginwzxyy1U=; b=HDRgP07pahXGRkAQtKOjxcR2+lO+HXRfqAiebQhKQJSMnloaCHH3Si4YDwgZqmqpJrjDS8v3I DXhohdLRmVrDUGANlZspCQ6Iu5u9vTBiZeG/juF/uBroVXZ0lDNKzlN 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 Thread looper states are currently represented as raw integers and manipulated via bitwise operations. This lacks type safety, making it possible to mix up different flag types without compile-time warnings. Use kernel::impl_flags! to migrate looper_flags to a strongly-typed bitmask, enforcing compile-time safety. Key changes: - 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`. Reviewed-by: Alice Ryhl Signed-off-by: Jahnavi MN --- drivers/android/binder/thread.rs | 62 ++++++++++++++++++++++++------------= ---- 1 file changed, 37 insertions(+), 25 deletions(-) diff --git a/drivers/android/binder/thread.rs b/drivers/android/binder/thre= ad.rs index a51821dde0ad..ef692fe79201 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::LocalFile, list::{AtomicTracker, List, ListArc, ListLinks, TryNewListArc}, prelude::*, @@ -245,7 +246,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, @@ -272,13 +273,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(pid: i32) -> Result { @@ -288,7 +299,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, @@ -316,7 +327,7 @@ fn push_work(&mut self, work: DLArc)= -> PushWorkRes { } self.work_list.push_back(work); self.process_work_list =3D true; - if self.looper_flags & LOOPER_POLL !=3D 0 { + if self.looper_flags.contains(LooperFlag::Poll) { PushWorkRes::OkNotifyPoll } else { PushWorkRes::Ok @@ -380,26 +391,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. @@ -411,7 +423,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 { @@ -477,7 +489,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, ); } @@ -550,9 +562,9 @@ fn get_work_local(self: &Arc, wait: bool) -> Resu= lt, wait: bool) -> Result 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; } --=20 2.55.0.229.g6434b31f56-goog From nobody Sat Jul 25 03:46:55 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 2C2781E531; Sun, 19 Jul 2026 11:51:14 +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=1784461874; cv=none; b=hTzwuDZqhngkEA3+ZY1SvLgXYO81bZTZoT3wZsUNXhUfQgAajA27rsnNYGUKrO4t4t1oMVwDozCtyYJmnaMLNIITOoZQjUqnO999mkJ6pxwNWThPJzmvm2Kd7GvRxK4ft/v1CGTI/sDq3yJBSzui5iJS1ewGGgCF2Lc6l0REHEM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784461874; c=relaxed/simple; bh=sAXr7WN+FLpf3OgOr+TRKZ3o3hkREq+37QXwBRKpxBs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=jDfxF3+1MsWYWRfkiXNWqO34C+EncUohLH19HBiSCtDhyFI522KS7emGqTVEpntxbHOocYMpzQcf5/aEQ3ArPKL3hs6/HPsw/FTtoW1dT1qOjVrgFSxtf2XcATTrYqQ2WCoc4vDd3EkyZ3OHAz+TEj83bbFSbcIPzz/OTxWpEAc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Hp807c8I; 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="Hp807c8I" Received: by smtp.kernel.org (Postfix) with ESMTPS id BE601C2BCFB; Sun, 19 Jul 2026 11:51:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1784461873; bh=sAXr7WN+FLpf3OgOr+TRKZ3o3hkREq+37QXwBRKpxBs=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=Hp807c8ILgAE64bq7yrtE03TRklxp5DxtJ1/FXxm06A/rqQ33S2HusIyOzegExz44 Hum6IPmwwPgk9E0RzVBn40R84pEtYfkurwLKgqBaHn7pWoDmEM/RbpVeIQWJOBa00j STPshATTLmodic8z2kPJ1fogCqFbPZq3eQtcUrSuwnjwy/myPlJWFHEFHo4cQx/OY1 pbqY2MPCazKMwKqsko92xfWgrrHHbUlY1Sb6cNQo7DF6LNEM8gWTSit1iYkM3MET/0 YcvnZyaJRA2diaC/7ww5Ap29Cjqe0AOoTAvzBWWVyNoO9ZLye0zrm8BUf0uXdocsDR gvkek2MnO9wig== 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 9F33EC44523; Sun, 19 Jul 2026 11:51:13 +0000 (UTC) From: Jahnavi MN via B4 Relay Date: Sun, 19 Jul 2026 11:51:10 +0000 Subject: [PATCH v3 2/2] 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: <20260719-b4-rust_binder_impl_flags-v3-2-f8d0b3ea1b87@google.com> References: <20260719-b4-rust_binder_impl_flags-v3-0-f8d0b3ea1b87@google.com> In-Reply-To: <20260719-b4-rust_binder_impl_flags-v3-0-f8d0b3ea1b87@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=1784461872; l=9578; i=jahnavimn@google.com; s=20260702; h=from:subject:message-id; bh=zTtvJbqdKpOtNsFsaCG2vt5AxMoiPVkbpSSm05Ta4nM=; b=M3QXp/F4rcthJ5SF5v9b07zRNAbtY8GsDgEddnN+VH2tZlUMbuMzfeV0o1MJxG9QrgmUhnXiH J6yV6AGcYbAA7LiUR0EVTqZizXxbq0tnAXlLWDFn/0uBv+LitpLhJZt 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 Transaction configuration flags are currently represented as raw integers and manipulated via bitwise operations. This lacks type safety, making it possible to mix up different flag types without compile-time warnings. Use kernel::impl_flags! to migrate the transaction flags to a strongly-typed bitmask, enforcing compile-time safety. Key changes: - 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. Reviewed-by: Alice Ryhl Signed-off-by: Jahnavi MN --- drivers/android/binder/thread.rs | 6 ++-- drivers/android/binder/transaction.rs | 58 ++++++++++++++++++++++++++-----= ---- 2 files changed, 46 insertions(+), 18 deletions(-) diff --git a/drivers/android/binder/thread.rs b/drivers/android/binder/thre= ad.rs index ef692fe79201..6c838884fc07 100644 --- a/drivers/android/binder/thread.rs +++ b/drivers/android/binder/thread.rs @@ -30,7 +30,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 @@ -1266,7 +1266,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); @@ -1408,7 +1408,7 @@ fn reply_inner(self: &Arc, info: &mut Transacti= onInfo) -> BinderResult { self.process.task.pid(), ))?; 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)?; // Not notifying: Reply to current thread. let _ =3D self.inner.lock().push_work(completion); diff --git a/drivers/android/binder/transaction.rs b/drivers/android/binder= /transaction.rs index 13dfb5c5c955..245f1556b5db 100644 --- a/drivers/android/binder/transaction.rs +++ b/drivers/android/binder/transaction.rs @@ -27,6 +27,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, @@ -34,7 +61,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, @@ -51,7 +78,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 pub(crate) fn report_netlink(&self, reply: u32, ctx: &crate::Context) { @@ -84,7 +111,7 @@ fn report_netlink_inner(&self, reply: u32, ctx: &crate::= Context) -> kernel::erro if self.is_reply { report.is_reply()?; } - report.flags(self.flags)?; + report.flags(u32::from(self.flags))?; report.code(self.code)?; report.data_size(self.data_size as u32)?; =20 @@ -115,7 +142,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, @@ -161,7 +188,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(); @@ -201,7 +228,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 { @@ -234,7 +261,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 { @@ -313,7 +340,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 @@ -324,7 +351,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) { @@ -399,7 +426,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 @@ -436,7 +464,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); } @@ -467,7 +495,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; @@ -477,7 +505,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(); } @@ -529,7 +557,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); } else { @@ -545,7 +573,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