Patchwork [07/12] savevm: introduce qemu_savevm_local()

login
register
mail settings
Submitter Lei Li
Date July 25, 2013, 8:18 p.m.
Message ID <1374783499-2550-8-git-send-email-lilei@linux.vnet.ibm.com>
Download mbox | patch
Permalink /patch/261965/
State New
Headers show

Comments

Lei Li - July 25, 2013, 8:18 p.m.
Signed-off-by: Lei Li <lilei@linux.vnet.ibm.com>
---
 include/sysemu/sysemu.h |    1 +
 savevm.c                |   55 +++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 56 insertions(+), 0 deletions(-)
mrhines@linux.vnet.ibm.com - Aug. 2, 2013, 7:48 p.m.
On 07/25/2013 04:18 PM, Lei Li wrote:
> Signed-off-by: Lei Li <lilei@linux.vnet.ibm.com>
> ---
>   include/sysemu/sysemu.h |    1 +
>   savevm.c                |   55 +++++++++++++++++++++++++++++++++++++++++++++++
>   2 files changed, 56 insertions(+), 0 deletions(-)
>
> diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h
> index 5b90027..9abe4c9 100644
> --- a/include/sysemu/sysemu.h
> +++ b/include/sysemu/sysemu.h
> @@ -80,6 +80,7 @@ int qemu_savevm_state_iterate(QEMUFile *f);
>   void qemu_savevm_state_complete(QEMUFile *f);
>   void qemu_savevm_state_cancel(void);
>   uint64_t qemu_savevm_state_pending(QEMUFile *f, uint64_t max_size);
> +int qemu_savevm_local(QEMUFile *f);
>   int qemu_save_device_state(QEMUFile *f);
>   int qemu_loadvm_state(QEMUFile *f);
>
> diff --git a/savevm.c b/savevm.c
> index e18ca22..c183369 100644
> --- a/savevm.c
> +++ b/savevm.c
> @@ -2007,6 +2007,61 @@ static int qemu_savevm_state(QEMUFile *f)
>   }
>
>   /**
> + * Save all of the ram pages to stream QEMUFile
> + *
> + * Return: negtive for an error
> + */
> +int qemu_savevm_local(QEMUFile *f)
> +{
> +    SaveStateEntry *se;
> +    int ret;
> +
> +    QTAILQ_FOREACH(se, &savevm_handlers, entry) {
> +        if (!se->ops) {
> +            continue;
> +        }
> +    }
> +
> +    qemu_put_be32(f, QEMU_VM_FILE_MAGIC);
> +    qemu_put_be32(f, QEMU_VM_FILE_VERSION);
> +
> +    QTAILQ_FOREACH(se, &savevm_handlers, entry) {
> +        int len;
> +
> +        if (!se->ops || !se->ops->save_local_setup) {
> +            continue;
> +        }
> +        if (se->ops && se->ops->is_block_active) {
> +            continue;
> +        }
> +
> +        /* Section type */
> +        qemu_put_byte(f, QEMU_VM_SECTION_START);
> +        qemu_put_be32(f, se->section_id);
> +
> +        /* ID string */
> +        len = strlen(se->idstr);
> +        qemu_put_byte(f, len);
> +        qemu_put_buffer(f, (uint8_t *)se->idstr, len);
> +
> +        qemu_put_be32(f, se->instance_id);
> +
> +        qemu_put_be32(f, se->version_id);
> +
> +        ret = se->ops->save_local_setup(f, se->opaque);
> +        if (ret < 0) {
> +            qemu_file_set_error(f, ret);
> +            break;
> +        }
> +    }
> +
> +    qemu_put_byte(f, QEMU_VM_EOF);
> +    qemu_fflush(f);
> +
> +    return qemu_file_get_error(f);
> +}
> +
> +/**
>    * Save all of the device states to stream QEMUFile
>    *
>    * Return negtive if there has been an error

You don't have enough comments in your commit messages - please add more.

Why do you need a new savevm function?

- Michael
Lei Li - Aug. 5, 2013, 3:02 a.m.
On 08/03/2013 03:48 AM, Michael R. Hines wrote:
> On 07/25/2013 04:18 PM, Lei Li wrote:
>> Signed-off-by: Lei Li <lilei@linux.vnet.ibm.com>
>> ---
>>   include/sysemu/sysemu.h |    1 +
>>   savevm.c                |   55 
>> +++++++++++++++++++++++++++++++++++++++++++++++
>>   2 files changed, 56 insertions(+), 0 deletions(-)
>>
>> diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h
>> index 5b90027..9abe4c9 100644
>> --- a/include/sysemu/sysemu.h
>> +++ b/include/sysemu/sysemu.h
>> @@ -80,6 +80,7 @@ int qemu_savevm_state_iterate(QEMUFile *f);
>>   void qemu_savevm_state_complete(QEMUFile *f);
>>   void qemu_savevm_state_cancel(void);
>>   uint64_t qemu_savevm_state_pending(QEMUFile *f, uint64_t max_size);
>> +int qemu_savevm_local(QEMUFile *f);
>>   int qemu_save_device_state(QEMUFile *f);
>>   int qemu_loadvm_state(QEMUFile *f);
>>
>> diff --git a/savevm.c b/savevm.c
>> index e18ca22..c183369 100644
>> --- a/savevm.c
>> +++ b/savevm.c
>> @@ -2007,6 +2007,61 @@ static int qemu_savevm_state(QEMUFile *f)
>>   }
>>
>>   /**
>> + * Save all of the ram pages to stream QEMUFile
>> + *
>> + * Return: negtive for an error
>> + */
>> +int qemu_savevm_local(QEMUFile *f)
>> +{
>> +    SaveStateEntry *se;
>> +    int ret;
>> +
>> +    QTAILQ_FOREACH(se, &savevm_handlers, entry) {
>> +        if (!se->ops) {
>> +            continue;
>> +        }
>> +    }
>> +
>> +    qemu_put_be32(f, QEMU_VM_FILE_MAGIC);
>> +    qemu_put_be32(f, QEMU_VM_FILE_VERSION);
>> +
>> +    QTAILQ_FOREACH(se, &savevm_handlers, entry) {
>> +        int len;
>> +
>> +        if (!se->ops || !se->ops->save_local_setup) {
>> +            continue;
>> +        }
>> +        if (se->ops && se->ops->is_block_active) {
>> +            continue;
>> +        }
>> +
>> +        /* Section type */
>> +        qemu_put_byte(f, QEMU_VM_SECTION_START);
>> +        qemu_put_be32(f, se->section_id);
>> +
>> +        /* ID string */
>> +        len = strlen(se->idstr);
>> +        qemu_put_byte(f, len);
>> +        qemu_put_buffer(f, (uint8_t *)se->idstr, len);
>> +
>> +        qemu_put_be32(f, se->instance_id);
>> +
>> +        qemu_put_be32(f, se->version_id);
>> +
>> +        ret = se->ops->save_local_setup(f, se->opaque);
>> +        if (ret < 0) {
>> +            qemu_file_set_error(f, ret);
>> +            break;
>> +        }
>> +    }
>> +
>> +    qemu_put_byte(f, QEMU_VM_EOF);
>> +    qemu_fflush(f);
>> +
>> +    return qemu_file_get_error(f);
>> +}
>> +
>> +/**
>>    * Save all of the device states to stream QEMUFile
>>    *
>>    * Return negtive if there has been an error
>
> You don't have enough comments in your commit messages - please add more.

Sorry for the missing of commit messages..

>
> Why do you need a new savevm function?

qemu_savevm_local() is introduced to savevm layer that begin
and do the local migration by calling ops->save_local_setup which
is added to savevm_ram_handlers.

>
> - Michael

Patch

diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h
index 5b90027..9abe4c9 100644
--- a/include/sysemu/sysemu.h
+++ b/include/sysemu/sysemu.h
@@ -80,6 +80,7 @@  int qemu_savevm_state_iterate(QEMUFile *f);
 void qemu_savevm_state_complete(QEMUFile *f);
 void qemu_savevm_state_cancel(void);
 uint64_t qemu_savevm_state_pending(QEMUFile *f, uint64_t max_size);
+int qemu_savevm_local(QEMUFile *f);
 int qemu_save_device_state(QEMUFile *f);
 int qemu_loadvm_state(QEMUFile *f);
 
diff --git a/savevm.c b/savevm.c
index e18ca22..c183369 100644
--- a/savevm.c
+++ b/savevm.c
@@ -2007,6 +2007,61 @@  static int qemu_savevm_state(QEMUFile *f)
 }
 
 /**
+ * Save all of the ram pages to stream QEMUFile
+ *
+ * Return: negtive for an error
+ */
+int qemu_savevm_local(QEMUFile *f)
+{
+    SaveStateEntry *se;
+    int ret;
+
+    QTAILQ_FOREACH(se, &savevm_handlers, entry) {
+        if (!se->ops) {
+            continue;
+        }
+    }
+
+    qemu_put_be32(f, QEMU_VM_FILE_MAGIC);
+    qemu_put_be32(f, QEMU_VM_FILE_VERSION);
+
+    QTAILQ_FOREACH(se, &savevm_handlers, entry) {
+        int len;
+
+        if (!se->ops || !se->ops->save_local_setup) {
+            continue;
+        }
+        if (se->ops && se->ops->is_block_active) {
+            continue;
+        }
+
+        /* Section type */
+        qemu_put_byte(f, QEMU_VM_SECTION_START);
+        qemu_put_be32(f, se->section_id);
+
+        /* ID string */
+        len = strlen(se->idstr);
+        qemu_put_byte(f, len);
+        qemu_put_buffer(f, (uint8_t *)se->idstr, len);
+
+        qemu_put_be32(f, se->instance_id);
+
+        qemu_put_be32(f, se->version_id);
+
+        ret = se->ops->save_local_setup(f, se->opaque);
+        if (ret < 0) {
+            qemu_file_set_error(f, ret);
+            break;
+        }
+    }
+
+    qemu_put_byte(f, QEMU_VM_EOF);
+    qemu_fflush(f);
+
+    return qemu_file_get_error(f);
+}
+
+/**
  * Save all of the device states to stream QEMUFile
  *
  * Return negtive if there has been an error