Patchwork [07/41] migration: print expected downtime in info migrate

login
register
mail settings
Submitter Juan Quintela
Date Sept. 21, 2012, 8:47 a.m.
Message ID <1348217255-22441-8-git-send-email-quintela@redhat.com>
Download mbox | patch
Permalink /patch/185657/
State New
Headers show

Comments

Juan Quintela - Sept. 21, 2012, 8:47 a.m.
Signed-off-by: Juan Quintela <quintela@redhat.com>
---
 arch_init.c      | 2 ++
 hmp.c            | 4 ++++
 migration.c      | 2 ++
 migration.h      | 1 +
 qapi-schema.json | 5 +++++
 qmp-commands.hx  | 6 ++++++
 6 files changed, 20 insertions(+)
Paolo Bonzini - Sept. 21, 2012, 12:22 p.m.
Il 21/09/2012 10:47, Juan Quintela ha scritto:
> Signed-off-by: Juan Quintela <quintela@redhat.com>
> ---
>  arch_init.c      | 2 ++
>  hmp.c            | 4 ++++
>  migration.c      | 2 ++
>  migration.h      | 1 +
>  qapi-schema.json | 5 +++++
>  qmp-commands.hx  | 6 ++++++
>  6 files changed, 20 insertions(+)
> 
> diff --git a/arch_init.c b/arch_init.c
> index 013e5e5..52ccc7b 100644
> --- a/arch_init.c
> +++ b/arch_init.c
> @@ -540,6 +540,7 @@ static int ram_save_iterate(QEMUFile *f, void *opaque)
>      int ret;
>      int i;
>      uint64_t expected_downtime;
> +    MigrationState *s = migrate_get_current();
> 
>      bytes_transferred_last = bytes_transferred;
>      bwidth = qemu_get_clock_ns(rt_clock);
> @@ -594,6 +595,7 @@ static int ram_save_iterate(QEMUFile *f, void *opaque)
>      if (expected_downtime <= migrate_max_downtime()) {
>          memory_global_sync_dirty_bitmap(get_system_memory());
>          expected_downtime = ram_save_remaining() * TARGET_PAGE_SIZE / bwidth;
> +        s->expected_downtime = expected_downtime / 1000000; /* ns -> ms */
> 
>          return expected_downtime <= migrate_max_downtime();
>      }
> diff --git a/hmp.c b/hmp.c
> index 40b0c05..71c9292 100644
> --- a/hmp.c
> +++ b/hmp.c
> @@ -152,6 +152,10 @@ void hmp_info_migrate(Monitor *mon)
>          monitor_printf(mon, "Migration status: %s\n", info->status);
>          monitor_printf(mon, "total time: %" PRIu64 " milliseconds\n",
>                         info->total_time);
> +        if (info->has_expected_downtime) {
> +            monitor_printf(mon, "expected downtime: %" PRIu64 " milliseconds\n",
> +                           info->expected_downtime);
> +        }
>          if (info->has_downtime) {
>              monitor_printf(mon, "downtime: %" PRIu64 " milliseconds\n",
>                             info->downtime);
> diff --git a/migration.c b/migration.c
> index 2827663..62c8fe9 100644
> --- a/migration.c
> +++ b/migration.c
> @@ -169,6 +169,8 @@ MigrationInfo *qmp_query_migrate(Error **errp)
>          info->has_total_time = true;
>          info->total_time = qemu_get_clock_ms(rt_clock)
>              - s->total_time;
> +        info->has_expected_downtime = true;
> +        info->expected_downtime = s->expected_downtime;
> 
>          info->has_ram = true;
>          info->ram = g_malloc0(sizeof(*info->ram));
> diff --git a/migration.h b/migration.h
> index dabc333..552200c 100644
> --- a/migration.h
> +++ b/migration.h
> @@ -41,6 +41,7 @@ struct MigrationState
>      MigrationParams params;
>      int64_t total_time;
>      int64_t downtime;
> +    int64_t expected_downtime;
>      bool enabled_capabilities[MIGRATION_CAPABILITY_MAX];
>      int64_t xbzrle_cache_size;
>  };
> diff --git a/qapi-schema.json b/qapi-schema.json
> index b5a4360..b8a1244 100644
> --- a/qapi-schema.json
> +++ b/qapi-schema.json
> @@ -417,6 +417,10 @@
>  #        total downtime in milliseconds for the guest.
>  #        (since 1.3)
>  #
> +# @expected-downtime: #optional only present while migration is active
> +#        expected downtime in milliseconds for the guest in last walk
> +#        of the dirty bitmap. (since 1.3)
> +#
>  # Since: 0.14.0
>  ##
>  { 'type': 'MigrationInfo',
> @@ -424,6 +428,7 @@
>             '*disk': 'MigrationStats',
>             '*xbzrle-cache': 'XBZRLECacheStats',
>             '*total-time': 'int',
> +           '*expected-downtime': 'int',
>             '*downtime': 'int'} }
> 
>  ##
> diff --git a/qmp-commands.hx b/qmp-commands.hx
> index 37be613..68b6580 100644
> --- a/qmp-commands.hx
> +++ b/qmp-commands.hx
> @@ -2269,6 +2269,9 @@ The main json-object contains the following:
>  		 time (json-int)
>  - "downtime": only present when migration has finished correctly
>                  total amount in ms for downtime that happened (json-int)
> +- "expected-downtime": only present while migration is active
> +                total amount in ms for downtime that was calculated on
> +		the last bitmap round (json-int)
>  - "ram": only present if "status" is "active", it is a json-object with the
>    following RAM information (in bytes):
>           - "transferred": amount transferred (json-int)
> @@ -2330,6 +2333,7 @@ Examples:
>              "remaining":123,
>              "total":246,
>              "total-time":12345,
> +            "expected-downtime":12345,
>              "duplicate":123,
>              "normal":123,
>              "normal-bytes":123456
> @@ -2348,6 +2352,7 @@ Examples:
>              "remaining":1053304,
>              "transferred":3720,
>              "total-time":12345,
> +            "expected-downtime":12345,
>              "duplicate":123,
>              "normal":123,
>              "normal-bytes":123456
> @@ -2372,6 +2377,7 @@ Examples:
>              "remaining":1053304,
>              "transferred":3720,
>              "total-time":12345,
> +            "expected-downtime":12345,
>              "duplicate":10,
>              "normal":3333,
>              "normal-bytes":3412992
> 

