Diff for /qemu/migration.c between versions 1.1.1.6 and 1.1.1.7

version 1.1.1.6, 2018/04/24 18:24:44 version 1.1.1.7, 2018/04/24 18:34:31
Line 32 Line 32
 #endif  #endif
   
 /* Migration speed throttling */  /* Migration speed throttling */
 static uint32_t max_throttle = (32 << 20);  static int64_t max_throttle = (32 << 20);
   
 static MigrationState *current_migration;  static MigrationState *current_migration;
   
   static NotifierList migration_state_notifiers =
       NOTIFIER_LIST_INITIALIZER(migration_state_notifiers);
   
 int qemu_start_incoming_migration(const char *uri)  int qemu_start_incoming_migration(const char *uri)
 {  {
     const char *p;      const char *p;
Line 88  int do_migrate(Monitor *mon, const QDict Line 91  int do_migrate(Monitor *mon, const QDict
         return -1;          return -1;
     }      }
   
       if (qemu_savevm_state_blocked(mon)) {
           return -1;
       }
   
     if (strstart(uri, "tcp:", &p)) {      if (strstart(uri, "tcp:", &p)) {
         s = tcp_start_outgoing_migration(mon, p, max_throttle, detach,          s = tcp_start_outgoing_migration(mon, p, max_throttle, detach,
                                          blk, inc);                                           blk, inc);
Line 117  int do_migrate(Monitor *mon, const QDict Line 124  int do_migrate(Monitor *mon, const QDict
     }      }
   
     current_migration = s;      current_migration = s;
       notifier_list_notify(&migration_state_notifiers);
     return 0;      return 0;
 }  }
   
Line 132  int do_migrate_cancel(Monitor *mon, cons Line 140  int do_migrate_cancel(Monitor *mon, cons
   
 int do_migrate_set_speed(Monitor *mon, const QDict *qdict, QObject **ret_data)  int do_migrate_set_speed(Monitor *mon, const QDict *qdict, QObject **ret_data)
 {  {
     double d;      int64_t d;
     FdMigrationState *s;      FdMigrationState *s;
   
     d = qdict_get_double(qdict, "value");      d = qdict_get_int(qdict, "value");
     d = MAX(0, MIN(UINT32_MAX, d));      if (d < 0) {
           d = 0;
       }
     max_throttle = d;      max_throttle = d;
   
     s = migrate_to_fms(current_migration);      s = migrate_to_fms(current_migration);
Line 266  void migrate_fd_error(FdMigrationState * Line 276  void migrate_fd_error(FdMigrationState *
 {  {
     DPRINTF("setting error state\n");      DPRINTF("setting error state\n");
     s->state = MIG_STATE_ERROR;      s->state = MIG_STATE_ERROR;
       notifier_list_notify(&migration_state_notifiers);
     migrate_fd_cleanup(s);      migrate_fd_cleanup(s);
 }  }
   
Line 323  ssize_t migrate_fd_put_buffer(void *opaq Line 334  ssize_t migrate_fd_put_buffer(void *opaq
             monitor_resume(s->mon);              monitor_resume(s->mon);
         }          }
         s->state = MIG_STATE_ERROR;          s->state = MIG_STATE_ERROR;
           notifier_list_notify(&migration_state_notifiers);
     }      }
   
     return ret;      return ret;
Line 368  void migrate_fd_put_ready(void *opaque) Line 380  void migrate_fd_put_ready(void *opaque)
         DPRINTF("done iterating\n");          DPRINTF("done iterating\n");
         vm_stop(0);          vm_stop(0);
   
         qemu_aio_flush();  
         bdrv_flush_all();  
         if ((qemu_savevm_state_complete(s->mon, s->file)) < 0) {          if ((qemu_savevm_state_complete(s->mon, s->file)) < 0) {
             if (old_vm_running) {              if (old_vm_running) {
                 vm_start();                  vm_start();
Line 385  void migrate_fd_put_ready(void *opaque) Line 395  void migrate_fd_put_ready(void *opaque)
             state = MIG_STATE_ERROR;              state = MIG_STATE_ERROR;
         }          }
         s->state = state;          s->state = state;
           notifier_list_notify(&migration_state_notifiers);
     }      }
 }  }
   
Line 404  void migrate_fd_cancel(MigrationState *m Line 415  void migrate_fd_cancel(MigrationState *m
     DPRINTF("cancelling migration\n");      DPRINTF("cancelling migration\n");
   
     s->state = MIG_STATE_CANCELLED;      s->state = MIG_STATE_CANCELLED;
       notifier_list_notify(&migration_state_notifiers);
     qemu_savevm_state_cancel(s->mon, s->file);      qemu_savevm_state_cancel(s->mon, s->file);
   
     migrate_fd_cleanup(s);      migrate_fd_cleanup(s);
Line 417  void migrate_fd_release(MigrationState * Line 429  void migrate_fd_release(MigrationState *
         
     if (s->state == MIG_STATE_ACTIVE) {      if (s->state == MIG_STATE_ACTIVE) {
         s->state = MIG_STATE_CANCELLED;          s->state = MIG_STATE_CANCELLED;
           notifier_list_notify(&migration_state_notifiers);
         migrate_fd_cleanup(s);          migrate_fd_cleanup(s);
     }      }
     qemu_free(s);      qemu_free(s);
Line 448  int migrate_fd_close(void *opaque) Line 461  int migrate_fd_close(void *opaque)
     qemu_set_fd_handler2(s->fd, NULL, NULL, NULL, NULL);      qemu_set_fd_handler2(s->fd, NULL, NULL, NULL, NULL);
     return s->close(s);      return s->close(s);
 }  }
   
   void add_migration_state_change_notifier(Notifier *notify)
   {
       notifier_list_add(&migration_state_notifiers, notify);
   }
   
   void remove_migration_state_change_notifier(Notifier *notify)
   {
       notifier_list_remove(&migration_state_notifiers, notify);
   }
   
   int get_migration_state(void)
   {
       if (current_migration) {
           return migrate_fd_get_status(current_migration);
       } else {
           return MIG_STATE_ERROR;
       }
   }

Removed from v.1.1.1.6  
changed lines
  Added in v.1.1.1.7


unix.superglobalmegacorp.com