From: Kent Overstreet <kmo@daterainc.com>
To: Tejun Heo <tj@kernel.org>
Cc: linux-kernel@vger.kernel.org
Subject: Re: [PATCH percpu/for-3.16 2/2] percpu-refcount: implement percpu_ref_tryget()
Date: Fri, 9 May 2014 12:40:21 -0700 [thread overview]
Message-ID: <20140509194020.GB2276@kmo> (raw)
In-Reply-To: <20140507155810.GD26540@htj.dyndns.org>
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@daterainc.com>
>
> Signed-off-by: Tejun Heo <tj@kernel.org>
> Cc: Kent Overstreet <kmo@daterainc.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)
> {
next prev parent reply other threads:[~2014-05-09 19:40 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-05-07 15:55 [PATCH percpu/for-3.16 1/2] percpu-refcount: rename percpu_ref_tryget() to percpu_ref_tryget_live() Tejun Heo
2014-05-07 15:56 ` [PATCH REPOST " Tejun Heo
2014-05-07 15:58 ` [PATCH percpu/for-3.16 2/2] percpu-refcount: implement percpu_ref_tryget() Tejun Heo
2014-05-09 19:12 ` Tejun Heo
2014-05-09 19:40 ` Kent Overstreet [this message]
2014-05-09 19:41 ` Tejun Heo
2014-05-09 19:51 ` Kent Overstreet
2014-05-09 19:55 ` Tejun Heo
2014-05-12 0:06 ` Kent Overstreet
2014-05-12 20:07 ` Tejun Heo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20140509194020.GB2276@kmo \
--to=kmo@daterainc.com \
--cc=linux-kernel@vger.kernel.org \
--cc=tj@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox