migration: new cmd MIG_CMD_RECV_BITMAP
Add a new vm command MIG_CMD_RECV_BITMAP to request received bitmap for one ramblock. Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com> Signed-off-by: Peter Xu <peterx@redhat.com> Message-Id: <20180502104740.12123-12-peterx@redhat.com> Signed-off-by: Juan Quintela <quintela@redhat.com>
This commit is contained in:
parent
d96c9e8d78
commit
f25d42253c
@ -81,6 +81,7 @@ enum qemu_vm_cmd {
|
|||||||
were previously sent during
|
were previously sent during
|
||||||
precopy but are dirty. */
|
precopy but are dirty. */
|
||||||
MIG_CMD_PACKAGED, /* Send a wrapped stream within this stream */
|
MIG_CMD_PACKAGED, /* Send a wrapped stream within this stream */
|
||||||
|
MIG_CMD_RECV_BITMAP, /* Request for recved bitmap on dst */
|
||||||
MIG_CMD_MAX
|
MIG_CMD_MAX
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -98,6 +99,7 @@ static struct mig_cmd_args {
|
|||||||
[MIG_CMD_POSTCOPY_RAM_DISCARD] = {
|
[MIG_CMD_POSTCOPY_RAM_DISCARD] = {
|
||||||
.len = -1, .name = "POSTCOPY_RAM_DISCARD" },
|
.len = -1, .name = "POSTCOPY_RAM_DISCARD" },
|
||||||
[MIG_CMD_PACKAGED] = { .len = 4, .name = "PACKAGED" },
|
[MIG_CMD_PACKAGED] = { .len = 4, .name = "PACKAGED" },
|
||||||
|
[MIG_CMD_RECV_BITMAP] = { .len = -1, .name = "RECV_BITMAP" },
|
||||||
[MIG_CMD_MAX] = { .len = -1, .name = "MAX" },
|
[MIG_CMD_MAX] = { .len = -1, .name = "MAX" },
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -956,6 +958,19 @@ void qemu_savevm_send_postcopy_run(QEMUFile *f)
|
|||||||
qemu_savevm_command_send(f, MIG_CMD_POSTCOPY_RUN, 0, NULL);
|
qemu_savevm_command_send(f, MIG_CMD_POSTCOPY_RUN, 0, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void qemu_savevm_send_recv_bitmap(QEMUFile *f, char *block_name)
|
||||||
|
{
|
||||||
|
size_t len;
|
||||||
|
char buf[256];
|
||||||
|
|
||||||
|
trace_savevm_send_recv_bitmap(block_name);
|
||||||
|
|
||||||
|
buf[0] = len = strlen(block_name);
|
||||||
|
memcpy(buf + 1, block_name, len);
|
||||||
|
|
||||||
|
qemu_savevm_command_send(f, MIG_CMD_RECV_BITMAP, len + 1, (uint8_t *)buf);
|
||||||
|
}
|
||||||
|
|
||||||
bool qemu_savevm_state_blocked(Error **errp)
|
bool qemu_savevm_state_blocked(Error **errp)
|
||||||
{
|
{
|
||||||
SaveStateEntry *se;
|
SaveStateEntry *se;
|
||||||
@ -1801,6 +1816,49 @@ static int loadvm_handle_cmd_packaged(MigrationIncomingState *mis)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Handle request that source requests for recved_bitmap on
|
||||||
|
* destination. Payload format:
|
||||||
|
*
|
||||||
|
* len (1 byte) + ramblock_name (<255 bytes)
|
||||||
|
*/
|
||||||
|
static int loadvm_handle_recv_bitmap(MigrationIncomingState *mis,
|
||||||
|
uint16_t len)
|
||||||
|
{
|
||||||
|
QEMUFile *file = mis->from_src_file;
|
||||||
|
RAMBlock *rb;
|
||||||
|
char block_name[256];
|
||||||
|
size_t cnt;
|
||||||
|
|
||||||
|
cnt = qemu_get_counted_string(file, block_name);
|
||||||
|
if (!cnt) {
|
||||||
|
error_report("%s: failed to read block name", __func__);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Validate before using the data */
|
||||||
|
if (qemu_file_get_error(file)) {
|
||||||
|
return qemu_file_get_error(file);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (len != cnt + 1) {
|
||||||
|
error_report("%s: invalid payload length (%d)", __func__, len);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
rb = qemu_ram_block_by_name(block_name);
|
||||||
|
if (!rb) {
|
||||||
|
error_report("%s: block '%s' not found", __func__, block_name);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* TODO: send the bitmap back to source */
|
||||||
|
|
||||||
|
trace_loadvm_handle_recv_bitmap(block_name);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Process an incoming 'QEMU_VM_COMMAND'
|
* Process an incoming 'QEMU_VM_COMMAND'
|
||||||
* 0 just a normal return
|
* 0 just a normal return
|
||||||
@ -1874,6 +1932,9 @@ static int loadvm_process_command(QEMUFile *f)
|
|||||||
|
|
||||||
case MIG_CMD_POSTCOPY_RAM_DISCARD:
|
case MIG_CMD_POSTCOPY_RAM_DISCARD:
|
||||||
return loadvm_postcopy_ram_handle_discard(mis, len);
|
return loadvm_postcopy_ram_handle_discard(mis, len);
|
||||||
|
|
||||||
|
case MIG_CMD_RECV_BITMAP:
|
||||||
|
return loadvm_handle_recv_bitmap(mis, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -47,6 +47,7 @@ int qemu_savevm_send_packaged(QEMUFile *f, const uint8_t *buf, size_t len);
|
|||||||
void qemu_savevm_send_postcopy_advise(QEMUFile *f);
|
void qemu_savevm_send_postcopy_advise(QEMUFile *f);
|
||||||
void qemu_savevm_send_postcopy_listen(QEMUFile *f);
|
void qemu_savevm_send_postcopy_listen(QEMUFile *f);
|
||||||
void qemu_savevm_send_postcopy_run(QEMUFile *f);
|
void qemu_savevm_send_postcopy_run(QEMUFile *f);
|
||||||
|
void qemu_savevm_send_recv_bitmap(QEMUFile *f, char *block_name);
|
||||||
|
|
||||||
void qemu_savevm_send_postcopy_ram_discard(QEMUFile *f, const char *name,
|
void qemu_savevm_send_postcopy_ram_discard(QEMUFile *f, const char *name,
|
||||||
uint16_t len,
|
uint16_t len,
|
||||||
|
@ -12,6 +12,7 @@ loadvm_state_cleanup(void) ""
|
|||||||
loadvm_handle_cmd_packaged(unsigned int length) "%u"
|
loadvm_handle_cmd_packaged(unsigned int length) "%u"
|
||||||
loadvm_handle_cmd_packaged_main(int ret) "%d"
|
loadvm_handle_cmd_packaged_main(int ret) "%d"
|
||||||
loadvm_handle_cmd_packaged_received(int ret) "%d"
|
loadvm_handle_cmd_packaged_received(int ret) "%d"
|
||||||
|
loadvm_handle_recv_bitmap(char *s) "%s"
|
||||||
loadvm_postcopy_handle_advise(void) ""
|
loadvm_postcopy_handle_advise(void) ""
|
||||||
loadvm_postcopy_handle_listen(void) ""
|
loadvm_postcopy_handle_listen(void) ""
|
||||||
loadvm_postcopy_handle_run(void) ""
|
loadvm_postcopy_handle_run(void) ""
|
||||||
@ -34,6 +35,7 @@ savevm_send_open_return_path(void) ""
|
|||||||
savevm_send_ping(uint32_t val) "0x%x"
|
savevm_send_ping(uint32_t val) "0x%x"
|
||||||
savevm_send_postcopy_listen(void) ""
|
savevm_send_postcopy_listen(void) ""
|
||||||
savevm_send_postcopy_run(void) ""
|
savevm_send_postcopy_run(void) ""
|
||||||
|
savevm_send_recv_bitmap(char *name) "%s"
|
||||||
savevm_state_setup(void) ""
|
savevm_state_setup(void) ""
|
||||||
savevm_state_header(void) ""
|
savevm_state_header(void) ""
|
||||||
savevm_state_iterate(void) ""
|
savevm_state_iterate(void) ""
|
||||||
|
Loading…
Reference in New Issue
Block a user