timer stats: speedups
[linux-drm-fsl-dcu.git] / lib / kref.c
index 4a467faf1367bb031d49eb136ac16de0551a1629..a6dc3ec328e05fc8da4d69d185d13a5758ac0464 100644 (file)
@@ -21,6 +21,7 @@
 void kref_init(struct kref *kref)
 {
        atomic_set(&kref->refcount,1);
+       smp_mb();
 }
 
 /**
@@ -31,6 +32,7 @@ void kref_get(struct kref *kref)
 {
        WARN_ON(!atomic_read(&kref->refcount));
        atomic_inc(&kref->refcount);
+       smp_mb__after_atomic_inc();
 }
 
 /**
@@ -52,12 +54,7 @@ int kref_put(struct kref *kref, void (*release)(struct kref *kref))
        WARN_ON(release == NULL);
        WARN_ON(release == (void (*)(struct kref *))kfree);
 
-       /*
-        * if current count is one, we are the last user and can release object
-        * right now, avoiding an atomic operation on 'refcount'
-        */
-       if ((atomic_read(&kref->refcount) == 1) ||
-           (atomic_dec_and_test(&kref->refcount))) {
+       if (atomic_dec_and_test(&kref->refcount)) {
                release(kref);
                return 1;
        }