[RFC PATCH 08/10] hw/misc/vmcoreinfo: Implement 'vmcore-info' object

Philippe Mathieu-Daudé posted 10 patches 2 days, 10 hours ago
There is a newer version of this series
[RFC PATCH 08/10] hw/misc/vmcoreinfo: Implement 'vmcore-info' object
Posted by Philippe Mathieu-Daudé 2 days, 10 hours ago
'vmcore-info' object allow to transition from '-device'
to 'object', following the deprecation process.

No need to modify VMCoreInfoState since DeviceState
already inherits from Object state.

Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
 include/hw/misc/vmcoreinfo.h |  4 ++-
 hw/misc/vmcoreinfo.c         | 48 +++++++++++++++++++++++++++++++++++-
 2 files changed, 50 insertions(+), 2 deletions(-)

diff --git a/include/hw/misc/vmcoreinfo.h b/include/hw/misc/vmcoreinfo.h
index 122c69686b0..d4cce42cee6 100644
--- a/include/hw/misc/vmcoreinfo.h
+++ b/include/hw/misc/vmcoreinfo.h
@@ -16,8 +16,10 @@
 #include "standard-headers/linux/qemu_fw_cfg.h"
 #include "qom/object.h"
 
+#define TYPE_VMCOREINFO "vmcore-info"
+OBJECT_DECLARE_SIMPLE_TYPE(VMCoreInfoState, VMCOREINFO)
+
 #define TYPE_VMCOREINFO_DEVICE "vmcoreinfo"
-typedef struct VMCoreInfoState VMCoreInfoState;
 DECLARE_INSTANCE_CHECKER(VMCoreInfoState, VMCOREINFO_DEVICE,
                          TYPE_VMCOREINFO_DEVICE)
 
diff --git a/hw/misc/vmcoreinfo.c b/hw/misc/vmcoreinfo.c
index a0511ea0da4..e2258e08fb1 100644
--- a/hw/misc/vmcoreinfo.c
+++ b/hw/misc/vmcoreinfo.c
@@ -12,11 +12,11 @@
 
 #include "qemu/osdep.h"
 #include "qapi/error.h"
-#include "qemu/module.h"
 #include "sysemu/reset.h"
 #include "hw/nvram/fw_cfg.h"
 #include "migration/vmstate.h"
 #include "hw/misc/vmcoreinfo.h"
+#include "qom/object_interfaces.h"
 
 static const VMStateDescription vmstate_vmcoreinfo = {
     .name = "vmcoreinfo",
@@ -32,6 +32,11 @@ static const VMStateDescription vmstate_vmcoreinfo = {
     },
 };
 
+static char *vmcoreinfo_get_vmstate_id(VMStateIf *vmif)
+{
+    return g_strdup(TYPE_VMCOREINFO);
+}
+
 static void fw_cfg_vmci_write(void *opaque, off_t offset, size_t len)
 {
     VMCoreInfoState *s = opaque;
@@ -88,6 +93,32 @@ static void vmcoreinfo_device_realize(DeviceState *dev, Error **errp)
     vmcoreinfo_realize(VMCOREINFO_DEVICE(dev), errp);
 }
 
+static bool vmcoreinfo_can_be_deleted(UserCreatable *uc)
+{
+    return false;
+}
+
+static void vmcoreinfo_complete(UserCreatable *uc, Error **errp)
+{
+    if (vmstate_register_any(VMSTATE_IF(uc), &vmstate_vmcoreinfo, uc) < 0) {
+        error_setg(errp, "%s: Failed to register vmstate", TYPE_VMCOREINFO);
+    }
+
+    vmcoreinfo_realize(VMCOREINFO(uc), errp);
+}
+
+static void vmcoreinfo_class_init(ObjectClass *oc, void *data)
+{
+    UserCreatableClass *ucc = USER_CREATABLE_CLASS(oc);
+    VMStateIfClass *vc = VMSTATE_IF_CLASS(oc);
+    ResettableClass *rc = RESETTABLE_CLASS(oc);
+
+    ucc->complete = vmcoreinfo_complete;
+    ucc->can_be_deleted = vmcoreinfo_can_be_deleted;
+    vc->get_id = vmcoreinfo_get_vmstate_id;
+    rc->phases.hold = vmcoreinfo_reset_hold;
+}
+
 static void vmcoreinfo_device_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
