]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
Merge branch 'for-3.16' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/percpu
authorLinus Torvalds <torvalds@linux-foundation.org>
Mon, 9 Jun 2014 21:56:07 +0000 (14:56 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 9 Jun 2014 21:56:07 +0000 (14:56 -0700)
Pull percpu updates from Tejun Heo:
 "Nothing too exciting.  percpu_ref is going through some interface
  changes and getting new features with more changes in the pipeline but
  given its young age and few users, it's very low impact"

* 'for-3.16' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/percpu:
  percpu-refcount: implement percpu_ref_tryget()
  percpu-refcount: rename percpu_ref_tryget() to percpu_ref_tryget_live()
  percpu: Replace __get_cpu_var with this_cpu_ptr

include/linux/cgroup.h
include/linux/percpu-refcount.h
include/linux/percpu.h

index d60904b9e50532410af2956c3546fa5072cae08e..bddebc5cf8e7501d779f3e59b3027d482b37e7d1 100644 (file)
@@ -101,7 +101,7 @@ static inline bool css_tryget(struct cgroup_subsys_state *css)
 {
        if (css->flags & CSS_ROOT)
                return true;
-       return percpu_ref_tryget(&css->refcnt);
+       return percpu_ref_tryget_live(&css->refcnt);
 }
 
 /**
index 0afb48fd449d3f952afdfd64c170715cb90f6a08..5d8920e23073d8caff4ebe834eaab219e53dba0f 100644 (file)
@@ -121,6 +121,36 @@ static inline void percpu_ref_get(struct percpu_ref *ref)
  * 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
+ *
  * Increment a percpu refcount unless it has already been killed.  Returns
  * %true on success; %false on failure.
  *
@@ -128,8 +158,10 @@ 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(struct percpu_ref *ref)
+static inline bool percpu_ref_tryget_live(struct percpu_ref *ref)
 {
        unsigned __percpu *pcpu_count;
        int ret = false;
index 495c6543a8f2e8a880eaa54c49ed267413abf8f5..8419053d0f2e886949b8699b2fee383910c79356 100644 (file)
@@ -29,7 +29,7 @@
  */
 #define get_cpu_var(var) (*({                          \
        preempt_disable();                              \
-       &__get_cpu_var(var); }))
+       this_cpu_ptr(&var); }))
 
 /*
  * The weird & is necessary because sparse considers (void)(var) to be