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);