From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-ed1-f73.google.com (mail-ed1-f73.google.com [209.85.208.73]) (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 20A4333B95A for ; Wed, 15 Apr 2026 09:39:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.73 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776245983; cv=none; b=hGcb955esST6LssDcCv3Tla5aj3eaDmzIfjeIPqUz7mofgl+xDyq+olZAVtiR8U1X313TZAUgvSpKIxg447x6lG5tbkAXm81P8HLO3Os16JUgoWLG5kVsc4bTHOpZoo706qFy7xh8ajWLmJo+LJxRbNb6Mp5xyrrxSAfz1DgzFQ= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776245983; c=relaxed/simple; bh=vfGvEyjIXVQjJQSlbIVj7pBLzMyBjbJ+t2zP8GbMnR8=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=CNXTsJvuXqpuijNTfCbNbbYGiU/ckibvYV5lBAFzt+7JWw6hZvtg+F+cXKha7eG1AKogEJJb24f3LCk/fqHfNoZvSVkMg6NsS965xEJptgu+sgYPL+S/MNndcSSnN1fRQcrbOFsPcYvmoQTiEMGRyKnXduQyZzNPVDYMKl6QbDw= 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=OBizY9Bu; arc=none smtp.client-ip=209.85.208.73 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="OBizY9Bu" Received: by mail-ed1-f73.google.com with SMTP id 4fb4d7f45d1cf-66c165a7a8cso5558762a12.1 for ; Wed, 15 Apr 2026 02:39:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1776245979; x=1776850779; 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=KCLsNX3cjUHeEq5VeNxpgUoLu/D96PUreoTUzfquF0E=; b=OBizY9BuFTecC3VlcVrrQOUhekdFFP/+Oq4Vth58Ez3n1QxBdkOV2P0UVSZgrdDhMn Jgnmyvt1AfrV3Dhk68d8EG4Xkm4SO/gIOph0r3kTgwCLrx/PTNA+iWKP7mmegQvJ2nON +Ut6xA3EDYdnH4k3UFD/maFlzQ8T5F+kd94gyx0QO81kpeMvzoEzywLvpPm3FwTLRK1A r92JZIFFqvz7WEQT5AU+EOJG9n8kH9uAwIj/NC3fPb+oHRZfEbZcRPcrNGqvTOurKN0D AMoK79Z9yRD1pi91M7LrwCVzbz+CUkB0xKWDxQH2+zohUT53slbftSgwR52+m/oR6plG U9Ww== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776245979; x=1776850779; 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=KCLsNX3cjUHeEq5VeNxpgUoLu/D96PUreoTUzfquF0E=; b=N0xBswJb30ANFvCmSlXzAK6ir9wnxvO/sPdXtcCliGBPgDivp6pHcJwcRNjalhVaXt 3QoqrcjteS65unIkh/Q3iRu7SrUAvoLhb9hzgU82+oAc31EmWYsq6p9QN0vA5MdbbcAL 6Vp9CttSn17vagtSSIkah3utGweWsR5WCycVnIkKuqh5j0np4+621O+VcCYu/j3dpbgW fH+l+WxlHpdnfFTtLQfAqCqNpE0s78M5SkifJ3RtNj3a2ZNwAKloTDD+gee7ljZTxdzY OW8ouRGQ30KGyqPhTKZDD7Tzt4wyrFvxZTj06cFXWf5MN7ij0cSClW+Y4NYYf3LBQ4Md yfTg== X-Gm-Message-State: AOJu0YzGC9u5BPd4UcMGGfCdxc8wyUSO7GBFd76YGOZhwc+rM5nLXzm+ AEt4TSVkFxpqA5xBTJ0LxTAA9M2S7XL3mWCZyiCc8IsYdcaHKK6Dqe3fiaDdOt2HhQEtQX68shJ gKhS/f2KDLvApggsBPQ== X-Received: from edcy21.prod.google.com ([2002:a05:6402:3595:b0:66e:6991:c7ce]) (user=aliceryhl job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6402:13c4:b0:66e:4372:7518 with SMTP id 4fb4d7f45d1cf-670786a9b2bmr10483508a12.2.1776245979186; Wed, 15 Apr 2026 02:39:39 -0700 (PDT) Date: Wed, 15 Apr 2026 09:37:54 +0000 In-Reply-To: <20260415-binder-netlink-v3-0-84be9ba63ee2@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260415-binder-netlink-v3-0-84be9ba63ee2@google.com> X-Developer-Key: i=aliceryhl@google.com; a=openpgp; fpr=49F6C1FAA74960F43A5B86A1EE7A392FDE96209F X-Developer-Signature: v=1; a=openpgp-sha256; l=4356; i=aliceryhl@google.com; h=from:subject:message-id; bh=FfVP1wsykDG+Hqd6UNsmQSo/Ch7AeRVTR4IJAZiaXEk=; b=owEBbAKT/ZANAwAKAQRYvu5YxjlGAcsmYgBp31zOfKasmwbfkCFFGYk82gVJITP2uU11raptY z9wiVal5LmJAjIEAAEKAB0WIQSDkqKUTWQHCvFIvbIEWL7uWMY5RgUCad9czgAKCRAEWL7uWMY5 RsahD/joS8/bdiDdrB6f/uSSvZiTtI6Tp6QeRXhgNBIobGYX0Qj4hFIdb7NUK89L3JA2gBQnwWr Ffwp3lnsuxybXMktZ7nRl96Z+o5F24WOYHsPXm17YMIk/BsJIzdhzUqYhxnq4SZI9tdQ5azczgt o89dmvlyoGmaRjoMGycdfCho4CNjPRhmYht85chyQrBjKgAozFgGSVhsKyVG7US6hTVKRVAOFNM 1xGYBOSkW8qnZv+8xcdo42+kZiCopu+QfXI0ARTbEDT+dcBR27jRtFIbzQBT4p2v5AejEXhrboE tHs6dFEP/CPJymx7jCUIc7dAIHTENYmoMD1/pvyb1JME7mVaN97QWm7CNrcFy+ucPmZjv87bURG qMRIuXCKcm6DuSMp1Hxk2JS+FOLmP9bCXpH3E1/zuPQbc20bbiIiw7BaHfX7xttma1mxnEYMhv3 FLLmBI3RsQqVq3NkSpzz+2iaSEXwFGIR1EutrxMDeg9VnoM2IVpj7I4c0YYt58hgC/FFY0l1bGI 32c44Iu8VlKdOGJw6K/NNxebqd3zSrLbeTDj0IBDvaTwEU8a/B/lmjCQkoQue+M9VxRmBGyp/uy fUdUuyal/xKRakn/bQMJt6yVSt/0zV5UjF1T1BJmS0q6U7Qzx6lwWWzOZWfZrc8Gw7Na8VEzGhz boMqCgh/zE+Xv X-Mailer: b4 0.14.3 Message-ID: <20260415-binder-netlink-v3-4-84be9ba63ee2@google.com> Subject: [PATCH v3 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" 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 | 10 ++++++++ drivers/android/binder/transaction.rs | 40 ++++++++++++++++++++++++++++++ 3 files changed, 50 insertions(+), 1 deletion(-) diff --git a/drivers/android/binder/rust_binder_main.rs b/drivers/android/binder/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/thread.rs index 97d5f31e8fe3..aa4e93a877ac 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 } } + if info.oneway_spam_suspect { + // If this is both a oneway spam suspect and a failure, we report it twice. This is + // useful in case the transaction failed with BR_TRANSACTION_PENDING_FROZEN. + info.report_netlink(BR_ONEWAY_SPAM_SUSPECT, &self.process.ctx); + } + if info.reply != 0 { + info.report_netlink(info.reply, &self.process.ctx); + } + Ok(()) } @@ -1332,6 +1341,7 @@ fn reply_inner(self: &Arc, info: &mut TransactionInfo) -> BinderResult { ); let reply = Err(BR_FAILED_REPLY); orig.from.deliver_reply(reply, &orig); + info.reply = BR_FAILED_REPLY; err.reply = BR_TRANSACTION_COMPLETE; err }); 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. 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 != 0 } + + pub(crate) fn report_netlink(&self, reply: u32, ctx: &crate::Context) { + if let Err(err) = 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) -> kernel::error::Result { + if !Report::has_listeners() { + return Ok(()); + } + let mut report = Report::new(GENLMSG_DEFAULT_SIZE, 0, 0, GFP_KERNEL)?; + + 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 != 0 { + report.to_pid(self.to_pid as u32)?; + } + if self.to_tid != 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(()) + } } use core::mem::offset_of; -- 2.54.0.rc0.605.g598a273b03-goog