net80211: fix ieee80211_node_dectestref().

* sync with FreeBSD.
* implement atomic_cmpset_int() with atomic_test_and_set().
This commit is contained in:
Jérôme Duval
2018-05-31 19:19:50 +00:00
parent 499712a9ec
commit 379d232693
3 changed files with 10 additions and 3 deletions
@@ -24,6 +24,9 @@
#define atomic_readandclear_int(ptr) \ #define atomic_readandclear_int(ptr) \
atomic_set((int32 *)(ptr), 0) atomic_set((int32 *)(ptr), 0)
#define atomic_cmpset_int(ptr, old, new) \
(atomic_test_and_set((int32 *)(ptr), new, old) == old)
#define mb() memory_full_barrier() #define mb() memory_full_barrier()
#define wmb() memory_write_barrier_inline() #define wmb() memory_write_barrier_inline()
@@ -24,4 +24,8 @@
#define atomic_readandclear_int(ptr) \ #define atomic_readandclear_int(ptr) \
atomic_set((int32 *)(ptr), 0) atomic_set((int32 *)(ptr), 0)
#define atomic_cmpset_int(ptr, old, new) \
(atomic_test_and_set((int32 *)(ptr), new, old) == old)
#endif /* _FBSD_COMPAT_MACHINE_ATOMIC_H_ */ #endif /* _FBSD_COMPAT_MACHINE_ATOMIC_H_ */
@@ -454,7 +454,7 @@ ieee80211_getmgtframe(uint8_t** frm, int headroom, int pktlen)
/* /*
* Decrements the reference-counter and * Decrements the reference-counter and
* tests whether it became zero. * tests whether it became zero. If so, sets it to one.
* *
* @return 1 reference-counter became zero * @return 1 reference-counter became zero
* @return 0 reference-counter didn't became zero * @return 0 reference-counter didn't became zero
@@ -462,8 +462,8 @@ ieee80211_getmgtframe(uint8_t** frm, int headroom, int pktlen)
int int
ieee80211_node_dectestref(struct ieee80211_node* ni) ieee80211_node_dectestref(struct ieee80211_node* ni)
{ {
// atomic_add returns old value atomic_subtract_int(&ni->ni_refcnt, 1);
return atomic_add((int32*)&ni->ni_refcnt, -1) == 1; return atomic_cmpset_int(&ni->ni_refcnt, 0, 1);
} }