Consider making the save_live functions return the expected downtime in
an int64_t* argument.  The loop then can sum all the expected downtimes
and store them in s->expected_downtime, removing the need for patch 6.

Paolo
Juan Quintela - Oct. 2, 2012, 10:47 a.m.
Paolo Bonzini <pbonzini@redhat.com> wrote:
> Il 21/09/2012 10:47, Juan Quintela ha scritto:
>> Signed-off-by: Juan Quintela <quintela@redhat.com>
>
> Consider making the save_live functions return the expected downtime in
> an int64_t* argument.  The loop then can sum all the expected downtimes
> and store them in s->expected_downtime, removing the need for patch 6.

If you look at the migration thread patches, I change the functions to
return the "pending amount".  And the migration thread does the
bandwidth calculations.  It is just impossible to do the right
bandwidth calculation locally.

Later, Juan.

Patch

diff --git a/arch_init.c b/arch_init.c
index 013e5e5..52ccc7b 100644
--- a/arch_init.c
+++ b/arch_init.c
@@ -540,6 +540,7 @@  static int ram_save_iterate(QEMUFile *f, void *opaque)
     int ret;
     int i;
     uint64_t expected_downtime;
+    MigrationState *s = migrate_get_current();

     bytes_transferred_last = bytes_transferred;
     bwidth = qemu_get_clock_ns(rt_clock);
@@ -594,6 +595,7 @@  static int ram_save_iterate(QEMUFile *f, void *opaque)
     if (expected_downtime <= migrate_max_downtime()) {
         memory_global_sync_dirty_bitmap(get_system_memory());
         expected_downtime = ram_save_remaining() * TARGET_PAGE_SIZE / bwidth;
+        s->expected_downtime = expected_downtime / 1000000; /* ns -> ms */

         return expected_downtime <= migrate_max_downtime();
     }
