From: "Andreas Hindborg (Samsung)" <nmi@metaspace.dk>
To: Benno Lossin <benno.lossin@proton.me>
Cc: "Alice Ryhl" <aliceryhl@google.com>,
rust-for-linux@vger.kernel.org, "Tejun Heo" <tj@kernel.org>,
"Miguel Ojeda" <ojeda@kernel.org>,
"Lai Jiangshan" <jiangshanlai@gmail.com>,
"Wedson Almeida Filho" <wedsonaf@gmail.com>,
"Alex Gaynor" <alex.gaynor@gmail.com>,
"Boqun Feng" <boqun.feng@gmail.com>,
"Gary Guo" <gary@garyguo.net>,
"Björn Roy Baron" <bjorn3_gh@protonmail.com>,
linux-kernel@vger.kernel.org, patches@lists.linux.dev
Subject: Re: [PATCH v3 6/9] rust: workqueue: add helper for defining work_struct fields
Date: Wed, 23 Aug 2023 11:06:37 +0200 [thread overview]
Message-ID: <87il963ysz.fsf@metaspace.dk> (raw)
In-Reply-To: <87msyisvmi.fsf@metaspace.dk>
"Andreas Hindborg (Samsung)" <nmi@metaspace.dk> writes:
> Hi Benno,
>
> Benno Lossin <benno.lossin@proton.me> writes:
>
> ...
>
>>> +/// Links for a work item.
>>> +///
>>> +/// This struct contains a function pointer to the `run` function from the [`WorkItemPointer`]
>>> +/// trait, and defines the linked list pointers necessary to enqueue a work item in a workqueue.
>>> +///
>>> +/// Wraps the kernel's C `struct work_struct`.
>>> +///
>>> +/// This is a helper type used to associate a `work_struct` with the [`WorkItem`] that uses it.
>>> +#[repr(transparent)]
>>> +pub struct Work<T: ?Sized, const ID: u64 = 0> {
>>> + work: Opaque<bindings::work_struct>,
>>> + _inner: PhantomData<T>,
>>
>> Should this really be `PhantomData<T>`? Are you dropping `T`s in the
>> destructor of `Work<T>`? I do not think so `PhantomData<fn() -> Box<T>>`
>> should do the trick.
>>
>
> Could you elaborate what is the issue in having `PhantomData<T>`?
I played around with this and as far as I can tell, using
`PhantomData<fn() -> Box<T>>` does not disable dropck for T. Thus,
`PhantomData<T>` has the same effect as `PhantomData<fn() -> Box<T>`,
which is covariance over T and dropck:
```rust
use std::marker::PhantomData;
struct A<T> {
_marker: PhantomData<fn() -> Box<T>>,
}
//#[cfg(disable)]
impl<T> Drop for A<T> {
fn drop(&mut self) {
todo!()
}
}
struct B {}
fn main() {
let (_a, b);
b = B {};
_a = foo(&b);
}
fn foo<'a>(_b: &'a B) -> A<&'a B> {
let a: A<&'a B> = A {
_marker: PhantomData,
};
a
}
```
This is a little surprising to me since nomicon [1] explicitly marks
`PhantomData<T>` as "covariant (with drop check)" but only "covariant"
for `PhantomData<fn() -> T>`.
Not sure why you wanted the box?
Best regards,
Andreas
[1] https://doc.rust-lang.org/nomicon/phantom-data.html#table-of-phantomdata-patterns
next prev parent reply other threads:[~2023-08-23 9:14 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-07-11 9:32 [PATCH v3 0/9] rust: workqueue: add bindings for the workqueue Alice Ryhl
2023-07-11 9:32 ` [PATCH v3 1/9] rust: add offset_of! macro Alice Ryhl
2023-08-21 18:43 ` Andreas Hindborg (Samsung)
2023-07-11 9:32 ` [PATCH v3 2/9] rust: sync: add `Arc::{from_raw, into_raw}` Alice Ryhl
2023-07-12 20:33 ` Martin Rodriguez Reboredo
2023-07-15 9:42 ` Benno Lossin
2023-07-17 13:47 ` Alice Ryhl
2023-08-22 11:46 ` Andreas Hindborg (Samsung)
2023-07-11 9:32 ` [PATCH 3/9] workqueue: introduce `__INIT_WORK_WITH_KEY` Alice Ryhl
2023-07-11 10:49 ` Alice Ryhl
2023-07-12 6:33 ` Boqun Feng
2023-07-12 20:34 ` Martin Rodriguez Reboredo
2023-07-11 9:32 ` [PATCH v3 4/9] rust: workqueue: add low-level workqueue bindings Alice Ryhl
2023-07-11 22:23 ` Boqun Feng
2023-07-17 13:53 ` Alice Ryhl
2023-07-11 9:32 ` [PATCH v3 5/9] rust: workqueue: define built-in queues Alice Ryhl
2023-07-11 9:33 ` [PATCH v3 6/9] rust: workqueue: add helper for defining work_struct fields Alice Ryhl
2023-07-12 20:43 ` Martin Rodriguez Reboredo
2023-07-15 9:43 ` Benno Lossin
2023-07-17 14:49 ` Alice Ryhl
2023-08-22 18:24 ` Andreas Hindborg (Samsung)
2023-08-23 9:06 ` Andreas Hindborg (Samsung) [this message]
2023-08-22 19:59 ` Andreas Hindborg (Samsung)
2023-07-11 9:33 ` [PATCH v3 7/9] rust: workqueue: implement `WorkItemPointer` for pointer types Alice Ryhl
2023-07-11 9:33 ` [PATCH v3 8/9] rust: workqueue: add `try_spawn` helper method Alice Ryhl
2023-07-11 9:33 ` [PATCH v3 9/9] rust: workqueue: add examples Alice Ryhl
2023-07-14 22:40 ` Boqun Feng
2023-07-11 22:17 ` [PATCH v3 0/9] rust: workqueue: add bindings for the workqueue Tejun Heo
2023-07-11 23:44 ` Miguel Ojeda
2023-07-12 0:27 ` Tejun Heo
2023-07-12 16:36 ` Miguel Ojeda
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=87il963ysz.fsf@metaspace.dk \
--to=nmi@metaspace.dk \
--cc=alex.gaynor@gmail.com \
--cc=aliceryhl@google.com \
--cc=benno.lossin@proton.me \
--cc=bjorn3_gh@protonmail.com \
--cc=boqun.feng@gmail.com \
--cc=gary@garyguo.net \
--cc=jiangshanlai@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=ojeda@kernel.org \
--cc=patches@lists.linux.dev \
--cc=rust-for-linux@vger.kernel.org \
--cc=tj@kernel.org \
--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.