Add a new trait `Ownable` and type `Owned` for types that specify their own way of performing allocation and destruction. This is useful for types from the C side.
Add the trait `OwnableRefCounted` that allows conversion between `ARef` and `Owned`. This is analogous to conversion between `Arc` and `UniqueArc`. Patch 2 is difficult to merge since it requires a change everywhere `AlwaysRefCounted` is implemented prior to application. We had new implementations of this trait for the last few releases, so we are probably going to have some when these patches are applied. Sorry for that. I would ask maintainers of all affected areas to ACK these patches as soon as possible. This series has been underway a very long time. The work was started off by Asahi Lina, then picked up by Oliver Mangold and is now being finalized by Andreas Hindborg. For series like this, it is difficult to track what contributions came from what authors at what time. I'm going to leave authorship of the patches with the person originally submitting the patch. I will not track changes by each individual on each patch. Instead, I will leave a link to the original patch in the commit message of these multi-contributor patches. As I cannot reach out to everyone to ask if they will sign off on the changes I have made, I will remove their tags, as these require approval. With this approach, checkpatch.pl is complaining about missing Signed-off-by from patch author. I am not sure if we can keep it like this, if I need to change the author, or if I need to hunt down the original author to get an ACK for keeping the Signed-off-by tag? Signed-off-by: Andreas Hindborg <[email protected]> --- Changes in v14: - Rebase on v6.19-rc7. - Rewrite cover letter. - Update documentation and safety comments based on v13 feedback. - Update commit messages. - Reorder implementation blocks in owned.rs. - Update example in owned.rs to use try operator rather than `expect`. - Reformat use statements. - Add patch: rust: page: convert to `Ownable`. - Add patch: rust: implement `ForeignOwnable` for `Owned`. - Add patch: rust: page: add `from_raw()`. - Link to v13: https://lore.kernel.org/r/[email protected] Changes in v13: - Rebase onto v6.18-rc1 (Andreas's work). - Documentation and style fixes contributed by Andreas - Link to v12: https://lore.kernel.org/r/[email protected] Changes in v12: - - Rebase onto v6.17-rc1 (Andreas's work). - moved kernel/types/ownable.rs to kernel/owned.rs - Drop OwnableMut, make DerefMut depend on Unpin instead. I understood ML discussion as that being okay, but probably needs further scrunity. - Lots of more documentation changes suggested by reviewers. - Usage example for Ownable/Owned. - Link to v11: https://lore.kernel.org/r/[email protected] Changes in v11: - Rework of documentation. I tried to honor all requests for changes "in spirit" plus some clearifications and corrections of my own. - Dropping `SimpleOwnedRefCounted` by request from Alice, as it creates a potentially problematic blanket implementation (which a derive macro that could be created later would not have). - Dropping Miguel's "kbuild: provide `RUSTC_HAS_DO_NOT_RECOMMEND` symbol" patch, as it is not needed anymore after dropping `SimpleOwnedRefCounted`. (I can add it again, if it is considered useful anyway). - Link to v10: https://lore.kernel.org/r/[email protected] Changes in v10: - Moved kernel/ownable.rs to kernel/types/ownable.rs - Fixes in documentation / comments as suggested by Andreas Hindborg - Added Reviewed-by comment for Andreas Hindborg - Fix rustfmt of pid_namespace.rs - Link to v9: https://lore.kernel.org/r/[email protected] Changes in v9: - Rebase onto v6.14-rc7 - Move Ownable/OwnedRefCounted/Ownable, etc., into separate module - Documentation fixes to Ownable/OwnableMut/OwnableRefCounted - Add missing SAFETY documentation to ARef example - Link to v8: https://lore.kernel.org/r/[email protected] Changes in v8: - Fix Co-developed-by and Suggested-by tags as suggested by Miguel and Boqun - Some small documentation fixes in Owned/Ownable patch - removing redundant trait constraint on DerefMut for Owned as suggested by Boqun Feng - make SimpleOwnedRefCounted no longer implement RefCounted as suggested by Boqun Feng - documentation for RefCounted as suggested by Boqun Feng - Link to v7: https://lore.kernel.org/r/[email protected] Changes in v7: - Squash patch to make Owned::from_raw/into_raw public into parent - Added Signed-off-by to other people's commits - Link to v6: https://lore.kernel.org/r/[email protected] Changes in v6: - Changed comments/formatting as suggested by Miguel Ojeda - Included and used new config flag RUSTC_HAS_DO_NOT_RECOMMEND, thus no changes to types.rs will be needed when the attribute becomes available. - Fixed commit message for Owned patch. - Link to v5: https://lore.kernel.org/r/[email protected] Changes in v5: - Rebase the whole thing on top of the Ownable/Owned traits by Asahi Lina. - Rename AlwaysRefCounted to RefCounted and make AlwaysRefCounted a marker trait instead to allow to obtain an ARef<T> from an &T, which (as Alice pointed out) is unsound when combined with UniqueRef/Owned. - Change the Trait design and naming to implement this feature, UniqueRef/UniqueRefCounted is dropped in favor of Ownable/Owned and OwnableRefCounted is used to provide the functions to convert between Owned and ARef. - Link to v4: https://lore.kernel.org/r/[email protected] Changes in v4: - Just a minor change in naming by request from Andreas Hindborg, try_shared_to_unique() -> try_from_shared(), unique_to_shared() -> into_shared(), which is more in line with standard Rust naming conventions. - Link to v3: https://lore.kernel.org/r/Z8Wuud2UQX6Yukyr@mango --- Andreas Hindborg (4): rust: aref: update formatting of use statements rust: page: update formatting of `use` statements rust: implement `ForeignOwnable` for `Owned` rust: page: add `from_raw()` Asahi Lina (2): rust: types: Add Ownable/Owned types rust: page: convert to `Ownable` Oliver Mangold (3): rust: rename `AlwaysRefCounted` to `RefCounted`. rust: Add missing SAFETY documentation for `ARef` example rust: Add `OwnableRefCounted` rust/kernel/auxiliary.rs | 7 +- rust/kernel/block/mq/request.rs | 15 +- rust/kernel/cred.rs | 13 +- rust/kernel/device.rs | 10 +- rust/kernel/device/property.rs | 7 +- rust/kernel/drm/device.rs | 10 +- rust/kernel/drm/gem/mod.rs | 8 +- rust/kernel/fs/file.rs | 16 +- rust/kernel/i2c.rs | 16 +- rust/kernel/lib.rs | 1 + rust/kernel/mm.rs | 15 +- rust/kernel/mm/mmput_async.rs | 9 +- rust/kernel/opp.rs | 10 +- rust/kernel/owned.rs | 366 ++++++++++++++++++++++++++++++++++++++++ rust/kernel/page.rs | 57 +++++-- rust/kernel/pci.rs | 10 +- rust/kernel/pid_namespace.rs | 12 +- rust/kernel/platform.rs | 7 +- rust/kernel/sync/aref.rs | 80 ++++++--- rust/kernel/task.rs | 10 +- rust/kernel/types.rs | 13 +- 21 files changed, 612 insertions(+), 80 deletions(-) --- base-commit: 63804fed149a6750ffd28610c5c1c98cce6bd377 change-id: 20250305-unique-ref-29fcd675f9e9 Best regards, -- Andreas Hindborg <[email protected]>
