Re: [PATCH percpu/for-3.16 2/2] percpu-refcount: implement percpu_ref_tryget()
From: Kent Overstreet
Date: Fri May 09 2014 - 15:40:29 EST
On Wed, May 07, 2014 at 11:58:10AM -0400, Tejun Heo wrote:
> 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.
I'd still kind of prefer tryget() to be labelled "deprecated, don't use outside
the cgroup code" or somesuch, but it's not a huge deal :)
Acked-by: Kent Overstreet <kmo@xxxxxxxxxxxxx>
>
> Signed-off-by: Tejun Heo <tj@xxxxxxxxxx>
> Cc: Kent Overstreet <kmo@xxxxxxxxxxxxx>
> ---
> include/linux/percpu-refcount.h | 32 ++++++++++++++++++++++++++++++++
> 1 file changed, 32 insertions(+)
>
> --- a/include/linux/percpu-refcount.h
> +++ b/include/linux/percpu-refcount.h
> @@ -118,6 +118,36 @@ static inline void percpu_ref_get(struct
> }
>
> /**
> + * 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
> * 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)
> {
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/