entry: Snapshot thread flags
Some thread flags can be set remotely, and so even when IRQs are disabled, the flags can change under our feet. Generally this is unlikely to cause a problem in practice, but it is somewhat unsound, and KCSAN will legitimately warn that there is a data race. To avoid such issues, a snapshot of the flags has to be taken prior to using them. Some places already use READ_ONCE() for that, others do not. Convert them all to the new flag accessor helpers. Signed-off-by: Mark Rutland <mark.rutland@arm.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Acked-by: Paul E. McKenney <paulmck@kernel.org> Link: https://lore.kernel.org/r/20211129130653.2037928-3-mark.rutland@arm.com
This commit is contained in:
		
							parent
							
								
									dca99fb643
								
							
						
					
					
						commit
						6ce895128b
					
				| @ -75,7 +75,7 @@ static inline void xfer_to_guest_mode_prepare(void) | ||||
|  */ | ||||
| static inline bool __xfer_to_guest_mode_work_pending(void) | ||||
| { | ||||
| 	unsigned long ti_work = READ_ONCE(current_thread_info()->flags); | ||||
| 	unsigned long ti_work = read_thread_flags(); | ||||
| 
 | ||||
| 	return !!(ti_work & XFER_TO_GUEST_MODE_WORK); | ||||
| } | ||||
|  | ||||
| @ -187,7 +187,7 @@ static unsigned long exit_to_user_mode_loop(struct pt_regs *regs, | ||||
| 		/* Check if any of the above work has queued a deferred wakeup */ | ||||
| 		tick_nohz_user_enter_prepare(); | ||||
| 
 | ||||
| 		ti_work = READ_ONCE(current_thread_info()->flags); | ||||
| 		ti_work = read_thread_flags(); | ||||
| 	} | ||||
| 
 | ||||
| 	/* Return the latest work state for arch_exit_to_user_mode() */ | ||||
| @ -196,7 +196,7 @@ static unsigned long exit_to_user_mode_loop(struct pt_regs *regs, | ||||
| 
 | ||||
| static void exit_to_user_mode_prepare(struct pt_regs *regs) | ||||
| { | ||||
| 	unsigned long ti_work = READ_ONCE(current_thread_info()->flags); | ||||
| 	unsigned long ti_work = read_thread_flags(); | ||||
| 
 | ||||
| 	lockdep_assert_irqs_disabled(); | ||||
| 
 | ||||
|  | ||||
| @ -26,7 +26,7 @@ static int xfer_to_guest_mode_work(struct kvm_vcpu *vcpu, unsigned long ti_work) | ||||
| 		if (ret) | ||||
| 			return ret; | ||||
| 
 | ||||
| 		ti_work = READ_ONCE(current_thread_info()->flags); | ||||
| 		ti_work = read_thread_flags(); | ||||
| 	} while (ti_work & XFER_TO_GUEST_MODE_WORK || need_resched()); | ||||
| 	return 0; | ||||
| } | ||||
| @ -43,7 +43,7 @@ int xfer_to_guest_mode_handle_work(struct kvm_vcpu *vcpu) | ||||
| 	 * disabled in the inner loop before going into guest mode. No need | ||||
| 	 * to disable interrupts here. | ||||
| 	 */ | ||||
| 	ti_work = READ_ONCE(current_thread_info()->flags); | ||||
| 	ti_work = read_thread_flags(); | ||||
| 	if (!(ti_work & XFER_TO_GUEST_MODE_WORK)) | ||||
| 		return 0; | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user