rdma: account for the time spent in MIG_STATE_SETUP through QMP
Using the previous patches, we're now able to timestamp the SETUP state. Once we have this time, let the user know about it in the schema. Reviewed-by: Juan Quintela <quintela@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Signed-off-by: Michael R. Hines <mrhines@us.ibm.com> Signed-off-by: Juan Quintela <quintela@redhat.com>
This commit is contained in:
		
							parent
							
								
									29ae8a4133
								
							
						
					
					
						commit
						ed4fbd1082
					
				
							
								
								
									
										4
									
								
								hmp.c
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								hmp.c
									
									
									
									
									
								
							@ -164,6 +164,10 @@ void hmp_info_migrate(Monitor *mon, const QDict *qdict)
 | 
				
			|||||||
            monitor_printf(mon, "downtime: %" PRIu64 " milliseconds\n",
 | 
					            monitor_printf(mon, "downtime: %" PRIu64 " milliseconds\n",
 | 
				
			||||||
                           info->downtime);
 | 
					                           info->downtime);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        if (info->has_setup_time) {
 | 
				
			||||||
 | 
					            monitor_printf(mon, "setup: %" PRIu64 " milliseconds\n",
 | 
				
			||||||
 | 
					                           info->setup_time);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (info->has_ram) {
 | 
					    if (info->has_ram) {
 | 
				
			||||||
 | 
				
			|||||||
@ -49,6 +49,7 @@ struct MigrationState
 | 
				
			|||||||
    int64_t dirty_bytes_rate;
 | 
					    int64_t dirty_bytes_rate;
 | 
				
			||||||
    bool enabled_capabilities[MIGRATION_CAPABILITY_MAX];
 | 
					    bool enabled_capabilities[MIGRATION_CAPABILITY_MAX];
 | 
				
			||||||
    int64_t xbzrle_cache_size;
 | 
					    int64_t xbzrle_cache_size;
 | 
				
			||||||
 | 
					    int64_t setup_time;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void process_incoming_migration(QEMUFile *f);
 | 
					void process_incoming_migration(QEMUFile *f);
 | 
				
			||||||
 | 
				
			|||||||
@ -191,6 +191,7 @@ MigrationInfo *qmp_query_migrate(Error **errp)
 | 
				
			|||||||
    case MIG_STATE_SETUP:
 | 
					    case MIG_STATE_SETUP:
 | 
				
			||||||
        info->has_status = true;
 | 
					        info->has_status = true;
 | 
				
			||||||
        info->status = g_strdup("setup");
 | 
					        info->status = g_strdup("setup");
 | 
				
			||||||
 | 
					        info->has_total_time = false;
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    case MIG_STATE_ACTIVE:
 | 
					    case MIG_STATE_ACTIVE:
 | 
				
			||||||
        info->has_status = true;
 | 
					        info->has_status = true;
 | 
				
			||||||
@ -200,6 +201,8 @@ MigrationInfo *qmp_query_migrate(Error **errp)
 | 
				
			|||||||
            - s->total_time;
 | 
					            - s->total_time;
 | 
				
			||||||
        info->has_expected_downtime = true;
 | 
					        info->has_expected_downtime = true;
 | 
				
			||||||
        info->expected_downtime = s->expected_downtime;
 | 
					        info->expected_downtime = s->expected_downtime;
 | 
				
			||||||
 | 
					        info->has_setup_time = true;
 | 
				
			||||||
 | 
					        info->setup_time = s->setup_time;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        info->has_ram = true;
 | 
					        info->has_ram = true;
 | 
				
			||||||
        info->ram = g_malloc0(sizeof(*info->ram));
 | 
					        info->ram = g_malloc0(sizeof(*info->ram));
 | 
				
			||||||
@ -231,6 +234,8 @@ MigrationInfo *qmp_query_migrate(Error **errp)
 | 
				
			|||||||
        info->total_time = s->total_time;
 | 
					        info->total_time = s->total_time;
 | 
				
			||||||
        info->has_downtime = true;
 | 
					        info->has_downtime = true;
 | 
				
			||||||
        info->downtime = s->downtime;
 | 
					        info->downtime = s->downtime;
 | 
				
			||||||
 | 
					        info->has_setup_time = true;
 | 
				
			||||||
 | 
					        info->setup_time = s->setup_time;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        info->has_ram = true;
 | 
					        info->has_ram = true;
 | 
				
			||||||
        info->ram = g_malloc0(sizeof(*info->ram));
 | 
					        info->ram = g_malloc0(sizeof(*info->ram));
 | 
				
			||||||
@ -539,6 +544,7 @@ static void *migration_thread(void *opaque)
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    MigrationState *s = opaque;
 | 
					    MigrationState *s = opaque;
 | 
				
			||||||
    int64_t initial_time = qemu_get_clock_ms(rt_clock);
 | 
					    int64_t initial_time = qemu_get_clock_ms(rt_clock);
 | 
				
			||||||
 | 
					    int64_t setup_start = qemu_get_clock_ms(host_clock);
 | 
				
			||||||
    int64_t initial_bytes = 0;
 | 
					    int64_t initial_bytes = 0;
 | 
				
			||||||
    int64_t max_size = 0;
 | 
					    int64_t max_size = 0;
 | 
				
			||||||
    int64_t start_time = initial_time;
 | 
					    int64_t start_time = initial_time;
 | 
				
			||||||
@ -547,8 +553,11 @@ static void *migration_thread(void *opaque)
 | 
				
			|||||||
    DPRINTF("beginning savevm\n");
 | 
					    DPRINTF("beginning savevm\n");
 | 
				
			||||||
    qemu_savevm_state_begin(s->file, &s->params);
 | 
					    qemu_savevm_state_begin(s->file, &s->params);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    s->setup_time = qemu_get_clock_ms(host_clock) - setup_start;
 | 
				
			||||||
    migrate_set_state(s, MIG_STATE_SETUP, MIG_STATE_ACTIVE);
 | 
					    migrate_set_state(s, MIG_STATE_SETUP, MIG_STATE_ACTIVE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    DPRINTF("setup complete\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    while (s->state == MIG_STATE_ACTIVE) {
 | 
					    while (s->state == MIG_STATE_ACTIVE) {
 | 
				
			||||||
        int64_t current_time;
 | 
					        int64_t current_time;
 | 
				
			||||||
        uint64_t pending_size;
 | 
					        uint64_t pending_size;
 | 
				
			||||||
 | 
				
			|||||||
@ -578,6 +578,12 @@
 | 
				
			|||||||
#        expected downtime in milliseconds for the guest in last walk
 | 
					#        expected downtime in milliseconds for the guest in last walk
 | 
				
			||||||
#        of the dirty bitmap. (since 1.3)
 | 
					#        of the dirty bitmap. (since 1.3)
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
 | 
					# @setup-time: #optional amount of setup time in milliseconds _before_ the
 | 
				
			||||||
 | 
					#        iterations begin but _after_ the QMP command is issued. This is designed
 | 
				
			||||||
 | 
					#        to provide an accounting of any activities (such as RDMA pinning) which
 | 
				
			||||||
 | 
					#        may be expensive, but do not actually occur during the iterative
 | 
				
			||||||
 | 
					#        migration rounds themselves. (since 1.6)
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
# Since: 0.14.0
 | 
					# Since: 0.14.0
 | 
				
			||||||
##
 | 
					##
 | 
				
			||||||
{ 'type': 'MigrationInfo',
 | 
					{ 'type': 'MigrationInfo',
 | 
				
			||||||
@ -586,7 +592,8 @@
 | 
				
			|||||||
           '*xbzrle-cache': 'XBZRLECacheStats',
 | 
					           '*xbzrle-cache': 'XBZRLECacheStats',
 | 
				
			||||||
           '*total-time': 'int',
 | 
					           '*total-time': 'int',
 | 
				
			||||||
           '*expected-downtime': 'int',
 | 
					           '*expected-downtime': 'int',
 | 
				
			||||||
           '*downtime': 'int'} }
 | 
					           '*downtime': 'int',
 | 
				
			||||||
 | 
					           '*setup-time': 'int'} }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
##
 | 
					##
 | 
				
			||||||
# @query-migrate
 | 
					# @query-migrate
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user