@@ -106,6 +137,18 @@ static const TypeInfo vmcoreinfo_types[] = {
         .parent         = TYPE_DEVICE,
         .instance_size  = sizeof(VMCoreInfoState),
         .class_init     = vmcoreinfo_device_class_init,
+    },
+    {
+        .name           = TYPE_VMCOREINFO,
+        .parent         = TYPE_OBJECT,
+        .instance_size  = sizeof(VMCoreInfoState),
+        .class_init     = vmcoreinfo_class_init,
+        .interfaces = (InterfaceInfo[]) {
+            { TYPE_RESETTABLE_INTERFACE },
+            { TYPE_USER_CREATABLE },
+            { TYPE_VMSTATE_IF },
+            { }
+        }
     }
 };
 
@@ -116,6 +159,9 @@ VMCoreInfoState *vmcoreinfo_find(void)
     Object *obj;
 
     obj = object_resolve_path_type("", TYPE_VMCOREINFO_DEVICE, NULL);
+    if (!obj) {
+        obj = object_resolve_path_type("", TYPE_VMCOREINFO, NULL);
+    }
 
     return obj ? (VMCoreInfoState *)obj : NULL;
 }
-- 
2.47.1
Re: [RFC PATCH 08/10] hw/misc/vmcoreinfo: Implement 'vmcore-info' object
Posted by Marc-André Lureau 1 day, 16 hours ago
Hi

On Thu, Dec 19, 2024 at 7:39 PM Philippe Mathieu-Daudé
<philmd@linaro.org> wrote:
>
> 'vmcore-info' object allow to transition from '-device'
> to 'object', following the deprecation process.
>

Is there a strong motivation behind this? just replacing -device with
-object doesn't really give anything, does it?

Also I'd rather keep the name "vmcoreinfo" since that's how it used to
be, and also the name used by the kernel ELF etc.

