qemu-devel
[Top][All Lists]
Advanced

[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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]