From: Paolo Bonzini <pbonzini@redhat.com>
To: Alice Ryhl <aliceryhl@google.com>
Cc: rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org,
boqun.feng@gmail.com, ojeda@kernel.org, benno.lossin@proton.me,
axboe@kernel.dk, tmgross@umich.edu, bjorn3_gh@protonmail.com,
gary@garyguo.net, alex.gaynor@gmail.com, a.hindborg@kernel.org
Subject: Re: [PATCH 2/2] rust: block/mq: replace mem::zeroed() with Zeroable trait
Date: Fri, 29 Nov 2024 14:42:30 +0100 [thread overview]
Message-ID: <f824d57c-6578-47de-9c73-c86c9c9e60b6@redhat.com> (raw)
In-Reply-To: <CAH5fLgi9+d6PwZdU23xcF0p+m6mja3Dx8BufiiM-ZgLtDSqQDw@mail.gmail.com>
On 11/29/24 10:41, Alice Ryhl wrote:
> On Thu, Nov 28, 2024 at 3:13 PM Paolo Bonzini <pbonzini@redhat.com> wrote:
>>
>> Isolate the unsafety in the declaration of the Zeroable trait, instead of having
>> to use "unsafe" just to declare a struct. This is more similar to how you would
>> use "..Default::default()" (which is also a possibility here, but arguably
>> less efficient).
>>
>> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
>> ---
>> rust/kernel/block/mq/gen_disk.rs | 8 +++++---
>> rust/kernel/block/mq/tag_set.rs | 10 ++++++----
>> 2 files changed, 11 insertions(+), 7 deletions(-)
>>
>> diff --git a/rust/kernel/block/mq/gen_disk.rs b/rust/kernel/block/mq/gen_disk.rs
>> index 708125dce96a..65342d065296 100644
>> --- a/rust/kernel/block/mq/gen_disk.rs
>> +++ b/rust/kernel/block/mq/gen_disk.rs
>> @@ -6,7 +6,7 @@
>> //! C header: [`include/linux/blk_mq.h`](srctree/include/linux/blk_mq.h)
>>
>> use crate::block::mq::{raw_writer::RawWriter, Operations, TagSet};
>> -use crate::{bindings, error::from_err_ptr, error::Result, sync::Arc};
>> +use crate::{bindings, error::from_err_ptr, error::Result, init::Zeroable, sync::Arc};
>> use crate::{error, static_lock_class};
>> use core::fmt::{self, Write};
>>
>> @@ -31,6 +31,9 @@ fn default() -> Self {
>> }
>> }
>>
>> +// SAFETY: `bindings::queue_limits` contains only fields that are valid when zeroed.
>> +unsafe impl Zeroable for bindings::queue_limits {}
>> +
>> impl GenDiskBuilder {
>> /// Create a new instance.
>> pub fn new() -> Self {
>> @@ -93,8 +96,7 @@ pub fn build<T: Operations>(
>> name: fmt::Arguments<'_>,
>> tagset: Arc<TagSet<T>>,
>> ) -> Result<GenDisk<T>> {
>> - // SAFETY: `bindings::queue_limits` contain only fields that are valid when zeroed.
>> - let mut lim: bindings::queue_limits = unsafe { core::mem::zeroed() };
>> + let mut lim: bindings::queue_limits = Zeroable::ZERO;
>>
>> lim.logical_block_size = self.logical_block_size;
>> lim.physical_block_size = self.physical_block_size;
>> diff --git a/rust/kernel/block/mq/tag_set.rs b/rust/kernel/block/mq/tag_set.rs
>> index f9a1ca655a35..1ff7366ca549 100644
>> --- a/rust/kernel/block/mq/tag_set.rs
>> +++ b/rust/kernel/block/mq/tag_set.rs
>> @@ -10,6 +10,7 @@
>> bindings,
>> block::mq::{operations::OperationsVTable, request::RequestDataWrapper, Operations},
>> error,
>> + init::Zeroable,
>> prelude::PinInit,
>> try_pin_init,
>> types::Opaque,
>> @@ -32,6 +33,10 @@ pub struct TagSet<T: Operations> {
>> _p: PhantomData<T>,
>> }
>>
>> +// SAFETY: `blk_mq_tag_set` only contains integers and pointers, which
>> +// all are allowed to be 0.
>> +unsafe impl Zeroable for bindings::blk_mq_tag_set {}
>
> This will have to be reverted if we want to split up the kernel crate
> due to the orphan rule.
Ok, I will look into using the bindgen doc comments then. It looks like
the idea is not dead on arrival at least! Thanks for the review.
Paolo
prev parent reply other threads:[~2024-11-29 13:42 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-11-28 14:13 [RFC PATCH 0/2] rust: Zeroable: allow struct update syntax outside init macros Paolo Bonzini
2024-11-28 14:13 ` [PATCH 1/2] " Paolo Bonzini
2024-11-28 14:40 ` Alice Ryhl
2024-11-28 16:43 ` Paolo Bonzini
2024-11-29 9:39 ` Alice Ryhl
2024-11-28 14:13 ` [PATCH 2/2] rust: block/mq: replace mem::zeroed() with Zeroable trait Paolo Bonzini
2024-11-29 9:41 ` Alice Ryhl
2024-11-29 13:42 ` Paolo Bonzini [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=f824d57c-6578-47de-9c73-c86c9c9e60b6@redhat.com \
--to=pbonzini@redhat.com \
--cc=a.hindborg@kernel.org \
--cc=alex.gaynor@gmail.com \
--cc=aliceryhl@google.com \
--cc=axboe@kernel.dk \
--cc=benno.lossin@proton.me \
--cc=bjorn3_gh@protonmail.com \
--cc=boqun.feng@gmail.com \
--cc=gary@garyguo.net \
--cc=linux-kernel@vger.kernel.org \
--cc=ojeda@kernel.org \
--cc=rust-for-linux@vger.kernel.org \
--cc=tmgross@umich.edu \
/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