diff --git a/hmp.c b/hmp.c
index 40b0c05..71c9292 100644
--- a/hmp.c
+++ b/hmp.c
@@ -152,6 +152,10 @@  void hmp_info_migrate(Monitor *mon)
         monitor_printf(mon, "Migration status: %s\n", info->status);
         monitor_printf(mon, "total time: %" PRIu64 " milliseconds\n",
                        info->total_time);
+        if (info->has_expected_downtime) {
+            monitor_printf(mon, "expected downtime: %" PRIu64 " milliseconds\n",
+                           info->expected_downtime);
+        }
         if (info->has_downtime) {
             monitor_printf(mon, "downtime: %" PRIu64 " milliseconds\n",
                            info->downtime);
diff --git a/migration.c b/migration.c
index 2827663..62c8fe9 100644
--- a/migration.c
+++ b/migration.c
@@ -169,6 +169,8 @@  MigrationInfo *qmp_query_migrate(Error **errp)
         info->has_total_time = true;
         info->total_time = qemu_get_clock_ms(rt_clock)
             - s->total_time;
+        info->has_expected_downtime = true;
+        info->expected_downtime = s->expected_downtime;

         info->has_ram = true;
         info->ram = g_malloc0(sizeof(*info->ram));
diff --git a/migration.h b/migration.h
index dabc333..552200c 100644
--- a/migration.h
+++ b/migration.h
@@ -41,6 +41,7 @@  struct MigrationState
     MigrationParams params;
     int64_t total_time;
     int64_t downtime;
+    int64_t expected_downtime;
     bool enabled_capabilities[MIGRATION_CAPABILITY_MAX];
     int64_t xbzrle_cache_size;
 };
diff --git a/qapi-schema.json b/qapi-schema.json
index b5a4360..b8a1244 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -417,6 +417,10 @@ 
 #        total downtime in milliseconds for the guest.
 #        (since 1.3)
 #
+# @expected-downtime: #optional only present while migration is active
+#        expected downtime in milliseconds for the guest in last walk
+#        of the dirty bitmap. (since 1.3)
+#
 # Since: 0.14.0
 ##
 { 'type': 'MigrationInfo',
@@ -424,6 +428,7 @@ 
            '*disk': 'MigrationStats',
            '*xbzrle-cache': 'XBZRLECacheStats',
            '*total-time': 'int',
+           '*expected-downtime': 'int',
            '*downtime': 'int'} }

 ##
diff --git a/qmp-commands.hx b/qmp-commands.hx
index 37be613..68b6580 100644
--- a/qmp-commands.hx
+++ b/qmp-commands.hx
@@ -2269,6 +2269,9 @@  The main json-object contains the following:
 		 time (json-int)
 - "downtime": only present when migration has finished correctly
                 total amount in ms for downtime that happened (json-int)
+- "expected-downtime": only present while migration is active
+                total amount in ms for downtime that was calculated on
+		the last bitmap round (json-int)
 - "ram": only present if "status" is "active", it is a json-object with the
   following RAM information (in bytes):
          - "transferred": amount transferred (json-int)
@@ -2330,6 +2333,7 @@  Examples:
             "remaining":123,
             "total":246,
             "total-time":12345,
+            "expected-downtime":12345,
             "duplicate":123,
             "normal":123,
             "normal-bytes":123456
@@ -2348,6 +2352,7 @@  Examples:
             "remaining":1053304,
             "transferred":3720,
             "total-time":12345,
+            "expected-downtime":12345,
             "duplicate":123,
             "normal":123,
             "normal-bytes":123456
@@ -2372,6 +2377,7 @@  Examples:
             "remaining":1053304,
             "transferred":3720,
             "total-time":12345,
+            "expected-downtime":12345,
             "duplicate":10,
             "normal":3333,
             "normal-bytes":3412992