Il ven 1 ago 2025, 17:00 Martin Kletzander <mklet...@redhat.com> ha scritto:

> From: Martin Kletzander <mklet...@redhat.com>
>
> In some cases (e.g. in vmstate_tests.rs) the second argument to
> impl_vmstate_struct! is actually an existing struct which is then
> copied (since VMStateDescription implements Copy) when saved into the
> static VMSD using .get().  That is not a problem because it is part of
> the data segment and the pointers are not being free'd since they point
> to static data.  But it is a problem when tests rely on comparing the
> VMState descriptions as pointers rather than contents.  And it also
> wastes space, more or less.
>
> Introduce second variant of the macro which can, instead of the
> expression, take an identifier or what looks like a reference.  This
> second variant is added before the current variant so that it has
> preference, and only references the existing static data from it.
>
> This way tests are fixed and space is saved.
>
> And now that the VMStateDescription checking is fixed we can also check
> for the right value in test_vmstate_struct_varray_uint8_wrapper().
>
> Signed-off-by: Martin Kletzander <mklet...@redhat.com>
> ---
> I'm not sure whether this is caused by different utility on my system or
> bash
> version or whatever, but without this patch these three tests fail for me
> and
> this patch fixes it.
>

I found something similar, though I wasn't sure if it was broken in master
as well or only in the rust-next branch.

If that works in master as well, I would remove completely the possibility
of using &FOO, and always use .as_ref(). It's more efficient as you said,
and there's no reason that I know to use the less efficient one.

Paolo

 rust/qemu-api/src/vmstate.rs         | 11 +++++++++++
>  rust/qemu-api/tests/vmstate_tests.rs |  1 +
>  2 files changed, 12 insertions(+)
>
> diff --git a/rust/qemu-api/src/vmstate.rs b/rust/qemu-api/src/vmstate.rs
> index b5c6b764fbba..716e52afe740 100644
> --- a/rust/qemu-api/src/vmstate.rs
> +++ b/rust/qemu-api/src/vmstate.rs
> @@ -449,6 +449,17 @@ macro_rules! vmstate_validate {
>  /// description of the struct.
>  #[macro_export]
>  macro_rules! impl_vmstate_struct {
> +    ($type:ty, $(&)?$vmsd:ident) => {
> +        unsafe impl $crate::vmstate::VMState for $type {
> +            const BASE: $crate::bindings::VMStateField =
> +                $crate::bindings::VMStateField {
> +                    vmsd: $vmsd.as_ref(),
> +                    size: ::core::mem::size_of::<$type>(),
> +                    flags: $crate::bindings::VMStateFlags::VMS_STRUCT,
> +                    ..$crate::zeroable::Zeroable::ZERO
> +                };
> +        }
> +    };
>      ($type:ty, $vmsd:expr) => {
>          unsafe impl $crate::vmstate::VMState for $type {
>              const BASE: $crate::bindings::VMStateField = {
> diff --git a/rust/qemu-api/tests/vmstate_tests.rs b/rust/qemu-api/tests/
> vmstate_tests.rs
> index 2c0670ba0eed..7d3180e6c2ea 100644
> --- a/rust/qemu-api/tests/vmstate_tests.rs
> +++ b/rust/qemu-api/tests/vmstate_tests.rs
> @@ -320,6 +320,7 @@ fn test_vmstate_struct_varray_uint8_wrapper() {
>          b"arr_a_wrap\0"
>      );
>      assert_eq!(foo_fields[5].num_offset, 228);
> +    assert_eq!(foo_fields[5].vmsd, VMSTATE_FOOA.as_ref());
>      assert!(unsafe { foo_fields[5].field_exists.unwrap()(foo_b_p, 0) });
>
>      // The last VMStateField in VMSTATE_FOOB.
> --
> 2.50.1
>
>

Reply via email to