Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 345343
b: refs/heads/master
c: 4b20db3
h: refs/heads/master
i:
  345341: 9e5f65d
  345339: 1448aa2
  345335: de73c17
  345327: ed083f8
  345311: f651214
  345279: 461a9b4
  345215: 3baeb37
  345087: b8c0a95
v: v3
  • Loading branch information
Thomas Hellstrom authored and Dave Airlie committed Nov 20, 2012
1 parent c532b24 commit b8d0a94
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: d7144556195ab04a148e722a93103da5438bdf78
refs/heads/master: 4b20db3de8dab005b07c74161cb041db8c5ff3a7
21 changes: 21 additions & 0 deletions trunk/include/linux/kref.h
Original file line number Diff line number Diff line change
Expand Up @@ -111,4 +111,25 @@ static inline int kref_put_mutex(struct kref *kref,
}
return 0;
}

/**
* kref_get_unless_zero - Increment refcount for object unless it is zero.
* @kref: object.
*
* Return non-zero if the increment succeeded. Otherwise return 0.
*
* This function is intended to simplify locking around refcounting for
* objects that can be looked up from a lookup structure, and which are
* removed from that lookup structure in the object destructor.
* Operations on such objects require at least a read lock around
* lookup + kref_get, and a write lock around kref_put + remove from lookup
* structure. Furthermore, RCU implementations become extremely tricky.
* With a lookup followed by a kref_get_unless_zero *with return value check*
* locking in the kref_put path can be deferred to the actual removal from
* the lookup structure and RCU lookups become trivial.
*/
static inline int __must_check kref_get_unless_zero(struct kref *kref)
{
return atomic_add_unless(&kref->refcount, 1, 0);
}
#endif /* _KREF_H_ */

0 comments on commit b8d0a94

Please sign in to comment.