From nobody Mon Feb 9 15:25:40 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 4E93E2367D3 for ; Sat, 17 Jan 2026 15:25:31 +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=1768663534; cv=none; b=EcX5bbj0iDKEk2iPRW0sOPcidC38jBwhoADfq7XKUXf8M/J17XplXK73C0YmGV6zbRCqJzP9qJa4/sidufw7K+ua9bOAQum1FeTF5kOU4a0UzVkbHQMDhniyva3PUF2doAukmwQSygcJMX6uiE6uzjBIMhcX4QONtwdLnrwrND4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768663534; c=relaxed/simple; bh=9ipAyLskKwi1ksx9hkkM2iyTNIPdZ0fYz79QhCj4ffA=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=ahaULdCtHx0gi3PYOdFV9K6IK1HLQWD0Y1X6KJetrCkUL88baUn1ZpMG0MVyVbEABtRdP7bjY0GPk+BsfKWJsCcYakZzIdaBezKJyMWeM7VmGbvbDXueri+AdaznlJPxsAoVp0FeG1iVywqQUYxWQP8fBRCkUUSokG3s/Hp3WSA= 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=w0zaPWxa; 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="w0zaPWxa" Received: by mail-wm1-f74.google.com with SMTP id 5b1f17b1804b1-4801da6f5c9so25084085e9.1 for ; Sat, 17 Jan 2026 07:25:31 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1768663530; x=1769268330; 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=KqqLu+rK83FYvuu43UqacZgGarS1nyPWiHaErFCcx+s=; b=w0zaPWxac3n44oJeA2yYz1htROIZE7YRtAhUA3iMpqpD3spou6UQkDfZ9D1Z60Xunb t701e3bTfAsypHwmmhCIiZ50wTlGC2ATfm5ZP2f1snD0NsexfT0Zt2/9EDYnEuHm+D8Q 0VPSoEcBalbdCSCgFojMfBWvYIhWewyjiXvzT/nDQDQx2mz1PkNgSqPdN8A0Vzd/oir6 ROBx/Npis/R4NvmqSwD88+qMe67DOcXz9He8mlsYQy3g45scwZ1DP2MeUNeefpc0LLID 34J3UsjwJ3fO0oPwhxAiwpMae3t++3rE5PnFYGxLYTmo/7n6BRq8DFcu5pp6wDu34JZn 90sA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768663530; x=1769268330; 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=KqqLu+rK83FYvuu43UqacZgGarS1nyPWiHaErFCcx+s=; b=NnZaQnTkL4HafVrMjAVLC0HmLGt8W4LaEQwR4c4odwEjPFMhqDMiXYnrXOU2FApRJg KQsYjY0CHISMN/xBFOwS9o0MZY218q5Cw7nwMiucRV3O+BChobXQGesdv5gu3Yb2v9+t Sim+fz7hJGEWjLNkdmOx5KJqRDlYa//n2wrrqwRYa3AOMNFE2ZlruIuxpyU63eKS0lr6 LOcAoChcTcb5xfMisOXlCNg/lOOSJ4VuuBCQJQfp7Ui92sTLKbKkXfBSspFmzeuQByYW eOk3EwkYY/1evI7Zq8Kg0xs1pCAS8gRxmPHavV2HYb6vhTHammV2zP/qDQkERlnoxavt 5rcw== X-Forwarded-Encrypted: i=1; AJvYcCWAwmAfLicADJ0O4fHTI6gxtKQA19jXbPYXljAQqxWl5qwqyRDjj2gEm9fWZ3kWchUme0pLrsXA8utL9ZU=@vger.kernel.org X-Gm-Message-State: AOJu0YwZrghWu41KmXHfdcSp175AgMi2aoXnUlF/7oLLp/zqj06I985e IKaGoVfQ6ZAmaEzp4sjwufBgdUVPPmwHhe/Ov/oI2fX7P431DFKer5aiiFdvBot9Bk7XDFBK08e /2xwCxqF78GeYQZfFKw== X-Received: from wmhm8.prod.google.com ([2002:a05:600c:40c8:b0:477:7893:c737]) (user=aliceryhl job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:4e0f:b0:47e:e779:36e with SMTP id 5b1f17b1804b1-4801eb0375amr70230175e9.19.1768663529817; Sat, 17 Jan 2026 07:25:29 -0800 (PST) Date: Sat, 17 Jan 2026 15:25:20 +0000 In-Reply-To: <20260117-upgrade-poll-v1-0-179437b7bd49@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260117-upgrade-poll-v1-0-179437b7bd49@google.com> X-Developer-Key: i=aliceryhl@google.com; a=openpgp; fpr=49F6C1FAA74960F43A5B86A1EE7A392FDE96209F X-Developer-Signature: v=1; a=openpgp-sha256; l=3796; i=aliceryhl@google.com; h=from:subject:message-id; bh=9ipAyLskKwi1ksx9hkkM2iyTNIPdZ0fYz79QhCj4ffA=; b=owEBbQKS/ZANAwAKAQRYvu5YxjlGAcsmYgBpa6nlFxHRFC9Er4fNiBw9GYpYeu3Uu4ieGDJeI wo6v3Mb5H6JAjMEAAEKAB0WIQSDkqKUTWQHCvFIvbIEWL7uWMY5RgUCaWup5QAKCRAEWL7uWMY5 RtG8EACdXCwXlePrBnRXKgNEHXkdYMvJULH49b5iki2wcp8iujIwa+FEoFXm1Y69eN5UCCZtcQH zylpEINsHKVe4/to8zHNwCmm5tLMwDeEWjNTv2t2g9W5UXD4Zw/F9RrerMh4va+TshAnCJGLJXu 04229CYQkUTlNmMwREG+u9/+6hcT1fMQgYSijDpVy1gdhpBb1PPyCgcx7AmiYkX+V/4JihValTI hU8iO7IyLpKIlH6kuT2gRS9bCG4At0CSusPaMiH45agzSNWx+3HWRp9PtxcbjsQXOxXQ7Z7DsWf CUGEAxYfVXI6OTKm3Nz9IzdyZtkrxqjT+KyHKNCbH1VAKXqrp9kaJAYbmgMSkkEkOZGAYBiVCTu +K8UtmVC9olOfl/EDZNYg9PLy13SnSorCw6hO5i610hJVHp6kllzrwdbjfV25/P+hjP3K8oNRAw rGMIGCeT1h1wmNC5ddkhoe6q+jH+CVhkaBQDuI6R6XSg6VgtTkx+Psi8L78z5mR7h8iM5j3EY4Z jrhvuVEHQJKj1FaVH5+oMhINwBUn092wKAxAk4S6RPiL1yH+saaVfT05jl72QSYKxV5AfMNVvwD exsQTHgSAT1OQyHjhwsRtP+bE/AJHnT4On9+oN0IeJdPXLy4I4TuuYgCegpoj/IEYnvGYMHEQyb 0ULwk+2ADGWOyqw== X-Mailer: b4 0.14.2 Message-ID: <20260117-upgrade-poll-v1-2-179437b7bd49@google.com> Subject: [PATCH RFC 2/2] rust_binder: use UpgradePollCondVar From: Alice Ryhl To: Christian Brauner , Boqun Feng , "Paul E. McKenney" Cc: Gary Guo , Greg Kroah-Hartman , Carlos Llamas , linux-fsdevel@vger.kernel.org, rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, Alice Ryhl Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Most processes do not use Rust Binder with epoll, so avoid paying the synchronize_rcu() cost in drop for those that don't need it. For those that do, we also manage to replace synchronize_rcu() with kfree_rcu(), though we introduce an extra allocation. Signed-off-by: Alice Ryhl --- drivers/android/binder/process.rs | 2 +- drivers/android/binder/thread.rs | 18 +++++++++++------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/drivers/android/binder/process.rs b/drivers/android/binder/pro= cess.rs index 132055b4790f0ec69a87635b498909df2bf475e2..9374f1a86766c09321b57e565b6= 317cc290ea32b 100644 --- a/drivers/android/binder/process.rs +++ b/drivers/android/binder/process.rs @@ -1684,7 +1684,7 @@ pub(crate) fn poll( table: PollTable<'_>, ) -> Result { let thread =3D this.get_current_thread()?; - let (from_proc, mut mask) =3D thread.poll(file, table); + let (from_proc, mut mask) =3D thread.poll(file, table)?; if mask =3D=3D 0 && from_proc && !this.inner.lock().work.is_empty(= ) { mask |=3D bindings::POLLIN; } diff --git a/drivers/android/binder/thread.rs b/drivers/android/binder/thre= ad.rs index 82264db06507d4641b60cbed96af482a9d36e7b2..8f09cf1599ae7edcf2ee60b2cb1= b08cc2d0afd3f 100644 --- a/drivers/android/binder/thread.rs +++ b/drivers/android/binder/thread.rs @@ -16,7 +16,7 @@ seq_file::SeqFile, seq_print, sync::atomic::{ordering::Relaxed, Atomic}, - sync::poll::{PollCondVar, PollTable}, + sync::poll::{PollTable, UpgradePollCondVar}, sync::{Arc, SpinLock}, task::Task, types::ARef, @@ -412,7 +412,7 @@ pub(crate) struct Thread { #[pin] inner: SpinLock, #[pin] - work_condvar: PollCondVar, + work_condvar: UpgradePollCondVar, /// Used to insert this thread into the process' `ready_threads` list. /// /// INVARIANT: May never be used for any other list than the `self.pro= cess.ready_threads`. @@ -443,7 +443,7 @@ pub(crate) fn new(id: i32, process: Arc) -> Re= sult> { process, task: ARef::from(&**kernel::current!()), inner <- kernel::new_spinlock!(inner, "Thread::inner"), - work_condvar <- kernel::new_poll_condvar!("Thread::work_co= ndvar"), + work_condvar <- kernel::new_upgrade_poll_condvar!("Thread:= :work_condvar"), links <- ListLinks::new(), links_track <- AtomicTracker::new(), }), @@ -1484,10 +1484,15 @@ pub(crate) fn write_read(self: &Arc, data: Us= erSlice, wait: bool) -> Resul ret } =20 - pub(crate) fn poll(&self, file: &File, table: PollTable<'_>) -> (bool,= u32) { - table.register_wait(file, &self.work_condvar); + pub(crate) fn poll(&self, file: &File, table: PollTable<'_>) -> Result= <(bool, u32)> { + let condvar =3D self.work_condvar.poll( + &self.inner, + c"Thread::work_condvar (upgraded)", + kernel::static_lock_class!(), + )?; + table.register_wait(file, condvar); let mut inner =3D self.inner.lock(); - (inner.should_use_process_work_queue(), inner.poll()) + Ok((inner.should_use_process_work_queue(), inner.poll())) } =20 /// Make the call to `get_work` or `get_work_local` return immediately= , if any. @@ -1523,7 +1528,6 @@ pub(crate) fn notify_if_poll_ready(&self, sync: bool)= { pub(crate) fn release(self: &Arc) { self.inner.lock().is_dead =3D true; =20 - //self.work_condvar.clear(); self.unwind_transaction_stack(); =20 // Cancel all pending work items. --=20 2.52.0.457.g6b5491de43-goog