From nobody Thu Apr 9 18:44:11 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 047BE38E5EB for ; Wed, 8 Apr 2026 12:21:01 +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=1775650863; cv=none; b=ibl6nGjARrzN3kkvdq0pvLlCZGFS4vtcg/X3NBspvwUrLgVQsFySQ+ey6GygQtXmndl9okyUPlxgloQhF/evzIPvP0NBXCXhdEEC+/h6/4ZlYMx6PBVDm5pqBJWEtSoeeHQUsSBfbOlwcs8tEhYL3AqavjNr9eY5KuFAaLY7y9w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775650863; c=relaxed/simple; bh=F7f94fTfMSJCY3wmlwluznC0FF90gOMcL3zlAtjwpw4=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=HFmgC5fqis9twMymktOTIExjFMhHgXFV+BDZWhQzid+KxkibAb9Q8dhefsbFA30CnrToFL6SskjVziXjf7PRpLjfZR9M+mODerWzZJ8WNAwVv2i43J7ElOp+nYJfA7eeB4QTj21KdsC2kiQxK64l1iMu1ISH0DA43ZLNjUGlBeE= 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=huRpiYMP; 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="huRpiYMP" Received: by mail-wm1-f74.google.com with SMTP id 5b1f17b1804b1-488c768a9a9so3998385e9.1 for ; Wed, 08 Apr 2026 05:21:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1775650860; x=1776255660; 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=ZBYY3QvrCgPn9EPvO5/3tLsHRY+z899eCOLcISOcO7I=; b=huRpiYMPhPcbw0/smYBOrUlf4gwuOxSxWrxQY11H16/5mdrmtEUMFl8p4PG+Z982mJ rNeePg8RxlIp+MnnBYgWfgE4bSiJw/MynYMUmM2iiX5o/T4/3tRR6uBh9uQkmdXCpaKf V5/q+yVdIvzWPrPXlA2AAJ1rp4A2vabixPFoxP9nKZf9+H3b91GhAsq0yxdcpTDQJBXd uUCXAwuuSdSO22YCB2Fvuoo+OpWqiYOzgh2vWAvlVp+++bqpfIDnVjiq1fobXEvrrq3d ZMum0zRXG2R8rcH72AGDOw/uPAJUiJtQNE4umptMmYyajVQ2jD772bp2GbwUPBQ2fAmY 7ReA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775650860; x=1776255660; 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=ZBYY3QvrCgPn9EPvO5/3tLsHRY+z899eCOLcISOcO7I=; b=ZMkqXMrZ2LSbeeqot6i5jOVohwskQm5rQGZA2LZWkaY/edEG1SYAfvpSG15rLod93S hpHevA4Vw4V3W95/5TkK0e+tYlnR6LGiaTynocusiNRzuD+Alf8J7QwyYW7/9WaB7K34 C4buxc70B7U9HDE4zIji0oGNfss2yDGW8mdyOnJF8BQb7+Jx/XO2U0TpVDysukYUs/ey Q4LNZ4lOQVX5G83pLF74lob5Lhsg9wpQz/D2SPf2J0eA/UAhZevVgRduK0nSQZI05EpO Ro4yxkh4/h4tgOGEDlATglDPzwzYARfah4SK56nGLU+QNbiJKPkIYo1OT9+0vYKh6+aq Srhw== X-Gm-Message-State: AOJu0Yx6KqAo46FOnWG7LVM87cQm84c/IhhwiYOAk3Z/pgIinBriB9d2 YxFf9apz3eJVReN0U5u9/CDiv9A/1XjWcxmeR8WgFLvTIQDRPrfhXE2HSf0qLcVwqHDwXZnplLa wUnknlWue17s21U3opA== X-Received: from wrxm1.prod.google.com ([2002:a05:6000:81:b0:43d:2a3:461a]) (user=aliceryhl job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:c8d:b0:486:ffa3:594 with SMTP id 5b1f17b1804b1-488997a6883mr281760915e9.23.1775650860293; Wed, 08 Apr 2026 05:21:00 -0700 (PDT) Date: Wed, 08 Apr 2026 12:20:47 +0000 In-Reply-To: <20260408-binder-netlink-v2-0-c0d327d15435@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260408-binder-netlink-v2-0-c0d327d15435@google.com> X-Developer-Key: i=aliceryhl@google.com; a=openpgp; fpr=49F6C1FAA74960F43A5B86A1EE7A392FDE96209F X-Developer-Signature: v=1; a=openpgp-sha256; l=4005; i=aliceryhl@google.com; h=from:subject:message-id; bh=1Ltud0DFd3FPi7N3hRuEEuwQSMUXr9ABKDC9dGaJ4cE=; b=owEBbQKS/ZANAwAKAQRYvu5YxjlGAcsmYgBp1kgk4LO5HLhqZ54TgromOML55f8Rta56qfp/X 8Oj7TaPvDyJAjMEAAEKAB0WIQSDkqKUTWQHCvFIvbIEWL7uWMY5RgUCadZIJAAKCRAEWL7uWMY5 Ri3VEAC0ni7lJPZGIMUoJmkzj8liJFDdboT66VViQYnK97KHVhmpSLziVblb3o8bAIC/nZKGEf8 D3335KeXl9fOruzsAFbxFHSXxEhbA1EODisgSHH7PeQFFUm5vWth7aU8xWJJUMj7V+EmrW2GIXk oWZrMj56YSOpdhNKu3XHQC1rPkDiX5xBo43G6EnyuuGtAcqx8XnSNmJGPG3IQudRYNH+Vtyluyb AvemSCTXL4eWuuNbTJuNwj7It4t3FrnFUOpgvM1XWorJdiiXfAWrkWeuZmG9bgaEtbBRo6udnZ6 4TREjucV+0Rd41DwqsLvHisr/mIN+8lQ0LZLGPEVfTUkADu0XvHnCR6MeYzBwpBVSi+Ex0D17lu mfw2+8J/QkA6Vliu3ZpHNIGUoDp+cOkLS+gO8WczxoBUN25zw25lyyTrgPxPxmnjjplE90rVzO1 55k1LBaum9d5cMWYAVPLCYjdZoJE04dZazTtEP7vN1KxX56C21CoGYsRtlKyCibbIvWNn8+1vkF 2myKoLL8SBdDhMChbZUqeRWOauAU9kProNhtLKaN6F/D0vzZzd3OsBzUX9by/2gPceP7rwEgoZh U7IiVaTB72TgX9vzMU+pEJ0/S2ZQJhHlDwKwdCeI72d2GkjjcmDs8jE2KI81aMW9idHwHC1PXwI LzsvXUgkgonx3MQ== X-Mailer: b4 0.14.3 Message-ID: <20260408-binder-netlink-v2-4-c0d327d15435@google.com> Subject: [PATCH v2 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 Signed-off-by: Alice Ryhl --- drivers/android/binder/rust_binder_main.rs | 1 - drivers/android/binder/thread.rs | 9 +++++++ drivers/android/binder/transaction.rs | 40 ++++++++++++++++++++++++++= ++++ 3 files changed, 49 insertions(+), 1 deletion(-) diff --git a/drivers/android/binder/rust_binder_main.rs b/drivers/android/b= inder/rust_binder_main.rs index 9057e5dba7ed..407cda7bd766 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 97d5f31e8fe3..e9bff4956ac8 100644 --- a/drivers/android/binder/thread.rs +++ b/drivers/android/binder/thread.rs @@ -1263,6 +1263,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 47d5e4d88b07..3fa7091ed8a6 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,44 @@ 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)?; + if self.to_pid !=3D 0 { + 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.1213.gd9a14994de-goog