Skip to content

Commit

Permalink
migration: Move check_migratable() into qdev.c
Browse files Browse the repository at this point in the history
The function is only used once, and nothing else in migration knows
about objects.  Create the function vmstate_device_is_migratable() in
savem.c that really do the bit that is related with migration.

Signed-off-by: Juan Quintela <[email protected]>
Reviewed-by: Peter Xu <[email protected]>
  • Loading branch information
Juan Quintela committed May 17, 2017
1 parent bac3b21 commit 1bfe5f0
Show file tree
Hide file tree
Showing 7 changed files with 31 additions and 29 deletions.
20 changes: 16 additions & 4 deletions hw/core/qdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
#include "hw/boards.h"
#include "hw/sysbus.h"
#include "qapi-event.h"
#include "migration/migration.h"
#include "migration/vmstate.h"

bool qdev_hotplug = false;
static bool qdev_hot_added = false;
Expand Down Expand Up @@ -861,6 +861,20 @@ static bool device_get_realized(Object *obj, Error **errp)
return dev->realized;
}

static bool check_only_migratable(Object *obj, Error **err)
{
DeviceClass *dc = DEVICE_GET_CLASS(obj);

if (!vmstate_check_only_migratable(dc->vmsd)) {
error_setg(err, "Device %s is not migratable, but "
"--only-migratable was specified",
object_get_typename(obj));
return false;
}

return true;
}

static void device_set_realized(Object *obj, bool value, Error **errp)
{
DeviceState *dev = DEVICE(obj);
Expand All @@ -870,16 +884,14 @@ static void device_set_realized(Object *obj, bool value, Error **errp)
Error *local_err = NULL;
bool unattached_parent = false;
static int unattached_count;
int ret;

if (dev->hotplugged && !dc->hotpluggable) {
error_setg(errp, QERR_DEVICE_NO_HOTPLUG, object_get_typename(obj));
return;
}

if (value && !dev->realized) {
ret = check_migratable(obj, &local_err);
if (ret < 0) {
if (!check_only_migratable(obj, &local_err)) {
goto fail;
}

Expand Down
6 changes: 0 additions & 6 deletions include/migration/migration.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@
#include "qapi-types.h"
#include "exec/cpu-common.h"
#include "qemu/coroutine_int.h"
#include "qom/object.h"

#define QEMU_VM_FILE_MAGIC 0x5145564d
#define QEMU_VM_FILE_VERSION_COMPAT 0x00000002
Expand All @@ -39,9 +38,6 @@
#define QEMU_VM_COMMAND 0x08
#define QEMU_VM_SECTION_FOOTER 0x7e

/* for vl.c */
extern int only_migratable;

struct MigrationParams {
bool blk;
bool shared;
Expand Down Expand Up @@ -253,8 +249,6 @@ int ram_discard_range(const char *block_name, uint64_t start, size_t length);
int ram_postcopy_incoming_init(MigrationIncomingState *mis);
void ram_postcopy_migrated_memory_release(MigrationState *ms);

int check_migratable(Object *obj, Error **err);

bool migrate_release_ram(void);
bool migrate_postcopy_ram(void);
bool migrate_zero_blocks(void);
Expand Down
2 changes: 2 additions & 0 deletions include/migration/vmstate.h
Original file line number Diff line number Diff line change
Expand Up @@ -1067,4 +1067,6 @@ int64_t self_announce_delay(int round)

void dump_vmstate_json_to_file(FILE *out_fp);

bool vmstate_check_only_migratable(const VMStateDescription *vmsd);

#endif
2 changes: 1 addition & 1 deletion include/sysemu/sysemu.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
/* vl.c */

extern const char *bios_name;

extern int only_migratable;
extern const char *qemu_name;
extern QemuUUID qemu_uuid;
extern bool qemu_uuid_set;
Expand Down
15 changes: 0 additions & 15 deletions migration/migration.c
Original file line number Diff line number Diff line change
Expand Up @@ -1143,21 +1143,6 @@ void migrate_del_blocker(Error *reason)
migration_blockers = g_slist_remove(migration_blockers, reason);
}

int check_migratable(Object *obj, Error **err)
{
DeviceClass *dc = DEVICE_GET_CLASS(obj);
if (only_migratable && dc->vmsd) {
if (dc->vmsd->unmigratable) {
error_setg(err, "Device %s is not migratable, but "
"--only-migratable was specified",
object_get_typename(obj));
return -1;
}
}

return 0;
}

void qmp_migrate_incoming(const char *uri, Error **errp)
{
Error *local_err = NULL;
Expand Down
10 changes: 10 additions & 0 deletions migration/savevm.c
Original file line number Diff line number Diff line change
Expand Up @@ -2317,3 +2317,13 @@ void vmstate_register_ram_global(MemoryRegion *mr)
{
vmstate_register_ram(mr, NULL);
}

bool vmstate_check_only_migratable(const VMStateDescription *vmsd)
{
/* check needed if --only-migratable is specified */
if (!only_migratable) {
return true;
}

return !(vmsd && vmsd->unmigratable);
}
5 changes: 2 additions & 3 deletions stubs/vmstate.c
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
#include "qemu/osdep.h"
#include "qemu-common.h"
#include "migration/vmstate.h"
#include "migration/migration.h"

const VMStateDescription vmstate_dummy = {};

Expand All @@ -21,7 +20,7 @@ void vmstate_unregister(DeviceState *dev,
{
}

int check_migratable(Object *obj, Error **err)
bool vmstate_check_only_migratable(const VMStateDescription *vmsd)
{
return 0;
return true;
}

0 comments on commit 1bfe5f0

Please sign in to comment.