All of lore.kernel.org
 help / color / mirror / Atom feed
From: Boqun Feng <boqun.feng@gmail.com>
To: Matt Gilbride <mattgilbride@google.com>
Cc: "Miguel Ojeda" <ojeda@kernel.org>,
	"Alex Gaynor" <alex.gaynor@gmail.com>,
	"Wedson Almeida Filho" <wedsonaf@gmail.com>,
	"Gary Guo" <gary@garyguo.net>,
	"Björn Roy Baron" <bjorn3_gh@protonmail.com>,
	"Benno Lossin" <benno.lossin@proton.me>,
	"Andreas Hindborg" <a.hindborg@samsung.com>,
	"Alice Ryhl" <aliceryhl@google.com>,
	"Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
	"Arve Hjønnevåg" <arve@android.com>,
	"Todd Kjos" <tkjos@android.com>,
	"Martijn Coenen" <maco@android.com>,
	"Joel Fernandes" <joel@joelfernandes.org>,
	"Carlos Llamas" <cmllamas@google.com>,
	"Suren Baghdasaryan" <surenb@google.com>,
	"Christian Brauner" <brauner@kernel.org>,
	"Rob Landley" <rob@landley.net>,
	"Davidlohr Bueso" <dave@stgolabs.net>,
	"Michel Lespinasse" <michel@lespinasse.org>,
	rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v7 0/6] Red-black tree abstraction needed by Rust Binder
Date: Fri, 26 Jul 2024 13:45:43 -0700	[thread overview]
Message-ID: <ZqQK92Mj09a0ocDY@boqun-archlinux> (raw)
In-Reply-To: <20240726-b4-rbtree-v7-0-aee88caaf97c@google.com>

On Fri, Jul 26, 2024 at 07:57:39PM +0000, Matt Gilbride wrote:
> This patchset contains the red-black tree abstractions needed by the Rust
> implementation of the Binder driver.
> 
> Binder driver benefits from O(log n) search/insertion/deletion of
> key/value mappings in various places, including `process.rs` and
> `range_alloc.rs`.  In `range_alloc.rs`, the ability to store and
> search by a generic key type is also useful.
> 
> Please see the Rust Binder RFC for usage examples [1]. Note that
> the `container_of` macro is currently used only by `rbtree` itself.
> 
> Users of "rust: rbtree: add red-black tree implementation backed by the C version"
>     [PATCH RFC 03/20] rust_binder: add threading support
>     [PATCH RFC 05/20] rust_binder: add nodes and context managers
>     [PATCH RFC 06/20] rust_binder: add oneway transactions
> 
> Users of "rust: rbtree: add iterator"
>     [PATCH RFC 17/20] rust_binder: add oneway spam detection
> 
> Users of "rust: rbtree: add mutable iterator"
>     [PATCH RFC 06/20] rust_binder: add oneway transactions
> 
> Users of "rust: rbtree: add `RBTreeCursor`"
>     [PATCH RFC 06/20] rust_binder: add oneway transactions
> 
> Users of "rust: rbtree: add RBTree::entry"
>     Not used in the original RFC, but introduced after further
>     code review.  See: https://r.android.com/2849906
> 
> The Rust Binder RFC addresses the upstream deprecation of red-black
> tree. Quoted here for convenience:
> 
> "This RFC uses the kernel's red-black tree for key/value mappings, but we
> are aware that the red-black tree is deprecated. We did this to make the
> performance comparison more fair, since C binder also uses rbtree for
> this. We intend to replace these with XArrays instead. That said, we
> don't think that XArray is a good fit for the range allocator, and we
> propose to continue using the red-black tree for the range allocator."
> 
> Link: https://lore.kernel.org/rust-for-linux/20231101-rust-binder-v1-0-08ba9197f637@google.com/ [1]
> Signed-off-by: Matt Gilbride <mattgilbride@google.com>

Thanks! For patch #5, there is a small style issue, which can be fixed
by:

diff --git a/rust/kernel/rbtree.rs b/rust/kernel/rbtree.rs
index f6d5162e46f5..96fd45f9dc52 100644
--- a/rust/kernel/rbtree.rs
+++ b/rust/kernel/rbtree.rs
@@ -465,9 +465,7 @@ pub fn cursor_lower_bound(&mut self, key: &K) -> Option<RBTreeCursor<'_, K, V>>
             }
         }
 
-        let Some(best) = best_match else {
-            return None;
-        };
+        let best = best_match?;
 
         // SAFETY: `best` is a non-null node so it is valid by the type invariants.
         let links = unsafe { addr_of_mut!((*best.as_ptr()).links) };

with that, for the whole series:

Reviewed-by: Boqun Feng <boqun.feng@gmail.com>

I also put this on rust-dev branch for my own testing purpose (with the
above fix applied, and using Benno's version of patch #1 since it's
already in rust-dev).

Regards,
Boqun

