diff options
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/dma-attrs.h | 1 | ||||
| -rw-r--r-- | include/linux/kref.h | 21 |
2 files changed, 22 insertions, 0 deletions
diff --git a/include/linux/dma-attrs.h b/include/linux/dma-attrs.h index f83f793223f..c8e1831d757 100644 --- a/include/linux/dma-attrs.h +++ b/include/linux/dma-attrs.h | |||
| @@ -17,6 +17,7 @@ enum dma_attr { | |||
| 17 | DMA_ATTR_NON_CONSISTENT, | 17 | DMA_ATTR_NON_CONSISTENT, |
| 18 | DMA_ATTR_NO_KERNEL_MAPPING, | 18 | DMA_ATTR_NO_KERNEL_MAPPING, |
| 19 | DMA_ATTR_SKIP_CPU_SYNC, | 19 | DMA_ATTR_SKIP_CPU_SYNC, |
| 20 | DMA_ATTR_FORCE_CONTIGUOUS, | ||
| 20 | DMA_ATTR_MAX, | 21 | DMA_ATTR_MAX, |
| 21 | }; | 22 | }; |
| 22 | 23 | ||
diff --git a/include/linux/kref.h b/include/linux/kref.h index 65af6887872..4972e6e9ca9 100644 --- a/include/linux/kref.h +++ b/include/linux/kref.h | |||
| @@ -111,4 +111,25 @@ static inline int kref_put_mutex(struct kref *kref, | |||
| 111 | } | 111 | } |
| 112 | return 0; | 112 | return 0; |
| 113 | } | 113 | } |
| 114 | |||
| 115 | /** | ||
| 116 | * kref_get_unless_zero - Increment refcount for object unless it is zero. | ||
| 117 | * @kref: object. | ||
| 118 | * | ||
| 119 | * Return non-zero if the increment succeeded. Otherwise return 0. | ||
| 120 | * | ||
| 121 | * This function is intended to simplify locking around refcounting for | ||
| 122 | * objects that can be looked up from a lookup structure, and which are | ||
| 123 | * removed from that lookup structure in the object destructor. | ||
| 124 | * Operations on such objects require at least a read lock around | ||
| 125 | * lookup + kref_get, and a write lock around kref_put + remove from lookup | ||
| 126 | * structure. Furthermore, RCU implementations become extremely tricky. | ||
| 127 | * With a lookup followed by a kref_get_unless_zero *with return value check* | ||
| 128 | * locking in the kref_put path can be deferred to the actual removal from | ||
| 129 | * the lookup structure and RCU lookups become trivial. | ||
| 130 | */ | ||
| 131 | static inline int __must_check kref_get_unless_zero(struct kref *kref) | ||
| 132 | { | ||
| 133 | return atomic_add_unless(&kref->refcount, 1, 0); | ||
| 134 | } | ||
| 114 | #endif /* _KREF_H_ */ | 135 | #endif /* _KREF_H_ */ |
