From nobody Thu Apr 9 18:54:23 2026 Received: from mail-wm1-f74.google.com (mail-wm1-f74.google.com [209.85.128.74]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D54E53AEF39 for ; Fri, 6 Mar 2026 15:12:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772809954; cv=none; b=U4XK/QlyBkkgf3BbkZ40zIy/92nsrf+JM0B/GW2FiAxUzzLFsAyIRKs4PA4TDQ405wVhdtoGyujCY8w9UnSZIdxw1vSDdKGQk7cPfDqsCcSwqCPEaYDTZ2MXYxYUO/l1WUk0fRBaR01lAMlsQ6gBCgLA1atqCF50zlSteAcs/eE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772809954; c=relaxed/simple; bh=YxuNBCXB1ruXIhdHNa9guGwhOCpJAbw7MdxScXE7uVg=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=OV5GeKCuaobmIv6qjmKE/Cfs0sK6BIoDj8CoI+obqVYG4Ofp5Xkio1u4ukj0FRqlYXtjZdaTfZ0q9g1YiBHDowsaQT6udcvd3rsLjSsVCHKVy5WpQuhdWiMnp/IVidhLVAPgGeks2ojRXHZIm2mI7Lf8tLxC7ZSvmVwPeJqk7iY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--aliceryhl.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=CPpVtYzH; arc=none smtp.client-ip=209.85.128.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--aliceryhl.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="CPpVtYzH" Received: by mail-wm1-f74.google.com with SMTP id 5b1f17b1804b1-48529847dedso3198165e9.1 for ; Fri, 06 Mar 2026 07:12:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1772809949; x=1773414749; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=V7W6/0L6JR9EvU6fV715H5TPwVjS+u6fq9W7W12hOUQ=; b=CPpVtYzH/0aED2WmQjoU+HCX292Y3RigMl1W2EFDO9AXFy/FpxxbjqXveWRyDf3Nr9 v0rmNCDBsZvE5hVOeJW4eOcPduRmafFp82fw3iNGEnaQ3//ypcdCHhQOBKlgrlMC/v8a uHwEnwPB1HX+x7lPE3Vuu1fUqvqjftd/OucUdYAN9EwfetFnZU6qBKaTjxRiQ+AFAH3B x5ngGLhGrJcwk74K5q/7YDiQYmMwAaDZXcqYKjsMkMwOY7diAKbckVnIivm9zt/Jnx3l olfIo380qP7VpsP+f4Z0l+8fmya5tfvUv1RBuftddfeG1ffGu4UMru7KHWnHHrbQ3AYE 2K0Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772809949; x=1773414749; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=V7W6/0L6JR9EvU6fV715H5TPwVjS+u6fq9W7W12hOUQ=; b=dIgFdFyK9QyhH48HpHTtvf8IYGT6vrROb3QpGOnzJNrggtlEiw2vwMJSbAvbgPECqg RLs4nZ5FnMJX6pOFNe6X0ylI1HeVm7wKYsBBFbAmMfaTMCc9Mz5qeKyuUdJOOtoMbsDn 5zQQKIHOIpuNYEOlxSRK7pe5y79s0k0o8SqpOU+8KMGbW4GQJWMCOIhIw8h7WHEc3WnL 048Fqf8CLn9FpO/WZ8yBtPtvwpXoIgPiPUrYd1l3jOaQ88ivqCpI2rlb9aBKObCLrjQr KtEZYzPi0mUrUYUkycRjGCIvTLp/W6YxiZvewr0wlA5B6bLrrf/v73yXfUeDb0RpJi21 ViAg== X-Gm-Message-State: AOJu0YyaZbctQdjDxpZ19+NRicVJ1JRWwT21UB0w54JMHHcg9mR43s9s laShex6FlqFOshSXb8uXuqhiGeNqbWi2nk5DUICRz3AAA+rDBY1p9raDJsM1QF8gC0axm84IFwk N8JDbAMUsF9Jxr+krGQ== X-Received: from wmqy16.prod.google.com ([2002:a05:600c:3650:b0:47e:dc0c:276f]) (user=aliceryhl job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:609a:b0:477:63a4:88fe with SMTP id 5b1f17b1804b1-48526919691mr41548895e9.2.1772809949104; Fri, 06 Mar 2026 07:12:29 -0800 (PST) Date: Fri, 06 Mar 2026 15:12:16 +0000 In-Reply-To: <20260306-binder-netlink-v1-0-daceb5bc83f2@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260306-binder-netlink-v1-0-daceb5bc83f2@google.com> X-Developer-Key: i=aliceryhl@google.com; a=openpgp; fpr=49F6C1FAA74960F43A5B86A1EE7A392FDE96209F X-Developer-Signature: v=1; a=openpgp-sha256; l=3906; i=aliceryhl@google.com; h=from:subject:message-id; bh=B4IqF7dNXJQF1f3lvVpuUKgRecGFsxg/WIFjSG2Bg5s=; b=owEBbQKS/ZANAwAKAQRYvu5YxjlGAcsmYgBpqu7VYn9W4TXw9As8/a5rEo1WV2ZUs9sKk6G0R bBm2CSidn+JAjMEAAEKAB0WIQSDkqKUTWQHCvFIvbIEWL7uWMY5RgUCaaru1QAKCRAEWL7uWMY5 RuefEACHdn+kgRMMwfBVAlPfxB9vQs0RUvm8N2+9VvXmSkylMedWJAejMVAZJoRXZeg2A4B3v1w 6Fj45doXbx8I7fU/+acVjzDzoZJiGoyhu0DhB1/Y9QhY8CklBTWqFLfgHJtxVjaXEMiwoHbkP6p ZyKXm4hERfzOfs3j0reDO6jkaJV4Ac54gKM6Pq/qXyCqq2LZL3zTuS5Vkl33N12IHCl4YsXWHcl iLrWO1MTeGBfa6PS1ruzmptC7gWoBDP8jmy3RIZOSAlCia6do0g9dmv+Chl/57VExVx1/e7mCxm F9XqAjIr68Jth/7aWWhwnzj41DcfilwQJI8tQXwxg9HsbHlBRHiciMxiqwcoATTS8GJoM5hshOp 7ZGc319+n1ZA4moPwrwukSlyzyqTOEIVK4kdohWUTav2t53YvO8qJlZYihcafhayewZMzBlx1eB 7REUfU5C2864Py1xR+YpZbBtXsZ5paSbpXX6XcLWFd0x7ylzmxnYbhUhcjzEiJL47yX2MEW4vsX 4+N1Tm0KGZ2ya5zJqBw+oa41g48dJtlBz0oZl/oZPj4bDYoQGPlF2K+rN/mags4G0tK0e3ZhosI +CD+yDonYZBgr5sCBV1kxv2P+SDHUtHDA4P6QxMeVMsA9Xk8biIq/fV0hjKuHiOcCFk1t6A1wwg S2Nsx/pNpMzof6g== X-Mailer: b4 0.14.3 Message-ID: <20260306-binder-netlink-v1-4-daceb5bc83f2@google.com> Subject: [PATCH 4/4] rust_binder: report netlink transactions From: Alice Ryhl To: Miguel Ojeda , Boqun Feng , Gary Guo , "=?utf-8?q?Bj=C3=B6rn_Roy_Baron?=" , Benno Lossin , Andreas Hindborg , Trevor Gross , Danilo Krummrich , Donald Hunter , Jakub Kicinski , "David S. Miller" , Eric Dumazet , Paolo Abeni , Simon Horman , Greg Kroah-Hartman , "=?utf-8?q?Arve_Hj=C3=B8nnev=C3=A5g?=" , Todd Kjos , Christian Brauner , Carlos Llamas Cc: linux-kernel@vger.kernel.org, rust-for-linux@vger.kernel.org, netdev@vger.kernel.org, Alice Ryhl Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: Carlos Llamas The Android Binder driver supports a netlink API that reports transaction *failures* to a userapce daemon. This allows devices to monitor processes with many failed transactions so that it can e.g. kill misbehaving apps. One very important thing that this monitors is when many oneway messages are sent to a frozen process, so there is special handling to ensure this scenario is surfaced over netlink. Signed-off-by: Carlos Llamas --- drivers/android/binder/rust_binder_main.rs | 1 - drivers/android/binder/thread.rs | 9 +++++++ drivers/android/binder/transaction.rs | 38 ++++++++++++++++++++++++++= ++++ 3 files changed, 47 insertions(+), 1 deletion(-) diff --git a/drivers/android/binder/rust_binder_main.rs b/drivers/android/b= inder/rust_binder_main.rs index 65dae8931676..f96264406ef3 100644 --- a/drivers/android/binder/rust_binder_main.rs +++ b/drivers/android/binder/rust_binder_main.rs @@ -36,7 +36,6 @@ mod deferred_close; mod defs; mod error; -#[allow(dead_code)] mod netlink; mod node; mod page_range; diff --git a/drivers/android/binder/thread.rs b/drivers/android/binder/thre= ad.rs index 97a5e4acf64c..49879e615ce5 100644 --- a/drivers/android/binder/thread.rs +++ b/drivers/android/binder/thread.rs @@ -1262,6 +1262,15 @@ fn transaction(self: &Arc, cmd: u32, reader: &= mut UserSliceReader) -> Resu } } =20 + if info.oneway_spam_suspect { + // If this is both a oneway spam suspect and a failure, we rep= ort it twice. This is + // useful in case the transaction failed with BR_TRANSACTION_P= ENDING_FROZEN. + info.report_netlink(BR_ONEWAY_SPAM_SUSPECT, &self.process.ctx); + } + if info.reply !=3D 0 { + info.report_netlink(info.reply, &self.process.ctx); + } + Ok(()) } =20 diff --git a/drivers/android/binder/transaction.rs b/drivers/android/binder= /transaction.rs index 5dff3d655c4d..4b3fba76114a 100644 --- a/drivers/android/binder/transaction.rs +++ b/drivers/android/binder/transaction.rs @@ -3,6 +3,7 @@ // Copyright (C) 2025 Google LLC. =20 use kernel::{ + netlink::GENLMSG_DEFAULT_SIZE, prelude::*, seq_file::SeqFile, seq_print, @@ -17,6 +18,7 @@ allocation::{Allocation, TranslatedFds}, defs::*, error::{BinderError, BinderResult}, + netlink::Report, node::{Node, NodeRef}, process::{Process, ProcessInner}, ptr_align, @@ -49,6 +51,42 @@ impl TransactionInfo { pub(crate) fn is_oneway(&self) -> bool { self.flags & TF_ONE_WAY !=3D 0 } + + pub(crate) fn report_netlink(&self, reply: u32, ctx: &crate::Context) { + if let Err(err) =3D self.report_netlink_inner(reply, ctx) { + pr_warn!( + "{}:{} netlink report failed: {err:?}\n", + self.from_pid, + self.from_tid + ); + } + } + + fn report_netlink_inner(&self, reply: u32, ctx: &crate::Context) -> ke= rnel::error::Result { + if !Report::has_listeners() { + return Ok(()); + } + let mut report =3D Report::new(GENLMSG_DEFAULT_SIZE, 0, 0, GFP_KER= NEL)?; + + report.error(reply)?; + report.context(&ctx.name)?; + report.from_pid(self.from_pid as u32)?; + report.from_tid(self.from_tid as u32)?; + report.to_pid(self.to_pid as u32)?; + if self.to_tid !=3D 0 { + report.to_tid(self.to_tid as u32)?; + } + + if self.is_reply { + report.is_reply()?; + } + report.flags(self.flags)?; + report.code(self.code)?; + report.data_size(self.data_size as u32)?; + + report.multicast(0, GFP_KERNEL)?; + Ok(()) + } } =20 use core::mem::offset_of; --=20 2.53.0.473.g4a7958ca14-goog