> ---
> Changes in v7:
> - make `RawVacantEntry.rbtree` a raw pointer like
>   `RawVacantEntry.child_field_of_parent`, since the latter can
>   technically point at a field of the former. We prefer that the
>   implementation be explicit about the safety guarantees of both because
>   of the relationship between them.
> - Link to v6: https://lore.kernel.org/r/20240711-b4-rbtree-v6-0-14bef1a8cdba@google.com
> 
> Changes in v6:
> - Minimize usage of `*mut bindings::rb_node`, replacing with
>   `NonNull<bindings::rb_node>`. Specifically, changing
>   `RBTreeCursor.current` to be `NonNull<bindings::rb_node>` and updating
>   the corresponding functions.
> - Update `RBTreeCursor:to_key_value` helpers to have their own lifetime
>   (they are not instance methods, using a different lifetime than that
>   of the `impl` block they are in makes things more clear.
> - Fix misplaced semicolon in `cursor_lower_bound`.
> - Link to v5: https://lore.kernel.org/r/20240606-b4-rbtree-v5-0-96fe1a0e97c0@google.com
> 
> Changes in v5:
> - Used `Box::write` in `RBTreeNodeReservation::into_node`, removing
>   unnecessary `unsafe` blocks.
> - Updated `RBTreeCursor::remove_current` to return the removed node.
> - Link to v4: https://lore.kernel.org/r/20240603-b4-rbtree-v4-0-308e43d6abfc@google.com
> 
> Changes in v4:
> - rebased onto the tip of rust-for-linux/rust-next (97ab3e8eec0ce79d9e265e6c9e4c480492180409)
> - addressed comments from draft PR on GitHub: https://github.com/Rust-for-Linux/linux/pull/1081
> - Link to v3: https://lore.kernel.org/r/20240418-b4-rbtree-v3-0-323e134390ce@google.com
> 
> Changes in v3:
> - Address various feedback re: SAFETY and INVARIANT comments from v2.
> - Update variable naming and add detailed comments for the `RBTree::insert` (later moved to
>   `RBTree::raw_entry`) implementation.
> - Link to v2: https://lore.kernel.org/r/20240219-b4-rbtree-v2-0-0b113aab330d@google.com
> 
> Changes in v2:
> - Update documentation link to the C header file
> - Use `core::convert::Infallible` in try_reserve_node
> - Link to v1: https://lore.kernel.org/r/20240205-b4-rbtree-v1-0-995e3eee38c0@google.com
> 
> ---
> Alice Ryhl (1):
>       rust: rbtree: add `RBTree::entry`
> 
> Benno Lossin (1):
>       rust: kernel: add `drop_contents` to `BoxExt`
> 
> Matt Gilbride (1):
>       rust: rbtree: add `RBTreeCursor`
> 
> Wedson Almeida Filho (3):
>       rust: rbtree: add red-black tree implementation backed by the C version
>       rust: rbtree: add iterator
>       rust: rbtree: add mutable iterator
> 
>  rust/helpers.c               |    7 +
>  rust/kernel/alloc/box_ext.rs |   24 +-
>  rust/kernel/lib.rs           |    1 +
>  rust/kernel/rbtree.rs        | 1290 ++++++++++++++++++++++++++++++++++++++++++
>  4 files changed, 1321 insertions(+), 1 deletion(-)
> ---
> base-commit: 97ab3e8eec0ce79d9e265e6c9e4c480492180409
> change-id: 20231205-b4-rbtree-abb1a016f0a0
> 
> Best regards,
> -- 
> Matt Gilbride <mattgilbride@google.com>
> 

      parent reply	other threads:[~2024-07-26 20:46 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-07-26 19:57 [PATCH v7 0/6] Red-black tree abstraction needed by Rust Binder Matt Gilbride
2024-07-26 19:57 ` [PATCH v7 1/6] rust: kernel: add `drop_contents` to `BoxExt` Matt Gilbride
2024-07-26 19:57 ` [PATCH v7 2/6] rust: rbtree: add red-black tree implementation backed by the C version Matt Gilbride
2024-07-26 19:57 ` [PATCH v7 3/6] rust: rbtree: add iterator Matt Gilbride
2024-07-26 19:57 ` [PATCH v7 4/6] rust: rbtree: add mutable iterator Matt Gilbride
2024-07-26 19:57 ` [PATCH v7 5/6] rust: rbtree: add `RBTreeCursor` Matt Gilbride
2024-07-26 19:57 ` [PATCH v7 6/6] rust: rbtree: add `RBTree::entry` Matt Gilbride
2024-07-26 20:45 ` Boqun Feng [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ZqQK92Mj09a0ocDY@boqun-archlinux \
    --to=boqun.feng@gmail.com \
    --cc=a.hindborg@samsung.com \
    --cc=alex.gaynor@gmail.com \
    --cc=aliceryhl@google.com \
    --cc=arve@android.com \
    --cc=benno.lossin@proton.me \
    --cc=bjorn3_gh@protonmail.com \
    --cc=brauner@kernel.org \
    --cc=cmllamas@google.com \
    --cc=dave@stgolabs.net \
    --cc=gary@garyguo.net \
    --cc=gregkh@linuxfoundation.org \
    --cc=joel@joelfernandes.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=maco@android.com \
    --cc=mattgilbride@google.com \
    --cc=michel@lespinasse.org \
    --cc=ojeda@kernel.org \
    --cc=rob@landley.net \
    --cc=rust-for-linux@vger.kernel.org \
    --cc=surenb@google.com \
    --cc=tkjos@android.com \
    --cc=wedsonaf@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.