> No need to modify VMCoreInfoState since DeviceState
> already inherits from Object state.
>
> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
> ---
>  include/hw/misc/vmcoreinfo.h |  4 ++-
>  hw/misc/vmcoreinfo.c         | 48 +++++++++++++++++++++++++++++++++++-
>  2 files changed, 50 insertions(+), 2 deletions(-)
>
> diff --git a/include/hw/misc/vmcoreinfo.h b/include/hw/misc/vmcoreinfo.h
> index 122c69686b0..d4cce42cee6 100644
> --- a/include/hw/misc/vmcoreinfo.h
> +++ b/include/hw/misc/vmcoreinfo.h
> @@ -16,8 +16,10 @@
>  #include "standard-headers/linux/qemu_fw_cfg.h"
>  #include "qom/object.h"
>
> +#define TYPE_VMCOREINFO "vmcore-info"
> +OBJECT_DECLARE_SIMPLE_TYPE(VMCoreInfoState, VMCOREINFO)
> +
>  #define TYPE_VMCOREINFO_DEVICE "vmcoreinfo"
> -typedef struct VMCoreInfoState VMCoreInfoState;
>  DECLARE_INSTANCE_CHECKER(VMCoreInfoState, VMCOREINFO_DEVICE,
>                           TYPE_VMCOREINFO_DEVICE)
>
> diff --git a/hw/misc/vmcoreinfo.c b/hw/misc/vmcoreinfo.c
> index a0511ea0da4..e2258e08fb1 100644
> --- a/hw/misc/vmcoreinfo.c
> +++ b/hw/misc/vmcoreinfo.c
> @@ -12,11 +12,11 @@
>
>  #include "qemu/osdep.h"
>  #include "qapi/error.h"
> -#include "qemu/module.h"
>  #include "sysemu/reset.h"
>  #include "hw/nvram/fw_cfg.h"
>  #include "migration/vmstate.h"
>  #include "hw/misc/vmcoreinfo.h"
> +#include "qom/object_interfaces.h"
>
>  static const VMStateDescription vmstate_vmcoreinfo = {
>      .name = "vmcoreinfo",
> @@ -32,6 +32,11 @@ static const VMStateDescription vmstate_vmcoreinfo = {
>      },
>  };
>
> +static char *vmcoreinfo_get_vmstate_id(VMStateIf *vmif)
> +{
> +    return g_strdup(TYPE_VMCOREINFO);
> +}
> +
>  static void fw_cfg_vmci_write(void *opaque, off_t offset, size_t len)
>  {
>      VMCoreInfoState *s = opaque;
> @@ -88,6 +93,32 @@ static void vmcoreinfo_device_realize(DeviceState *dev, Error **errp)
>      vmcoreinfo_realize(VMCOREINFO_DEVICE(dev), errp);
>  }
>
> +static bool vmcoreinfo_can_be_deleted(UserCreatable *uc)
> +{
> +    return false;
> +}
> +
> +static void vmcoreinfo_complete(UserCreatable *uc, Error **errp)
> +{
> +    if (vmstate_register_any(VMSTATE_IF(uc), &vmstate_vmcoreinfo, uc) < 0) {
> +        error_setg(errp, "%s: Failed to register vmstate", TYPE_VMCOREINFO);
> +    }
> +
> +    vmcoreinfo_realize(VMCOREINFO(uc), errp);
> +}
> +
> +static void vmcoreinfo_class_init(ObjectClass *oc, void *data)
> +{
> +    UserCreatableClass *ucc = USER_CREATABLE_CLASS(oc);
> +    VMStateIfClass *vc = VMSTATE_IF_CLASS(oc);
> +    ResettableClass *rc = RESETTABLE_CLASS(oc);
> +
> +    ucc->complete = vmcoreinfo_complete;
> +    ucc->can_be_deleted = vmcoreinfo_can_be_deleted;
> +    vc->get_id = vmcoreinfo_get_vmstate_id;
> +    rc->phases.hold = vmcoreinfo_reset_hold;
> +}
> +
>  static void vmcoreinfo_device_class_init(ObjectClass *klass, void *data)
>  {
>      DeviceClass *dc = DEVICE_CLASS(klass);
> @@ -106,6 +137,18 @@ static const TypeInfo vmcoreinfo_types[] = {
>          .parent         = TYPE_DEVICE,
>          .instance_size  = sizeof(VMCoreInfoState),
>          .class_init     = vmcoreinfo_device_class_init,
> +    },
> +    {
> +        .name           = TYPE_VMCOREINFO,
> +        .parent         = TYPE_OBJECT,
> +        .instance_size  = sizeof(VMCoreInfoState),
> +        .class_init     = vmcoreinfo_class_init,
> +        .interfaces = (InterfaceInfo[]) {
> +            { TYPE_RESETTABLE_INTERFACE },
> +            { TYPE_USER_CREATABLE },
> +            { TYPE_VMSTATE_IF },
> +            { }
> +        }
>      }
>  };
>
> @@ -116,6 +159,9 @@ VMCoreInfoState *vmcoreinfo_find(void)
>      Object *obj;
>
>      obj = object_resolve_path_type("", TYPE_VMCOREINFO_DEVICE, NULL);
> +    if (!obj) {
> +        obj = object_resolve_path_type("", TYPE_VMCOREINFO, NULL);
> +    }
>
>      return obj ? (VMCoreInfoState *)obj : NULL;
>  }
> --
> 2.47.1
>
Re: [RFC PATCH 08/10] hw/misc/vmcoreinfo: Implement 'vmcore-info' object
Posted by Philippe Mathieu-Daudé 1 day, 14 hours ago
On 20/12/24 09:50, Marc-André Lureau wrote:
> Hi
> 
> On Thu, Dec 19, 2024 at 7:39 PM Philippe Mathieu-Daudé
> <philmd@linaro.org> wrote:
>>
>> 'vmcore-info' object allow to transition from '-device'
>> to 'object', following the deprecation process.
>>
> 
> Is there a strong motivation behind this? just replacing -device with
> -object doesn't really give anything, does it?

No. (Daniel mentioned the same on the cover letter:
https://lore.kernel.org/qemu-devel/2ae4799b-f78d-4fde-becb-9ee7f767e8f1@linaro.org/)

Sorry for wasting review cycles.

> Also I'd rather keep the name "vmcoreinfo" since that's how it used to
> be, and also the name used by the kernel ELF etc.
> 
>> No need to modify VMCoreInfoState since DeviceState
>> already inherits from Object state.
>>
>> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
>> ---
>>   include/hw/misc/vmcoreinfo.h |  4 ++-
>>   hw/misc/vmcoreinfo.c         | 48 +++++++++++++++++++++++++++++++++++-
>>   2 files changed, 50 insertions(+), 2 deletions(-)