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 06/10] rust: add bindings for timer
Date: Fri, 7 Feb 2025 21:33:52 +0800 [thread overview]
Message-ID: <Z6YLwAqDGm+9aiaM@intel.com> (raw)
In-Reply-To: <a30bfa1c-ddb8-4a5b-9f95-7b000c11cd54@redhat.com>
> > +pub use bindings::QEMUTimer;
> > +
> > +use crate::{
> > + bindings::{
> > + self, qemu_clock_get_ns, timer_del, timer_init_full, timer_mod, QEMUClockType,
> > + QEMUTimerListGroup,
> > + },
> > + callbacks::FnCall,
> > +};
> > +
> > +impl QEMUTimer {
> > + pub fn new() -> Self {
> > + Default::default()
> > + }
> > +
> > + pub fn timer_init_full<'timer, 'opaque: 'timer, T, F>(
>
> General question - should the names:
>
> - include the "timer" part, matching QEMU C code, or exclude it to avoid
> repetition? I would say remove it,
I agree and I would name it "init()" instead of "init_full()".
> but I'm open to suggestions and other
> opinions
>
> - include the "QEMU" part? I'd say remove it, similar to ClockType below
> that is:
>
> -pub use bindings::QEMUTimer;
> +pub use bindings::QEMUTimer as Timer;
> +pub use bindings::QEMUTimerList as TimerList;
> +pub use bindings::QEMUTimerListGroup as TimerListGroup;
I notice you've picked another way for IRQState, so I could follow that
like:
pub type Timer = bindings::QEMUTimer;
This style make it easy to add doc (timer binding currently lacks
doc, but I will add it as much as possible).
Another option may be to wrap QEMUTimer as what MemoryRegionOps did, but
timer has only 1 callback so I think it's not necessary.
> > + &'timer mut self,
> > + timer_list_group: Option<&QEMUTimerListGroup>,
> > + clk_type: QEMUClockType,
>
> Please take a ClockType instead.
Sure.
> > + scale: u32,
> > + attributes: u32,
> > + _f: F,
> > + opaque: &'opaque T,
> > + ) where
> > + F: for<'a> FnCall<(&'a T,)>,
> > + {
> > + /// timer expiration callback
> > + unsafe extern "C" fn rust_timer_handler<T, F: for<'a> FnCall<(&'a T,)>>(
> > + opaque: *mut c_void,
> > + ) {
> > + // SAFETY: the opaque was passed as a reference to `T`.
> > + F::call((unsafe { &*(opaque.cast::<T>()) },))
> > + }
>
> Please add "let _: () = F::ASSERT_IS_SOME;", which is added by the
> qdev_init_clock_in() patch.
Sure. Added it to the beginning of this function.
> > + let timer_cb: unsafe extern "C" fn(*mut c_void) = rust_timer_handler::<T, F>;
> > +
> > + // SAFETY: the opaque outlives the timer
> > + unsafe {
> > + timer_init_full(
> > + self,
> > + if let Some(g) = timer_list_group {
> > + g as *const QEMUTimerListGroup as *mut QEMUTimerListGroup
> > + } else {
> > + ::core::ptr::null_mut()
> > + },
> > + clk_type,
> > + scale as c_int,
> > + attributes as c_int,
> > + Some(timer_cb),
> > + (opaque as *const T).cast::<c_void>() as *mut c_void,
> > + )
> > + }
> > + }
> > +
> > + pub fn timer_mod(&mut self, expire_time: u64) {
> > + unsafe { timer_mod(self as *mut QEMUTimer, expire_time as i64) }
> > + }
>
> This can take &self, because timers are thread-safe:
>
> pub fn timer_mod(&self, expire_time: u64) {
> unsafe { timer_mod(self.as_mut_ptr(), expire_time as i64) }
> }
timer_mod means "modify a timer", so I'd rename this method to "modify"
> const fn as_mut_ptr(&self) -> *mut Self {
> self as *const QEMUTimer as *mut _
> }
Thanks!
> > +}
> > +
> > +impl Drop for QEMUTimer {
> > + fn drop(&mut self) {
> > + unsafe { timer_del(self as *mut QEMUTimer) }
> > + }
>
> timer_del() can be useful even outside Drop, so
>
> pub fn timer_del(&self) {
> unsafe { timer_del(self.as_mut_ptr()) }
> }
>
> and just use self.timer_del() here.
OK, will also rename "timer_del" to "delete".
> > +}
> > +
> > +pub fn qemu_clock_get_virtual_ns() -> u64 {
> > + // SAFETY:
> > + // Valid parameter.
> > + (unsafe { qemu_clock_get_ns(QEMUClockType::QEMU_CLOCK_VIRTUAL) }) as u64
> > +}
>
> Not needed.
Yes!
> > +pub struct ClockType {
> > + pub id: QEMUClockType,
> > +}
>
> The field does not have to be "pub" (maybe "pub(self)", I'm not sure
> offhand).
>
You're right! Making it private is enough, since I should also make
timer_init_full accept ClockType instead of QEMUClockType.
Thanks,
Zhao
next prev parent reply other threads:[~2025-02-07 13:14 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 [this message]
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
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=Z6YLwAqDGm+9aiaM@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 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.