|
@@ -52,7 +52,12 @@ int kref_put(struct kref *kref, void (*release)(struct kref *kref))
|
|
|
WARN_ON(release == NULL);
|
|
|
WARN_ON(release == (void (*)(struct kref *))kfree);
|
|
|
|
|
|
- if (atomic_dec_and_test(&kref->refcount)) {
|
|
|
+ /*
|
|
|
+ * 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))) {
|
|
|
release(kref);
|
|
|
return 1;
|
|
|
}
|