kref.h (290335) | kref.h (300497) |
---|---|
1/*- 2 * Copyright (c) 2010 Isilon Systems, Inc. 3 * Copyright (c) 2010 iX Systems, Inc. 4 * Copyright (c) 2010 Panasas, Inc. 5 * Copyright (c) 2013-2015 Mellanox Technologies, Ltd. 6 * Copyright (c) 2013 Fran��ois Tigeot 7 * All rights reserved. 8 * --- 13 unchanged lines hidden (view full) --- 22 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 23 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 24 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 28 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 * | 1/*- 2 * Copyright (c) 2010 Isilon Systems, Inc. 3 * Copyright (c) 2010 iX Systems, Inc. 4 * Copyright (c) 2010 Panasas, Inc. 5 * Copyright (c) 2013-2015 Mellanox Technologies, Ltd. 6 * Copyright (c) 2013 Fran��ois Tigeot 7 * All rights reserved. 8 * --- 13 unchanged lines hidden (view full) --- 22 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 23 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 24 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 28 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 * |
30 * $FreeBSD: head/sys/compat/linuxkpi/common/include/linux/kref.h 290335 2015-11-03 12:37:55Z hselasky $ | 30 * $FreeBSD: head/sys/compat/linuxkpi/common/include/linux/kref.h 300497 2016-05-23 12:06:34Z hselasky $ |
31 */ 32#ifndef _LINUX_KREF_H_ 33#define _LINUX_KREF_H_ 34 35#include <sys/types.h> 36#include <sys/refcount.h> 37 38#include <linux/compiler.h> | 31 */ 32#ifndef _LINUX_KREF_H_ 33#define _LINUX_KREF_H_ 34 35#include <sys/types.h> 36#include <sys/refcount.h> 37 38#include <linux/compiler.h> |
39#include <linux/kernel.h> 40#include <linux/mutex.h> 41 |
|
39#include <asm/atomic.h> 40 41struct kref { 42 atomic_t refcount; 43}; 44 45static inline void 46kref_init(struct kref *kref) --- 36 unchanged lines hidden (view full) --- 83 84static inline int __must_check 85kref_get_unless_zero(struct kref *kref) 86{ 87 88 return atomic_add_unless(&kref->refcount, 1, 0); 89} 90 | 42#include <asm/atomic.h> 43 44struct kref { 45 atomic_t refcount; 46}; 47 48static inline void 49kref_init(struct kref *kref) --- 36 unchanged lines hidden (view full) --- 86 87static inline int __must_check 88kref_get_unless_zero(struct kref *kref) 89{ 90 91 return atomic_add_unless(&kref->refcount, 1, 0); 92} 93 |
94static inline int kref_put_mutex(struct kref *kref, 95 void (*release)(struct kref *kref), struct mutex *lock) 96{ 97 WARN_ON(release == NULL); 98 if (unlikely(!atomic_add_unless(&kref->refcount, -1, 1))) { 99 mutex_lock(lock); 100 if (unlikely(!atomic_dec_and_test(&kref->refcount))) { 101 mutex_unlock(lock); 102 return 0; 103 } 104 release(kref); 105 return 1; 106 } 107 return 0; 108} 109 |
|
91#endif /* _LINUX_KREF_H_ */ | 110#endif /* _LINUX_KREF_H_ */ |