[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [RFC 21/29] migration: new cmd MIG_CMD_RECV_BITMAP
From: |
Dr. David Alan Gilbert |
Subject: |
Re: [Qemu-devel] [RFC 21/29] migration: new cmd MIG_CMD_RECV_BITMAP |
Date: |
Thu, 3 Aug 2017 10:49:02 +0100 |
User-agent: |
Mutt/1.8.3 (2017-05-23) |
* Peter Xu (address@hidden) wrote:
> Add a new vm command MIG_CMD_RECV_BITMAP to request received bitmap for
> one ramblock.
>
> Signed-off-by: Peter Xu <address@hidden>
> ---
> migration/savevm.c | 59
> ++++++++++++++++++++++++++++++++++++++++++++++++++
> migration/savevm.h | 1 +
> migration/trace-events | 1 +
> 3 files changed, 61 insertions(+)
>
> diff --git a/migration/savevm.c b/migration/savevm.c
> index 386788d..0ab13c0 100644
> --- a/migration/savevm.c
> +++ b/migration/savevm.c
> @@ -78,6 +78,7 @@ enum qemu_vm_cmd {
> were previously sent during
> precopy but are dirty. */
> MIG_CMD_PACKAGED, /* Send a wrapped stream within this stream */
> + MIG_CMD_RECV_BITMAP, /* Request for recved bitmap on dst */
> MIG_CMD_MAX
> };
>
> @@ -95,6 +96,7 @@ static struct mig_cmd_args {
> [MIG_CMD_POSTCOPY_RAM_DISCARD] = {
> .len = -1, .name = "POSTCOPY_RAM_DISCARD"
> },
> [MIG_CMD_PACKAGED] = { .len = 4, .name = "PACKAGED" },
> + [MIG_CMD_RECV_BITMAP] = { .len = -1, .name = "RECV_BITMAP" },
> [MIG_CMD_MAX] = { .len = -1, .name = "MAX" },
> };
>
> @@ -929,6 +931,19 @@ void qemu_savevm_send_postcopy_run(QEMUFile *f)
> 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[512];
Only needs to be 256 bytes?
> + 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)
> {
> SaveStateEntry *se;
> @@ -1705,6 +1720,47 @@ static int
> loadvm_handle_cmd_packaged(MigrationIncomingState *mis)
> }
>
> /*
> + * 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 */
Probably worth adding a trace in this function somewhere.
Other than that;
Reviewed-by: Dr. David Alan Gilbert <address@hidden>
> + return 0;
> +}
> +
> +/*
> * Process an incoming 'QEMU_VM_COMMAND'
> * 0 just a normal return
> * LOADVM_QUIT All good, but exit the loop
> @@ -1777,6 +1833,9 @@ static int loadvm_process_command(QEMUFile *f)
>
> case MIG_CMD_POSTCOPY_RAM_DISCARD:
> return loadvm_postcopy_ram_handle_discard(mis, len);
> +
> + case MIG_CMD_RECV_BITMAP:
> + return loadvm_handle_recv_bitmap(mis, len);
> }
>
> return 0;
> diff --git a/migration/savevm.h b/migration/savevm.h
> index 295c4a1..8126b1c 100644
> --- a/migration/savevm.h
> +++ b/migration/savevm.h
> @@ -46,6 +46,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_listen(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,
> uint16_t len,
> diff --git a/migration/trace-events b/migration/trace-events
> index dbb4971..ca7b43f 100644
> --- a/migration/trace-events
> +++ b/migration/trace-events
> @@ -34,6 +34,7 @@ savevm_send_open_return_path(void) ""
> savevm_send_ping(uint32_t val) "%x"
> savevm_send_postcopy_listen(void) ""
> savevm_send_postcopy_run(void) ""
> +savevm_send_recv_bitmap(char *name) "%s"
> savevm_state_setup(void) ""
> savevm_state_header(void) ""
> savevm_state_iterate(void) ""
> --
> 2.7.4
>
--
Dr. David Alan Gilbert / address@hidden / Manchester, UK
- Re: [Qemu-devel] [RFC 21/29] migration: new cmd MIG_CMD_RECV_BITMAP,
Dr. David Alan Gilbert <=