forked from mirrors/linux
		
	atomic: Export fetch_or()
Export fetch_or() that's implemented and used internally by the scheduler. We are going to use it for NO_HZ so make it generally available. Reviewed-by: Chris Metcalf <cmetcalf@ezchip.com> Cc: Christoph Lameter <cl@linux.com> Cc: Chris Metcalf <cmetcalf@ezchip.com> Cc: Ingo Molnar <mingo@kernel.org> Cc: Luiz Capitulino <lcapitulino@redhat.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Rik van Riel <riel@redhat.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Viresh Kumar <viresh.kumar@linaro.org> Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
This commit is contained in:
		
							parent
							
								
									36f90b0a2d
								
							
						
					
					
						commit
						5fd7a09cfb
					
				
					 2 changed files with 21 additions and 14 deletions
				
			
		|  | @ -548,6 +548,27 @@ static inline int atomic_dec_if_positive(atomic_t *v) | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | /**
 | ||||||
|  |  * fetch_or - perform *ptr |= mask and return old value of *ptr | ||||||
|  |  * @ptr: pointer to value | ||||||
|  |  * @mask: mask to OR on the value | ||||||
|  |  * | ||||||
|  |  * cmpxchg based fetch_or, macro so it works for different integer types | ||||||
|  |  */ | ||||||
|  | #ifndef fetch_or | ||||||
|  | #define fetch_or(ptr, mask)						\ | ||||||
|  | ({	typeof(*(ptr)) __old, __val = *(ptr);				\ | ||||||
|  | 	for (;;) {							\ | ||||||
|  | 		__old = cmpxchg((ptr), __val, __val | (mask));		\ | ||||||
|  | 		if (__old == __val)					\ | ||||||
|  | 			break;						\ | ||||||
|  | 		__val = __old;						\ | ||||||
|  | 	}								\ | ||||||
|  | 	__old;								\ | ||||||
|  | }) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| #ifdef CONFIG_GENERIC_ATOMIC64 | #ifdef CONFIG_GENERIC_ATOMIC64 | ||||||
| #include <asm-generic/atomic64.h> | #include <asm-generic/atomic64.h> | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | @ -453,20 +453,6 @@ static inline void init_hrtick(void) | ||||||
| } | } | ||||||
| #endif	/* CONFIG_SCHED_HRTICK */ | #endif	/* CONFIG_SCHED_HRTICK */ | ||||||
| 
 | 
 | ||||||
| /*
 |  | ||||||
|  * cmpxchg based fetch_or, macro so it works for different integer types |  | ||||||
|  */ |  | ||||||
| #define fetch_or(ptr, val)						\ |  | ||||||
| ({	typeof(*(ptr)) __old, __val = *(ptr);				\ |  | ||||||
|  	for (;;) {							\ |  | ||||||
|  		__old = cmpxchg((ptr), __val, __val | (val));		\ |  | ||||||
|  		if (__old == __val)					\ |  | ||||||
|  			break;						\ |  | ||||||
|  		__val = __old;						\ |  | ||||||
|  	}								\ |  | ||||||
|  	__old;								\ |  | ||||||
| }) |  | ||||||
| 
 |  | ||||||
| #if defined(CONFIG_SMP) && defined(TIF_POLLING_NRFLAG) | #if defined(CONFIG_SMP) && defined(TIF_POLLING_NRFLAG) | ||||||
| /*
 | /*
 | ||||||
|  * Atomically set TIF_NEED_RESCHED and test for TIF_POLLING_NRFLAG, |  * Atomically set TIF_NEED_RESCHED and test for TIF_POLLING_NRFLAG, | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Frederic Weisbecker
						Frederic Weisbecker