Avoid deadlock whith iothread and icount
When using the iothread together with icount, make sure the qemu_icount counter makes forward progress when the vcpu is idle to avoid deadlocks. Signed-off-by: Edgar E. Iglesias <edgar.iglesias@gmail.com>
This commit is contained in:
		
							parent
							
								
									5d0bb8239d
								
							
						
					
					
						commit
						225d02cd1a
					
				
							
								
								
									
										15
									
								
								qemu-timer.c
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								qemu-timer.c
									
									
									
									
									
								
							@ -110,7 +110,6 @@ static int64_t cpu_get_clock(void)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifndef CONFIG_IOTHREAD
 | 
			
		||||
static int64_t qemu_icount_delta(void)
 | 
			
		||||
{
 | 
			
		||||
    if (!use_icount) {
 | 
			
		||||
@ -124,7 +123,6 @@ static int64_t qemu_icount_delta(void)
 | 
			
		||||
        return cpu_get_icount() - cpu_get_clock();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* enable cpu_get_ticks() */
 | 
			
		||||
void cpu_enable_ticks(void)
 | 
			
		||||
@ -1077,9 +1075,17 @@ void quit_timers(void)
 | 
			
		||||
 | 
			
		||||
int qemu_calculate_timeout(void)
 | 
			
		||||
{
 | 
			
		||||
#ifndef CONFIG_IOTHREAD
 | 
			
		||||
    int timeout;
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_IOTHREAD
 | 
			
		||||
    /* When using icount, making forward progress with qemu_icount when the
 | 
			
		||||
       guest CPU is idle is critical. We only use the static io-thread timeout
 | 
			
		||||
       for non icount runs.  */
 | 
			
		||||
    if (!use_icount) {
 | 
			
		||||
        return 1000;
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    if (!vm_running)
 | 
			
		||||
        timeout = 5000;
 | 
			
		||||
    else {
 | 
			
		||||
@ -1110,8 +1116,5 @@ int qemu_calculate_timeout(void)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return timeout;
 | 
			
		||||
#else /* CONFIG_IOTHREAD */
 | 
			
		||||
    return 1000;
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user