forked from mirrors/linux
		
	percpu-refcount: implement percpu_ref_tryget()
Implement percpu_ref_tryget() which fails if the refcnt already reached zero. Note that this is different from the recently renamed percpu_ref_tryget_live() which fails if the refcnt has been killed and is draining the remaining references. percpu_ref_tryget() succeeds on a killed refcnt as long as its current refcnt is above zero. Signed-off-by: Tejun Heo <tj@kernel.org> Acked-by: Kent Overstreet <kmo@daterainc.com>
This commit is contained in:
		
							parent
							
								
									2070d50e1c
								
							
						
					
					
						commit
						4fb6e25049
					
				
					 1 changed files with 32 additions and 0 deletions
				
			
		|  | @ -117,6 +117,36 @@ static inline void percpu_ref_get(struct percpu_ref *ref) | |||
| 	rcu_read_unlock_sched(); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * percpu_ref_tryget - try to increment a percpu refcount | ||||
|  * @ref: percpu_ref to try-get | ||||
|  * | ||||
|  * Increment a percpu refcount unless its count already reached zero. | ||||
|  * Returns %true on success; %false on failure. | ||||
|  * | ||||
|  * The caller is responsible for ensuring that @ref stays accessible. | ||||
|  */ | ||||
| static inline bool percpu_ref_tryget(struct percpu_ref *ref) | ||||
| { | ||||
| 	unsigned __percpu *pcpu_count; | ||||
| 	int ret = false; | ||||
| 
 | ||||
| 	rcu_read_lock_sched(); | ||||
| 
 | ||||
| 	pcpu_count = ACCESS_ONCE(ref->pcpu_count); | ||||
| 
 | ||||
| 	if (likely(REF_STATUS(pcpu_count) == PCPU_REF_PTR)) { | ||||
| 		__this_cpu_inc(*pcpu_count); | ||||
| 		ret = true; | ||||
| 	} else { | ||||
| 		ret = atomic_inc_not_zero(&ref->count); | ||||
| 	} | ||||
| 
 | ||||
| 	rcu_read_unlock_sched(); | ||||
| 
 | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * percpu_ref_tryget_live - try to increment a live percpu refcount | ||||
|  * @ref: percpu_ref to try-get | ||||
|  | @ -128,6 +158,8 @@ static inline void percpu_ref_get(struct percpu_ref *ref) | |||
|  * will fail.  For such guarantee, percpu_ref_kill_and_confirm() should be | ||||
|  * used.  After the confirm_kill callback is invoked, it's guaranteed that | ||||
|  * no new reference will be given out by percpu_ref_tryget(). | ||||
|  * | ||||
|  * The caller is responsible for ensuring that @ref stays accessible. | ||||
|  */ | ||||
| static inline bool percpu_ref_tryget_live(struct percpu_ref *ref) | ||||
| { | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Tejun Heo
						Tejun Heo