lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:	Fri, 9 May 2014 12:40:21 -0700
From:	Kent Overstreet <kmo@...erainc.com>
To:	Tejun Heo <tj@...nel.org>
Cc:	linux-kernel@...r.kernel.org
Subject: Re: [PATCH percpu/for-3.16 2/2] percpu-refcount: implement
 percpu_ref_tryget()

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@...erainc.com>

> 
> Signed-off-by: Tejun Heo <tj@...nel.org>
> Cc: Kent Overstreet <kmo@...erainc.com>
> ---
>  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@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