VisionFive2 Linux kernel

StarFive Tech Linux Kernel for VisionFive (JH7110) boards (mirror)

More than 9999 Commits   32 Branches   54 Tags
b24413180f560 (Greg Kroah-Hartman    2017-11-01 15:07:57 +0100   1) // SPDX-License-Identifier: GPL-2.0
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700   2) #include <linux/export.h>
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700   3) #include <linux/lockref.h>
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700   4) 
57f4257eae33e (Peter Zijlstra        2013-11-14 14:31:54 -0800   5) #if USE_CMPXCHG_LOCKREF
bc08b449ee14a (Linus Torvalds        2013-09-02 12:12:15 -0700   6) 
bc08b449ee14a (Linus Torvalds        2013-09-02 12:12:15 -0700   7) /*
bc08b449ee14a (Linus Torvalds        2013-09-02 12:12:15 -0700   8)  * Note that the "cmpxchg()" reloads the "old" value for the
bc08b449ee14a (Linus Torvalds        2013-09-02 12:12:15 -0700   9)  * failure case.
bc08b449ee14a (Linus Torvalds        2013-09-02 12:12:15 -0700  10)  */
bc08b449ee14a (Linus Torvalds        2013-09-02 12:12:15 -0700  11) #define CMPXCHG_LOOP(CODE, SUCCESS) do {					\
893a7d32e8e04 (Jan Glauber           2019-06-05 15:48:49 +0200  12) 	int retry = 100;							\
bc08b449ee14a (Linus Torvalds        2013-09-02 12:12:15 -0700  13) 	struct lockref old;							\
bc08b449ee14a (Linus Torvalds        2013-09-02 12:12:15 -0700  14) 	BUILD_BUG_ON(sizeof(old) != 8);						\
4d3199e4ca8e6 (Davidlohr Bueso       2015-02-22 19:31:41 -0800  15) 	old.lock_count = READ_ONCE(lockref->lock_count);			\
bc08b449ee14a (Linus Torvalds        2013-09-02 12:12:15 -0700  16) 	while (likely(arch_spin_value_unlocked(old.lock.rlock.raw_lock))) {  	\
bc08b449ee14a (Linus Torvalds        2013-09-02 12:12:15 -0700  17) 		struct lockref new = old, prev = old;				\
bc08b449ee14a (Linus Torvalds        2013-09-02 12:12:15 -0700  18) 		CODE								\
d2212b4dce596 (Will Deacon           2013-09-26 17:27:00 +0100  19) 		old.lock_count = cmpxchg64_relaxed(&lockref->lock_count,	\
d2212b4dce596 (Will Deacon           2013-09-26 17:27:00 +0100  20) 						   old.lock_count,		\
d2212b4dce596 (Will Deacon           2013-09-26 17:27:00 +0100  21) 						   new.lock_count);		\
bc08b449ee14a (Linus Torvalds        2013-09-02 12:12:15 -0700  22) 		if (likely(old.lock_count == prev.lock_count)) {		\
bc08b449ee14a (Linus Torvalds        2013-09-02 12:12:15 -0700  23) 			SUCCESS;						\
bc08b449ee14a (Linus Torvalds        2013-09-02 12:12:15 -0700  24) 		}								\
893a7d32e8e04 (Jan Glauber           2019-06-05 15:48:49 +0200  25) 		if (!--retry)							\
893a7d32e8e04 (Jan Glauber           2019-06-05 15:48:49 +0200  26) 			break;							\
f2f09a4cee350 (Christian Borntraeger 2016-10-25 11:03:14 +0200  27) 		cpu_relax();							\
bc08b449ee14a (Linus Torvalds        2013-09-02 12:12:15 -0700  28) 	}									\
bc08b449ee14a (Linus Torvalds        2013-09-02 12:12:15 -0700  29) } while (0)
bc08b449ee14a (Linus Torvalds        2013-09-02 12:12:15 -0700  30) 
bc08b449ee14a (Linus Torvalds        2013-09-02 12:12:15 -0700  31) #else
bc08b449ee14a (Linus Torvalds        2013-09-02 12:12:15 -0700  32) 
bc08b449ee14a (Linus Torvalds        2013-09-02 12:12:15 -0700  33) #define CMPXCHG_LOOP(CODE, SUCCESS) do { } while (0)
bc08b449ee14a (Linus Torvalds        2013-09-02 12:12:15 -0700  34) 
bc08b449ee14a (Linus Torvalds        2013-09-02 12:12:15 -0700  35) #endif
bc08b449ee14a (Linus Torvalds        2013-09-02 12:12:15 -0700  36) 
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700  37) /**
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700  38)  * lockref_get - Increments reference count unconditionally
44a0cf92926c3 (Linus Torvalds        2013-09-07 15:30:29 -0700  39)  * @lockref: pointer to lockref structure
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700  40)  *
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700  41)  * This operation is only valid if you already hold a reference
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700  42)  * to the object, so you know the count cannot be zero.
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700  43)  */
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700  44) void lockref_get(struct lockref *lockref)
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700  45) {
bc08b449ee14a (Linus Torvalds        2013-09-02 12:12:15 -0700  46) 	CMPXCHG_LOOP(
bc08b449ee14a (Linus Torvalds        2013-09-02 12:12:15 -0700  47) 		new.count++;
bc08b449ee14a (Linus Torvalds        2013-09-02 12:12:15 -0700  48) 	,
bc08b449ee14a (Linus Torvalds        2013-09-02 12:12:15 -0700  49) 		return;
bc08b449ee14a (Linus Torvalds        2013-09-02 12:12:15 -0700  50) 	);
bc08b449ee14a (Linus Torvalds        2013-09-02 12:12:15 -0700  51) 
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700  52) 	spin_lock(&lockref->lock);
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700  53) 	lockref->count++;
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700  54) 	spin_unlock(&lockref->lock);
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700  55) }
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700  56) EXPORT_SYMBOL(lockref_get);
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700  57) 
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700  58) /**
360f54796ed65 (Linus Torvalds        2015-01-09 15:19:03 -0800  59)  * lockref_get_not_zero - Increments count unless the count is 0 or dead
44a0cf92926c3 (Linus Torvalds        2013-09-07 15:30:29 -0700  60)  * @lockref: pointer to lockref structure
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700  61)  * Return: 1 if count updated successfully or 0 if count was zero
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700  62)  */
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700  63) int lockref_get_not_zero(struct lockref *lockref)
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700  64) {
bc08b449ee14a (Linus Torvalds        2013-09-02 12:12:15 -0700  65) 	int retval;
bc08b449ee14a (Linus Torvalds        2013-09-02 12:12:15 -0700  66) 
bc08b449ee14a (Linus Torvalds        2013-09-02 12:12:15 -0700  67) 	CMPXCHG_LOOP(
bc08b449ee14a (Linus Torvalds        2013-09-02 12:12:15 -0700  68) 		new.count++;
360f54796ed65 (Linus Torvalds        2015-01-09 15:19:03 -0800  69) 		if (old.count <= 0)
bc08b449ee14a (Linus Torvalds        2013-09-02 12:12:15 -0700  70) 			return 0;
bc08b449ee14a (Linus Torvalds        2013-09-02 12:12:15 -0700  71) 	,
bc08b449ee14a (Linus Torvalds        2013-09-02 12:12:15 -0700  72) 		return 1;
bc08b449ee14a (Linus Torvalds        2013-09-02 12:12:15 -0700  73) 	);
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700  74) 
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700  75) 	spin_lock(&lockref->lock);
bc08b449ee14a (Linus Torvalds        2013-09-02 12:12:15 -0700  76) 	retval = 0;
360f54796ed65 (Linus Torvalds        2015-01-09 15:19:03 -0800  77) 	if (lockref->count > 0) {
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700  78) 		lockref->count++;
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700  79) 		retval = 1;
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700  80) 	}
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700  81) 	spin_unlock(&lockref->lock);
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700  82) 	return retval;
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700  83) }
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700  84) EXPORT_SYMBOL(lockref_get_not_zero);
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700  85) 
450b1f6f56350 (Andreas Gruenbacher   2018-03-29 08:07:46 +0100  86) /**
450b1f6f56350 (Andreas Gruenbacher   2018-03-29 08:07:46 +0100  87)  * lockref_put_not_zero - Decrements count unless count <= 1 before decrement
450b1f6f56350 (Andreas Gruenbacher   2018-03-29 08:07:46 +0100  88)  * @lockref: pointer to lockref structure
450b1f6f56350 (Andreas Gruenbacher   2018-03-29 08:07:46 +0100  89)  * Return: 1 if count updated successfully or 0 if count would become zero
450b1f6f56350 (Andreas Gruenbacher   2018-03-29 08:07:46 +0100  90)  */
450b1f6f56350 (Andreas Gruenbacher   2018-03-29 08:07:46 +0100  91) int lockref_put_not_zero(struct lockref *lockref)
450b1f6f56350 (Andreas Gruenbacher   2018-03-29 08:07:46 +0100  92) {
450b1f6f56350 (Andreas Gruenbacher   2018-03-29 08:07:46 +0100  93) 	int retval;
450b1f6f56350 (Andreas Gruenbacher   2018-03-29 08:07:46 +0100  94) 
450b1f6f56350 (Andreas Gruenbacher   2018-03-29 08:07:46 +0100  95) 	CMPXCHG_LOOP(
450b1f6f56350 (Andreas Gruenbacher   2018-03-29 08:07:46 +0100  96) 		new.count--;
450b1f6f56350 (Andreas Gruenbacher   2018-03-29 08:07:46 +0100  97) 		if (old.count <= 1)
450b1f6f56350 (Andreas Gruenbacher   2018-03-29 08:07:46 +0100  98) 			return 0;
450b1f6f56350 (Andreas Gruenbacher   2018-03-29 08:07:46 +0100  99) 	,
450b1f6f56350 (Andreas Gruenbacher   2018-03-29 08:07:46 +0100 100) 		return 1;
450b1f6f56350 (Andreas Gruenbacher   2018-03-29 08:07:46 +0100 101) 	);
450b1f6f56350 (Andreas Gruenbacher   2018-03-29 08:07:46 +0100 102) 
450b1f6f56350 (Andreas Gruenbacher   2018-03-29 08:07:46 +0100 103) 	spin_lock(&lockref->lock);
450b1f6f56350 (Andreas Gruenbacher   2018-03-29 08:07:46 +0100 104) 	retval = 0;
450b1f6f56350 (Andreas Gruenbacher   2018-03-29 08:07:46 +0100 105) 	if (lockref->count > 1) {
450b1f6f56350 (Andreas Gruenbacher   2018-03-29 08:07:46 +0100 106) 		lockref->count--;
450b1f6f56350 (Andreas Gruenbacher   2018-03-29 08:07:46 +0100 107) 		retval = 1;
450b1f6f56350 (Andreas Gruenbacher   2018-03-29 08:07:46 +0100 108) 	}
450b1f6f56350 (Andreas Gruenbacher   2018-03-29 08:07:46 +0100 109) 	spin_unlock(&lockref->lock);
450b1f6f56350 (Andreas Gruenbacher   2018-03-29 08:07:46 +0100 110) 	return retval;
450b1f6f56350 (Andreas Gruenbacher   2018-03-29 08:07:46 +0100 111) }
450b1f6f56350 (Andreas Gruenbacher   2018-03-29 08:07:46 +0100 112) EXPORT_SYMBOL(lockref_put_not_zero);
450b1f6f56350 (Andreas Gruenbacher   2018-03-29 08:07:46 +0100 113) 
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700 114) /**
360f54796ed65 (Linus Torvalds        2015-01-09 15:19:03 -0800 115)  * lockref_get_or_lock - Increments count unless the count is 0 or dead
44a0cf92926c3 (Linus Torvalds        2013-09-07 15:30:29 -0700 116)  * @lockref: pointer to lockref structure
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700 117)  * Return: 1 if count updated successfully or 0 if count was zero
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700 118)  * and we got the lock instead.
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700 119)  */
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700 120) int lockref_get_or_lock(struct lockref *lockref)
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700 121) {
bc08b449ee14a (Linus Torvalds        2013-09-02 12:12:15 -0700 122) 	CMPXCHG_LOOP(
bc08b449ee14a (Linus Torvalds        2013-09-02 12:12:15 -0700 123) 		new.count++;
360f54796ed65 (Linus Torvalds        2015-01-09 15:19:03 -0800 124) 		if (old.count <= 0)
bc08b449ee14a (Linus Torvalds        2013-09-02 12:12:15 -0700 125) 			break;
bc08b449ee14a (Linus Torvalds        2013-09-02 12:12:15 -0700 126) 	,
bc08b449ee14a (Linus Torvalds        2013-09-02 12:12:15 -0700 127) 		return 1;
bc08b449ee14a (Linus Torvalds        2013-09-02 12:12:15 -0700 128) 	);
bc08b449ee14a (Linus Torvalds        2013-09-02 12:12:15 -0700 129) 
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700 130) 	spin_lock(&lockref->lock);
360f54796ed65 (Linus Torvalds        2015-01-09 15:19:03 -0800 131) 	if (lockref->count <= 0)
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700 132) 		return 0;
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700 133) 	lockref->count++;
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700 134) 	spin_unlock(&lockref->lock);
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700 135) 	return 1;
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700 136) }
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700 137) EXPORT_SYMBOL(lockref_get_or_lock);
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700 138) 
360f54796ed65 (Linus Torvalds        2015-01-09 15:19:03 -0800 139) /**
360f54796ed65 (Linus Torvalds        2015-01-09 15:19:03 -0800 140)  * lockref_put_return - Decrement reference count if possible
360f54796ed65 (Linus Torvalds        2015-01-09 15:19:03 -0800 141)  * @lockref: pointer to lockref structure
360f54796ed65 (Linus Torvalds        2015-01-09 15:19:03 -0800 142)  *
360f54796ed65 (Linus Torvalds        2015-01-09 15:19:03 -0800 143)  * Decrement the reference count and return the new value.
360f54796ed65 (Linus Torvalds        2015-01-09 15:19:03 -0800 144)  * If the lockref was dead or locked, return an error.
360f54796ed65 (Linus Torvalds        2015-01-09 15:19:03 -0800 145)  */
360f54796ed65 (Linus Torvalds        2015-01-09 15:19:03 -0800 146) int lockref_put_return(struct lockref *lockref)
360f54796ed65 (Linus Torvalds        2015-01-09 15:19:03 -0800 147) {
360f54796ed65 (Linus Torvalds        2015-01-09 15:19:03 -0800 148) 	CMPXCHG_LOOP(
360f54796ed65 (Linus Torvalds        2015-01-09 15:19:03 -0800 149) 		new.count--;
360f54796ed65 (Linus Torvalds        2015-01-09 15:19:03 -0800 150) 		if (old.count <= 0)
360f54796ed65 (Linus Torvalds        2015-01-09 15:19:03 -0800 151) 			return -1;
360f54796ed65 (Linus Torvalds        2015-01-09 15:19:03 -0800 152) 	,
360f54796ed65 (Linus Torvalds        2015-01-09 15:19:03 -0800 153) 		return new.count;
360f54796ed65 (Linus Torvalds        2015-01-09 15:19:03 -0800 154) 	);
360f54796ed65 (Linus Torvalds        2015-01-09 15:19:03 -0800 155) 	return -1;
360f54796ed65 (Linus Torvalds        2015-01-09 15:19:03 -0800 156) }
360f54796ed65 (Linus Torvalds        2015-01-09 15:19:03 -0800 157) EXPORT_SYMBOL(lockref_put_return);
360f54796ed65 (Linus Torvalds        2015-01-09 15:19:03 -0800 158) 
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700 159) /**
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700 160)  * lockref_put_or_lock - decrements count unless count <= 1 before decrement
44a0cf92926c3 (Linus Torvalds        2013-09-07 15:30:29 -0700 161)  * @lockref: pointer to lockref structure
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700 162)  * Return: 1 if count updated successfully or 0 if count <= 1 and lock taken
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700 163)  */
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700 164) int lockref_put_or_lock(struct lockref *lockref)
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700 165) {
bc08b449ee14a (Linus Torvalds        2013-09-02 12:12:15 -0700 166) 	CMPXCHG_LOOP(
bc08b449ee14a (Linus Torvalds        2013-09-02 12:12:15 -0700 167) 		new.count--;
bc08b449ee14a (Linus Torvalds        2013-09-02 12:12:15 -0700 168) 		if (old.count <= 1)
bc08b449ee14a (Linus Torvalds        2013-09-02 12:12:15 -0700 169) 			break;
bc08b449ee14a (Linus Torvalds        2013-09-02 12:12:15 -0700 170) 	,
bc08b449ee14a (Linus Torvalds        2013-09-02 12:12:15 -0700 171) 		return 1;
bc08b449ee14a (Linus Torvalds        2013-09-02 12:12:15 -0700 172) 	);
bc08b449ee14a (Linus Torvalds        2013-09-02 12:12:15 -0700 173) 
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700 174) 	spin_lock(&lockref->lock);
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700 175) 	if (lockref->count <= 1)
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700 176) 		return 0;
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700 177) 	lockref->count--;
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700 178) 	spin_unlock(&lockref->lock);
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700 179) 	return 1;
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700 180) }
2f4f12e571c4e (Linus Torvalds        2013-09-02 11:58:20 -0700 181) EXPORT_SYMBOL(lockref_put_or_lock);
e7d33bb5ea829 (Linus Torvalds        2013-09-07 15:49:18 -0700 182) 
e7d33bb5ea829 (Linus Torvalds        2013-09-07 15:49:18 -0700 183) /**
e7d33bb5ea829 (Linus Torvalds        2013-09-07 15:49:18 -0700 184)  * lockref_mark_dead - mark lockref dead
e7d33bb5ea829 (Linus Torvalds        2013-09-07 15:49:18 -0700 185)  * @lockref: pointer to lockref structure
e7d33bb5ea829 (Linus Torvalds        2013-09-07 15:49:18 -0700 186)  */
e7d33bb5ea829 (Linus Torvalds        2013-09-07 15:49:18 -0700 187) void lockref_mark_dead(struct lockref *lockref)
e7d33bb5ea829 (Linus Torvalds        2013-09-07 15:49:18 -0700 188) {
e7d33bb5ea829 (Linus Torvalds        2013-09-07 15:49:18 -0700 189) 	assert_spin_locked(&lockref->lock);
e7d33bb5ea829 (Linus Torvalds        2013-09-07 15:49:18 -0700 190) 	lockref->count = -128;
e7d33bb5ea829 (Linus Torvalds        2013-09-07 15:49:18 -0700 191) }
e66cf161098a6 (Steven Whitehouse     2013-10-15 15:18:08 +0100 192) EXPORT_SYMBOL(lockref_mark_dead);
e7d33bb5ea829 (Linus Torvalds        2013-09-07 15:49:18 -0700 193) 
e7d33bb5ea829 (Linus Torvalds        2013-09-07 15:49:18 -0700 194) /**
e7d33bb5ea829 (Linus Torvalds        2013-09-07 15:49:18 -0700 195)  * lockref_get_not_dead - Increments count unless the ref is dead
e7d33bb5ea829 (Linus Torvalds        2013-09-07 15:49:18 -0700 196)  * @lockref: pointer to lockref structure
e7d33bb5ea829 (Linus Torvalds        2013-09-07 15:49:18 -0700 197)  * Return: 1 if count updated successfully or 0 if lockref was dead
e7d33bb5ea829 (Linus Torvalds        2013-09-07 15:49:18 -0700 198)  */
e7d33bb5ea829 (Linus Torvalds        2013-09-07 15:49:18 -0700 199) int lockref_get_not_dead(struct lockref *lockref)
e7d33bb5ea829 (Linus Torvalds        2013-09-07 15:49:18 -0700 200) {
e7d33bb5ea829 (Linus Torvalds        2013-09-07 15:49:18 -0700 201) 	int retval;
e7d33bb5ea829 (Linus Torvalds        2013-09-07 15:49:18 -0700 202) 
e7d33bb5ea829 (Linus Torvalds        2013-09-07 15:49:18 -0700 203) 	CMPXCHG_LOOP(
e7d33bb5ea829 (Linus Torvalds        2013-09-07 15:49:18 -0700 204) 		new.count++;
360f54796ed65 (Linus Torvalds        2015-01-09 15:19:03 -0800 205) 		if (old.count < 0)
e7d33bb5ea829 (Linus Torvalds        2013-09-07 15:49:18 -0700 206) 			return 0;
e7d33bb5ea829 (Linus Torvalds        2013-09-07 15:49:18 -0700 207) 	,
e7d33bb5ea829 (Linus Torvalds        2013-09-07 15:49:18 -0700 208) 		return 1;
e7d33bb5ea829 (Linus Torvalds        2013-09-07 15:49:18 -0700 209) 	);
e7d33bb5ea829 (Linus Torvalds        2013-09-07 15:49:18 -0700 210) 
e7d33bb5ea829 (Linus Torvalds        2013-09-07 15:49:18 -0700 211) 	spin_lock(&lockref->lock);
e7d33bb5ea829 (Linus Torvalds        2013-09-07 15:49:18 -0700 212) 	retval = 0;
360f54796ed65 (Linus Torvalds        2015-01-09 15:19:03 -0800 213) 	if (lockref->count >= 0) {
e7d33bb5ea829 (Linus Torvalds        2013-09-07 15:49:18 -0700 214) 		lockref->count++;
e7d33bb5ea829 (Linus Torvalds        2013-09-07 15:49:18 -0700 215) 		retval = 1;
e7d33bb5ea829 (Linus Torvalds        2013-09-07 15:49:18 -0700 216) 	}
e7d33bb5ea829 (Linus Torvalds        2013-09-07 15:49:18 -0700 217) 	spin_unlock(&lockref->lock);
e7d33bb5ea829 (Linus Torvalds        2013-09-07 15:49:18 -0700 218) 	return retval;
e7d33bb5ea829 (Linus Torvalds        2013-09-07 15:49:18 -0700 219) }
e7d33bb5ea829 (Linus Torvalds        2013-09-07 15:49:18 -0700 220) EXPORT_SYMBOL(lockref_get_not_dead);