aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/lockref.h
diff options
context:
space:
mode:
authorAlex Williamson <alex.williamson@redhat.com>2013-09-04 13:25:44 -0400
committerAlex Williamson <alex.williamson@redhat.com>2013-09-04 13:25:44 -0400
commit3bc4f3993b93dbf1f6402e2034a2e20eb07db807 (patch)
tree592283e59e121b76355836295d6016fe33cfc5d1 /include/linux/lockref.h
parent17638db1b88184d8895f3f4551c936d7480a1d3f (diff)
parentcb3e4330e697dffaf3d9cefebc9c7e7d39c89f2e (diff)
Merge remote branch 'origin/master' into next-merge
Diffstat (limited to 'include/linux/lockref.h')
-rw-r--r--include/linux/lockref.h36
1 files changed, 36 insertions, 0 deletions
diff --git a/include/linux/lockref.h b/include/linux/lockref.h
new file mode 100644
index 000000000000..ca07b5028b01
--- /dev/null
+++ b/include/linux/lockref.h
@@ -0,0 +1,36 @@
1#ifndef __LINUX_LOCKREF_H
2#define __LINUX_LOCKREF_H
3
4/*
5 * Locked reference counts.
6 *
7 * These are different from just plain atomic refcounts in that they
8 * are atomic with respect to the spinlock that goes with them. In
9 * particular, there can be implementations that don't actually get
10 * the spinlock for the common decrement/increment operations, but they
11 * still have to check that the operation is done semantically as if
12 * the spinlock had been taken (using a cmpxchg operation that covers
13 * both the lock and the count word, or using memory transactions, for
14 * example).
15 */
16
17#include <linux/spinlock.h>
18
19struct lockref {
20 union {
21#ifdef CONFIG_CMPXCHG_LOCKREF
22 aligned_u64 lock_count;
23#endif
24 struct {
25 spinlock_t lock;
26 unsigned int count;
27 };
28 };
29};
30
31extern void lockref_get(struct lockref *);
32extern int lockref_get_not_zero(struct lockref *);
33extern int lockref_get_or_lock(struct lockref *);
34extern int lockref_put_or_lock(struct lockref *);
35
36#endif /* __LINUX_LOCKREF_H */