vmstate: add qom interface to get id

Add an interface to get the instance id, instead of depending on
Device and qdev_get_dev_path().

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
This commit is contained in:
Marc-André Lureau 2019-08-28 16:00:19 +04:00
parent b0b74e1f17
commit 107b59698f
8 changed files with 85 additions and 0 deletions

View File

@ -2196,6 +2196,8 @@ Migration
M: Juan Quintela <quintela@redhat.com> M: Juan Quintela <quintela@redhat.com>
M: Dr. David Alan Gilbert <dgilbert@redhat.com> M: Dr. David Alan Gilbert <dgilbert@redhat.com>
S: Maintained S: Maintained
F: hw/core/vmstate-if.c
F: include/hw/vmstate-if.h
F: include/migration/ F: include/migration/
F: migration/ F: migration/
F: scripts/vmstate-static-checker.py F: scripts/vmstate-static-checker.py

View File

@ -9,6 +9,7 @@ common-obj-y += hotplug.o
common-obj-$(CONFIG_SOFTMMU) += nmi.o common-obj-$(CONFIG_SOFTMMU) += nmi.o
common-obj-$(CONFIG_SOFTMMU) += vm-change-state-handler.o common-obj-$(CONFIG_SOFTMMU) += vm-change-state-handler.o
common-obj-y += cpu.o common-obj-y += cpu.o
common-obj-y += vmstate-if.o
common-obj-$(CONFIG_EMPTY_SLOT) += empty_slot.o common-obj-$(CONFIG_EMPTY_SLOT) += empty_slot.o
common-obj-$(CONFIG_XILINX_AXI) += stream.o common-obj-$(CONFIG_XILINX_AXI) += stream.o

View File

@ -1087,9 +1087,18 @@ static void device_unparent(Object *obj)
} }
} }
static char *
device_vmstate_if_get_id(VMStateIf *obj)
{
DeviceState *dev = DEVICE(obj);
return qdev_get_dev_path(dev);
}
static void device_class_init(ObjectClass *class, void *data) static void device_class_init(ObjectClass *class, void *data)
{ {
DeviceClass *dc = DEVICE_CLASS(class); DeviceClass *dc = DEVICE_CLASS(class);
VMStateIfClass *vc = VMSTATE_IF_CLASS(class);
class->unparent = device_unparent; class->unparent = device_unparent;
@ -1101,6 +1110,7 @@ static void device_class_init(ObjectClass *class, void *data)
*/ */
dc->hotpluggable = true; dc->hotpluggable = true;
dc->user_creatable = true; dc->user_creatable = true;
vc->get_id = device_vmstate_if_get_id;
} }
void device_class_set_parent_reset(DeviceClass *dc, void device_class_set_parent_reset(DeviceClass *dc,
@ -1158,6 +1168,10 @@ static const TypeInfo device_type_info = {
.class_init = device_class_init, .class_init = device_class_init,
.abstract = true, .abstract = true,
.class_size = sizeof(DeviceClass), .class_size = sizeof(DeviceClass),
.interfaces = (InterfaceInfo[]) {
{ TYPE_VMSTATE_IF },
{ }
}
}; };
static void qdev_register_types(void) static void qdev_register_types(void)

23
hw/core/vmstate-if.c Normal file
View File

@ -0,0 +1,23 @@
/*
* VMState interface
*
* Copyright (c) 2009-2019 Red Hat Inc
* This work is licensed under the terms of the GNU GPL, version 2 or later.
* See the COPYING file in the top-level directory.
*/
#include "qemu/osdep.h"
#include "hw/vmstate-if.h"
static const TypeInfo vmstate_if_info = {
.name = TYPE_VMSTATE_IF,
.parent = TYPE_INTERFACE,
.class_size = sizeof(VMStateIfClass),
};
static void vmstate_register_types(void)
{
type_register_static(&vmstate_if_info);
}
type_init(vmstate_register_types);

40
include/hw/vmstate-if.h Normal file
View File

@ -0,0 +1,40 @@
/*
* VMState interface
*
* Copyright (c) 2009-2019 Red Hat Inc
* This work is licensed under the terms of the GNU GPL, version 2 or later.
* See the COPYING file in the top-level directory.
*/
#ifndef VMSTATE_IF_H
#define VMSTATE_IF_H
#include "qom/object.h"
#define TYPE_VMSTATE_IF "vmstate-if"
#define VMSTATE_IF_CLASS(klass) \
OBJECT_CLASS_CHECK(VMStateIfClass, (klass), TYPE_VMSTATE_IF)
#define VMSTATE_IF_GET_CLASS(obj) \
OBJECT_GET_CLASS(VMStateIfClass, (obj), TYPE_VMSTATE_IF)
#define VMSTATE_IF(obj) \
INTERFACE_CHECK(VMStateIf, (obj), TYPE_VMSTATE_IF)
typedef struct VMStateIf VMStateIf;
typedef struct VMStateIfClass {
InterfaceClass parent_class;
char * (*get_id)(VMStateIf *obj);
} VMStateIfClass;
static inline char *vmstate_if_get_id(VMStateIf *vmif)
{
if (!vmif) {
return NULL;
}
return VMSTATE_IF_GET_CLASS(vmif)->get_id(vmif);
}
#endif /* VMSTATE_IF_H */

View File

@ -14,6 +14,8 @@
#ifndef MIGRATION_REGISTER_H #ifndef MIGRATION_REGISTER_H
#define MIGRATION_REGISTER_H #define MIGRATION_REGISTER_H
#include "hw/vmstate-if.h"
typedef struct SaveVMHandlers { typedef struct SaveVMHandlers {
/* This runs inside the iothread lock. */ /* This runs inside the iothread lock. */
SaveStateHandler *save_state; SaveStateHandler *save_state;

View File

@ -27,6 +27,8 @@
#ifndef QEMU_VMSTATE_H #ifndef QEMU_VMSTATE_H
#define QEMU_VMSTATE_H #define QEMU_VMSTATE_H
#include "hw/vmstate-if.h"
typedef struct VMStateInfo VMStateInfo; typedef struct VMStateInfo VMStateInfo;
typedef struct VMStateField VMStateField; typedef struct VMStateField VMStateField;

View File

@ -579,6 +579,7 @@ tests/test-qdev-global-props$(EXESUF): tests/test-qdev-global-props.o \
hw/core/irq.o \ hw/core/irq.o \
hw/core/fw-path-provider.o \ hw/core/fw-path-provider.o \
hw/core/reset.o \ hw/core/reset.o \
hw/core/vmstate-if.o \
$(test-qapi-obj-y) $(test-qapi-obj-y)
tests/test-vmstate$(EXESUF): tests/test-vmstate.o \ tests/test-vmstate$(EXESUF): tests/test-vmstate.o \
migration/vmstate.o migration/vmstate-types.o migration/qemu-file.o \ migration/vmstate.o migration/vmstate-types.o migration/qemu-file.o \