[PATCH] kref: avoid an atomic operation in kref_put()
Avoid an atomic operation in kref_put() when the last reference is dropped. On most platforms, atomic_read() is a plan read of the counter and involves no atomic at all. Signed-off-by: Eric Dumazet <dada1@cosmosbay.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
489447380a
commit
8b5536bbee
1 changed files with 6 additions and 1 deletions
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue