seqlock: read sequence number atomically
With this change we make sure that the compiler will not optimise the read of the sequence number in any way. Signed-off-by: Emilio G. Cota <cota@braap.org> Message-Id: <1440375847-17603-8-git-send-email-cota@braap.org> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
		
							parent
							
								
									123fdbac9b
								
							
						
					
					
						commit
						d12f730948
					
				| 
						 | 
				
			
			@ -55,18 +55,18 @@ static inline void seqlock_write_unlock(QemuSeqLock *sl)
 | 
			
		|||
static inline unsigned seqlock_read_begin(QemuSeqLock *sl)
 | 
			
		||||
{
 | 
			
		||||
    /* Always fail if a write is in progress.  */
 | 
			
		||||
    unsigned ret = sl->sequence & ~1;
 | 
			
		||||
    unsigned ret = atomic_read(&sl->sequence);
 | 
			
		||||
 | 
			
		||||
    /* Read sequence before reading other fields.  */
 | 
			
		||||
    smp_rmb();
 | 
			
		||||
    return ret;
 | 
			
		||||
    return ret & ~1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline int seqlock_read_retry(const QemuSeqLock *sl, unsigned start)
 | 
			
		||||
{
 | 
			
		||||
    /* Read other fields before reading final sequence.  */
 | 
			
		||||
    smp_rmb();
 | 
			
		||||
    return unlikely(sl->sequence != start);
 | 
			
		||||
    return unlikely(atomic_read(&sl->sequence) != start);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue