public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Andreas Hindborg <a.hindborg@samsung.com>
To: Alice Ryhl <aliceryhl@google.com>
Cc: "rust-for-linux@vger.kernel.org" <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>,
	"Benno Lossin" <benno.lossin@proton.me>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"patches@lists.linux.dev" <patches@lists.linux.dev>
Subject: Re: [PATCH v4 4/7] rust: workqueue: add helper for defining work_struct fields
Date: Mon, 28 Aug 2023 11:21:50 +0000	[thread overview]
Message-ID: <87y1hvtnsi.fsf@samsung.com> (raw)
In-Reply-To: <20230828104807.1581592-5-aliceryhl@google.com>


Alice Ryhl <aliceryhl@google.com> writes:

> The main challenge with defining `work_struct` fields is making sure
> that the function pointer stored in the `work_struct` is appropriate for
> the work item type it is embedded in. It needs to know the offset of the
> `work_struct` field being used (even if there are several!) so that it
> can do a `container_of`, and it needs to know the type of the work item
> so that it can call into the right user-provided code. All of this needs
> to happen in a way that provides a safe API to the user, so that users
> of the workqueue cannot mix up the function pointers.
>
> There are three important pieces that are relevant when doing this:
>
>  * The pointer type.
>  * The work item struct. This is what the pointer points at.
>  * The `work_struct` field. This is a field of the work item struct.
>
> This patch introduces a separate trait for each piece. The pointer type
> is given a `WorkItemPointer` trait, which pointer types need to
> implement to be usable with the workqueue. This trait will be
> implemented for `Arc` and `Box` in a later patch in this patchset.
> Implementing this trait is unsafe because this is where the
> `container_of` operation happens, but user-code will not need to
> implement it themselves.
>
> The work item struct should then implement the `WorkItem` trait. This
> trait is where user-code specifies what they want to happen when a work
> item is executed. It also specifies what the correct pointer type is.
>
> Finally, to make the work item struct know the offset of its
> `work_struct` field, we use a trait called `HasWork<T, ID>`. If a type
> implements this trait, then the type declares that, at the given offset,
> there is a field of type `Work<T, ID>`. The trait is marked unsafe
> because the OFFSET constant must be correct, but we provide an
> `impl_has_work!` macro that can safely implement `HasWork<T>` on a type.
> The macro expands to something that only compiles if the specified field
> really has the type `Work<T>`. It is used like this:
>
> ```
> struct MyWorkItem {
>     work_field: Work<MyWorkItem, 1>,
> }
>
> impl_has_work! {
>     impl HasWork<MyWorkItem, 1> for MyWorkItem { self.work_field }
> }
> ```
>
> Note that since the `Work` type is annotated with an id, you can have
> several `work_struct` fields by using a different id for each one.
>
> Co-developed-by: Gary Guo <gary@garyguo.net>
> Signed-off-by: Gary Guo <gary@garyguo.net>
> Signed-off-by: Alice Ryhl <aliceryhl@google.com>
> ---

Reviewed-by: Andreas Hindborg <a.hindborg@samsung.com>

  reply	other threads:[~2023-08-28 11:22 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-08-28 10:48 [PATCH v4 0/7] rust: workqueue: add bindings for the workqueue Alice Ryhl
2023-08-28 10:48 ` [PATCH v4 1/7] rust: sync: add `Arc::{from_raw, into_raw}` Alice Ryhl
2023-08-28 10:48 ` [PATCH v4 2/7] rust: workqueue: add low-level workqueue bindings Alice Ryhl
2023-08-28 10:48 ` [PATCH v4 3/7] rust: workqueue: define built-in queues Alice Ryhl
2023-08-28 10:48 ` [PATCH v4 4/7] rust: workqueue: add helper for defining work_struct fields Alice Ryhl
2023-08-28 11:21   ` Andreas Hindborg [this message]
2023-09-04  0:29   ` Martin Rodriguez Reboredo
2023-09-05 10:07   ` Benno Lossin
2023-09-06  9:56     ` Alice Ryhl
2023-09-26 10:01     ` Alice Ryhl
2023-09-23  2:56   ` Gary Guo
2023-08-28 10:48 ` [PATCH v4 5/7] rust: workqueue: implement `WorkItemPointer` for pointer types Alice Ryhl
2023-08-28 10:48 ` [PATCH v4 6/7] rust: workqueue: add `try_spawn` helper method Alice Ryhl
2023-08-28 10:48 ` [PATCH v4 7/7] rust: workqueue: add examples Alice Ryhl
2023-10-03 20:13   ` Konstantin Shelekhin
2023-10-03 22:29     ` Alice Ryhl
2023-10-04 11:06       ` Konstantin Shelekhin
2023-10-04 14:38         ` Boqun Feng
2023-10-04 14:56           ` Konstantin Shelekhin
2023-10-04 15:49             ` Andreas Hindborg (Samsung)
2023-10-05  6:32       ` Trevor Gross
2023-09-12  5:14 ` [PATCH v4 0/7] rust: workqueue: add bindings for the workqueue Boqun Feng
2023-09-25 19:49 ` Tejun Heo

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=87y1hvtnsi.fsf@samsung.com \
    --to=a.hindborg@samsung.com \
    --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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox