cpus: don't use atomic_read for vm_clock_warp_start
As vm_clock_warp_start is a 64 bit value this causes problems for the compiler trying to come up with a suitable atomic operation on 32 bit hosts. Because the variable is protected by vm_clock_seqlock, we check its value inside a seqlock critical section. Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Message-Id: <1459780549-12942-2-git-send-email-alex.bennee@linaro.org> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
		
							parent
							
								
									a89ef0c357
								
							
						
					
					
						commit
						ccffff48c9
					
				
							
								
								
									
										10
									
								
								cpus.c
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								cpus.c
									
									
									
									
									
								
							| @ -338,10 +338,18 @@ static int64_t qemu_icount_round(int64_t count) | ||||
| 
 | ||||
| static void icount_warp_rt(void) | ||||
| { | ||||
|     unsigned seq; | ||||
|     int64_t warp_start; | ||||
| 
 | ||||
|     /* The icount_warp_timer is rescheduled soon after vm_clock_warp_start
 | ||||
|      * changes from -1 to another value, so the race here is okay. | ||||
|      */ | ||||
|     if (atomic_read(&vm_clock_warp_start) == -1) { | ||||
|     do { | ||||
|         seq = seqlock_read_begin(&timers_state.vm_clock_seqlock); | ||||
|         warp_start = vm_clock_warp_start; | ||||
|     } while (seqlock_read_retry(&timers_state.vm_clock_seqlock, seq)); | ||||
| 
 | ||||
|     if (warp_start == -1) { | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Alex Bennée
						Alex Bennée