From: Zhao Liu <zhao1.liu@intel.com>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: "Manos Pitsidianakis" <manos.pitsidianakis@linaro.org>,
"Junjie Mao" <junjie.mao@hotmail.com>,
"Alex Bennée" <alex.bennee@linaro.org>,
"Philippe Mathieu-Daudé" <philmd@linaro.org>,
"Richard Henderson" <richard.henderson@linaro.org>,
"Peter Maydell" <peter.maydell@linaro.org>,
"Daniel P . Berrangé" <berrange@redhat.com>,
qemu-devel@nongnu.org, qemu-rust@nongnu.org
Subject: Re: [PATCH 08/10] rust/timer/hpet: add basic HPET timer and HPETState
Date: Sat, 8 Feb 2025 16:19:58 +0800 [thread overview]
Message-ID: <Z6cTrkww4n9lPe2X@intel.com> (raw)
In-Reply-To: <b9ce64fa-b2b8-4f61-8380-9ec582936b26@redhat.com>
On Wed, Jan 29, 2025 at 11:57:18AM +0100, Paolo Bonzini wrote:
> Date: Wed, 29 Jan 2025 11:57:18 +0100
> From: Paolo Bonzini <pbonzini@redhat.com>
> Subject: Re: [PATCH 08/10] rust/timer/hpet: add basic HPET timer and
> HPETState
>
>
>
> On Sat, Jan 25, 2025 at 1:32 PM Zhao Liu <zhao1.liu@intel.com> wrote:
> > +// Register space for each timer block. (HPET_BASE isn't defined here.)
> > +const HPET_REG_SPACE_LEN: u64 = 0x400; // 1024 bytes
>
> Use doc comments "///"...
OK,
> > +// Timer N FSB Interrupt Route Register (masked by 0x18)
> > +const HPET_TN_FSB_ROUTE_REG: u64 = 0x010;
>
> ... all the way to here.
Done.
> > +/// HPET Timer Abstraction
> > +#[repr(C)]
> > +#[derive(Debug, Default, qemu_api_macros::offsets)]
> > +pub struct HPETTimer {
> > + /// timer N index within the timer block (HPETState)
> > + #[doc(alias = "tn")]
> > + index: usize,
> > + qemu_timer: Option<Box<QEMUTimer>>,
> > + /// timer block abstraction containing this timer
> > + state: Option<NonNull<HPETState>>,
> > +
> > + /// Memory-mapped, software visible timer registers
>
> These "headings" cannot be doc comments, because they would be attached
> to the field after. Same below:
>
> - /// Hidden register state
> + // Hidden register state
>
> - /// HPET block Registers: Memory-mapped, software visible registers
> + // HPET block Registers: Memory-mapped, software visible registers
>
> - /// Internal state
> + // Internal state
Fixed. Thanks!
> > + fn get_state(&self) -> &HPETState {
> > + // SAFETY:
> > + // the pointer is convertible to a reference
> > + unsafe { self.state.unwrap().as_ref() }
> > + }
>
> Note for the future: I looked briefly into why a NonNull<> is needed
> and the reasons are two. First, the offset_of! replacement does not
> support lifetime parameters. Second, it's messy to pass a &HPETState
> to the &HPETTimer, because the HPETTimer still has to be written into
> the HPETState.
Yes, and the second use would be a common case in practice. So maybe we
need some wrapper on this, to provide someting like HPETTimer::get_state(),
which returns a reference of the parent structure.
In addition, for underlying library, NonNull<> is nice thinks to its low
overhead. But for device implementation, I'm not sure if it's the good
choice. Rust uses RefCell<Weak<>> (for QEMU, it could be BqlRefCell<Weak<>>)
to handle this cycle reference case.
As I mentioned in RFC,
The device instance is not created in Rust side, and there's
only init() method to initialize created device instance. This
way, it's hard to be compatible with the pattern of creating
weak references (at least I failed).
To address this issue, the method `from` or `from_raw` seems necessary,
like `Owned::from`, but it's tricky... So I don't have a good idea to
replace NonNull<> yet!
> This may be worth revisiting when QEMU starts using
> pinned-init is added, but for now is self-contained.
>
> > + if let Some(timer) = self.qemu_timer.as_mut() {
> > + timer.timer_mod(self.last);
> > + }
>
> I think this can be just "timer.unwrap().timer_mod(self.last)" (not
> sure if it needs an as_ref() too).
>
Yes, it needs as_ref(). A direct unwrap() consumes the Some() since
inter type of qemu_timer (Box<Timer>) is non-`Copy`.
Another example is
fn get_state(&self) -> &HPETState {
// SAFETY:
// the pointer is convertible to a reference
unsafe { self.state.unwrap().as_ref() }
}
Because the state (Option<NonNull<HPETState>>) has `Copy` so that this
case doesn't need as_ref before unwrap.
Thanks,
Zhao
next prev parent reply other threads:[~2025-02-08 8:03 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-01-25 12:51 [PATCH 00/10] rust: Add HPET timer device Zhao Liu
2025-01-25 12:51 ` [PATCH 01/10] i386/fw_cfg: move hpet_cfg definition to hpet.c Zhao Liu
2025-01-25 12:51 ` [PATCH 02/10] rust/qdev: add the macro to define bit property Zhao Liu
2025-01-25 12:51 ` [PATCH 03/10] rust/irq: Add a helper to convert [InterruptSource] to [*mut IRQState] Zhao Liu
2025-01-29 10:51 ` Paolo Bonzini
2025-02-07 7:10 ` Zhao Liu
2025-02-07 7:44 ` Zhao Liu
2025-02-07 9:57 ` Paolo Bonzini
2025-02-08 11:14 ` Zhao Liu
2025-02-08 11:39 ` Paolo Bonzini
2025-02-08 18:10 ` Zhao Liu
2025-01-25 12:51 ` [PATCH 04/10] rust: add bindings for gpio_{in|out} initialization Zhao Liu
2025-01-29 10:59 ` Paolo Bonzini
2025-02-07 8:43 ` Zhao Liu
2025-02-07 9:54 ` Paolo Bonzini
2025-02-08 11:16 ` Zhao Liu
2025-01-25 12:51 ` [PATCH 05/10] rust: add bindings for memattrs Zhao Liu
2025-01-25 12:51 ` [PATCH 06/10] rust: add bindings for timer Zhao Liu
2025-01-29 10:58 ` Paolo Bonzini
2025-02-07 13:33 ` Zhao Liu
2025-02-07 14:55 ` Paolo Bonzini
2025-02-08 11:08 ` Zhao Liu
2025-01-25 12:51 ` [PATCH 07/10] rust/timer/hpet: define hpet_cfg Zhao Liu
2025-01-29 10:58 ` Paolo Bonzini
2025-02-07 14:30 ` Zhao Liu
2025-01-25 12:51 ` [PATCH 08/10] rust/timer/hpet: add basic HPET timer and HPETState Zhao Liu
2025-01-29 10:57 ` Paolo Bonzini
2025-02-08 8:19 ` Zhao Liu [this message]
2025-01-25 12:51 ` [PATCH 09/10] rust/timer/hpet: add qom and qdev APIs support Zhao Liu
2025-01-29 10:58 ` Paolo Bonzini
2025-02-08 10:55 ` Zhao Liu
2025-02-08 11:41 ` Paolo Bonzini
2025-02-08 18:06 ` Zhao Liu
2025-01-25 12:51 ` [PATCH 10/10] i386: enable rust hpet for pc when rust is enabled Zhao Liu
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=Z6cTrkww4n9lPe2X@intel.com \
--to=zhao1.liu@intel.com \
--cc=alex.bennee@linaro.org \
--cc=berrange@redhat.com \
--cc=junjie.mao@hotmail.com \
--cc=manos.pitsidianakis@linaro.org \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=philmd@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=qemu-rust@nongnu.org \
--cc=richard.henderson@linaro.org \
/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;
as well as URLs for NNTP newsgroup(s).