Skip to content

Commit

Permalink
vmstate: add qom interface to get id
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
elmarco committed Jan 6, 2020
1 parent b0b74e1 commit 107b596
Show file tree
Hide file tree
Showing 8 changed files with 85 additions and 0 deletions.
2 changes: 2 additions & 0 deletions MAINTAINERS
Expand Up @@ -2196,6 +2196,8 @@ Migration
M: Juan Quintela <quintela@redhat.com>
M: Dr. David Alan Gilbert <dgilbert@redhat.com>
S: Maintained
F: hw/core/vmstate-if.c
F: include/hw/vmstate-if.h
F: include/migration/
F: migration/
F: scripts/vmstate-static-checker.py
Expand Down
1 change: 1 addition & 0 deletions hw/core/Makefile.objs
Expand Up @@ -9,6 +9,7 @@ common-obj-y += hotplug.o
common-obj-$(CONFIG_SOFTMMU) += nmi.o
common-obj-$(CONFIG_SOFTMMU) += vm-change-state-handler.o
common-obj-y += cpu.o
common-obj-y += vmstate-if.o

common-obj-$(CONFIG_EMPTY_SLOT) += empty_slot.o
common-obj-$(CONFIG_XILINX_AXI) += stream.o
Expand Down
14 changes: 14 additions & 0 deletions hw/core/qdev.c
Expand Up @@ -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)
{
DeviceClass *dc = DEVICE_CLASS(class);
VMStateIfClass *vc = VMSTATE_IF_CLASS(class);

class->unparent = device_unparent;

Expand All @@ -1101,6 +1110,7 @@ static void device_class_init(ObjectClass *class, void *data)
*/
dc->hotpluggable = true;
dc->user_creatable = true;
vc->get_id = device_vmstate_if_get_id;
}

void device_class_set_parent_reset(DeviceClass *dc,
Expand Down Expand Up @@ -1158,6 +1168,10 @@ static const TypeInfo device_type_info = {
.class_init = device_class_init,
.abstract = true,
.class_size = sizeof(DeviceClass),
.interfaces = (InterfaceInfo[]) {
{ TYPE_VMSTATE_IF },
{ }
}
};

static void qdev_register_types(void)
Expand Down
23 changes: 23 additions & 0 deletions hw/core/vmstate-if.c
@@ -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 changes: 40 additions & 0 deletions include/hw/vmstate-if.h
@@ -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 */
2 changes: 2 additions & 0 deletions include/migration/register.h
Expand Up @@ -14,6 +14,8 @@
#ifndef MIGRATION_REGISTER_H
#define MIGRATION_REGISTER_H

#include "hw/vmstate-if.h"

typedef struct SaveVMHandlers {
/* This runs inside the iothread lock. */
SaveStateHandler *save_state;
Expand Down
2 changes: 2 additions & 0 deletions include/migration/vmstate.h
Expand Up @@ -27,6 +27,8 @@
#ifndef QEMU_VMSTATE_H
#define QEMU_VMSTATE_H

#include "hw/vmstate-if.h"

typedef struct VMStateInfo VMStateInfo;
typedef struct VMStateField VMStateField;

Expand Down
1 change: 1 addition & 0 deletions tests/Makefile.include
Expand Up @@ -579,6 +579,7 @@ tests/test-qdev-global-props$(EXESUF): tests/test-qdev-global-props.o \
hw/core/irq.o \
hw/core/fw-path-provider.o \
hw/core/reset.o \
hw/core/vmstate-if.o \
$(test-qapi-obj-y)
tests/test-vmstate$(EXESUF): tests/test-vmstate.o \
migration/vmstate.o migration/vmstate-types.o migration/qemu-file.o \
Expand Down

0 comments on commit 107b596

Please sign in to comment.