mirror of
git://git.yoctoproject.org/linux-yocto.git
synced 2025-10-22 23:13:01 +02:00
rust: devres: require T: Send for Devres
[ Upstream commit0dab138d0f
] Due to calling Revocable::revoke() from Devres::devres_callback() T may be dropped from Devres::devres_callback() and hence must be Send. Fix this by adding the corresponding bound to Devres and DevresInner. Reported-by: Boqun Feng <boqun.feng@gmail.com> Closes: https://lore.kernel.org/lkml/aFzI5L__OcB9hqdG@Mac.home/ Fixes:76c01ded72
("rust: add devres abstraction") Reviewed-by: Boqun Feng <boqun.fenng@gmail.com> Reviewed-by: Benno Lossin <lossin@kernel.org> Link: https://lore.kernel.org/r/20250626132544.72866-1-dakr@kernel.org Signed-off-by: Danilo Krummrich <dakr@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
104cc95036
commit
c9db57bd77
|
@ -18,7 +18,7 @@ use crate::{
|
|||
};
|
||||
|
||||
#[pin_data]
|
||||
struct DevresInner<T> {
|
||||
struct DevresInner<T: Send> {
|
||||
dev: ARef<Device>,
|
||||
callback: unsafe extern "C" fn(*mut c_void),
|
||||
#[pin]
|
||||
|
@ -95,9 +95,9 @@ struct DevresInner<T> {
|
|||
/// # Ok(())
|
||||
/// # }
|
||||
/// ```
|
||||
pub struct Devres<T>(Arc<DevresInner<T>>);
|
||||
pub struct Devres<T: Send>(Arc<DevresInner<T>>);
|
||||
|
||||
impl<T> DevresInner<T> {
|
||||
impl<T: Send> DevresInner<T> {
|
||||
fn new(dev: &Device<Bound>, data: T, flags: Flags) -> Result<Arc<DevresInner<T>>> {
|
||||
let inner = Arc::pin_init(
|
||||
pin_init!( DevresInner {
|
||||
|
@ -175,7 +175,7 @@ impl<T> DevresInner<T> {
|
|||
}
|
||||
}
|
||||
|
||||
impl<T> Devres<T> {
|
||||
impl<T: Send> Devres<T> {
|
||||
/// Creates a new [`Devres`] instance of the given `data`. The `data` encapsulated within the
|
||||
/// returned `Devres` instance' `data` will be revoked once the device is detached.
|
||||
pub fn new(dev: &Device<Bound>, data: T, flags: Flags) -> Result<Self> {
|
||||
|
@ -247,7 +247,7 @@ impl<T> Devres<T> {
|
|||
}
|
||||
}
|
||||
|
||||
impl<T> Drop for Devres<T> {
|
||||
impl<T: Send> Drop for Devres<T> {
|
||||
fn drop(&mut self) {
|
||||
// SAFETY: When `drop` runs, it is guaranteed that nobody is accessing the revocable data
|
||||
// anymore, hence it is safe not to wait for the grace period to finish.
|
||||
|
|
Loading…
Reference in New Issue
Block a user