PERFORCE change 39687 for review
Sam Leffler
sam at FreeBSD.org
Tue Oct 14 06:53:51 PDT 2003
http://perforce.freebsd.org/chv.cgi?CH=39687
Change 39687 by sam at sam_ebb on 2003/10/14 06:53:17
parameterize locking to improve portability and possible
change to different locking strategies
Affected files ...
.. //depot/projects/netperf/sys/net80211/ieee80211_node.c#11 edit
.. //depot/projects/netperf/sys/net80211/ieee80211_node.h#8 edit
.. //depot/projects/netperf/sys/net80211/ieee80211_proto.c#5 edit
Differences ...
==== //depot/projects/netperf/sys/net80211/ieee80211_node.c#11 (text+ko) ====
@@ -86,7 +86,7 @@
struct ieee80211com *ic = (void *)ifp;
/* XXX need unit */
- mtx_init(&ic->ic_nodelock, ifp->if_name, "802.11 node table", MTX_DEF);
+ IEEE80211_NODE_LOCK_INIT(ic, ifp->if_name);
TAILQ_INIT(&ic->ic_node);
ic->ic_node_alloc = ieee80211_node_alloc;
ic->ic_node_free = ieee80211_node_free;
@@ -113,7 +113,7 @@
if (ic->ic_bss != NULL)
(*ic->ic_node_free)(ic, ic->ic_bss);
ieee80211_free_allnodes(ic);
- mtx_destroy(&ic->ic_nodelock);
+ IEEE80211_NODE_LOCK_DESTROY(ic);
}
/*
@@ -431,7 +431,7 @@
IEEE80211_ADDR_COPY(ni->ni_macaddr, macaddr);
hash = IEEE80211_NODE_HASH(macaddr);
ni->ni_refcnt = 1; /* mark referenced */
- mtx_lock(&ic->ic_nodelock);
+ IEEE80211_NODE_LOCK(ic);
TAILQ_INSERT_TAIL(&ic->ic_node, ni, ni_list);
LIST_INSERT_HEAD(&ic->ic_hash[hash], ni, ni_hash);
/*
@@ -445,7 +445,7 @@
*/
if (ic->ic_opmode != IEEE80211_M_STA)
ic->ic_inact_timer = IEEE80211_INACT_WAIT;
- mtx_unlock(&ic->ic_nodelock);
+ IEEE80211_NODE_UNLOCK(ic);
}
struct ieee80211_node *
@@ -475,14 +475,14 @@
int hash;
hash = IEEE80211_NODE_HASH(macaddr);
- mtx_lock(&ic->ic_nodelock);
+ IEEE80211_NODE_LOCK(ic);
LIST_FOREACH(ni, &ic->ic_hash[hash], ni_hash) {
if (IEEE80211_ADDR_EQ(ni->ni_macaddr, macaddr)) {
atomic_add_int(&ni->ni_refcnt, 1); /* mark referenced */
break;
}
}
- mtx_unlock(&ic->ic_nodelock);
+ IEEE80211_NODE_UNLOCK(ic);
return ni;
}
@@ -497,14 +497,14 @@
int hash;
hash = IEEE80211_NODE_HASH(macaddr);
- mtx_lock(&ic->ic_nodelock);
+ IEEE80211_NODE_LOCK(ic);
LIST_FOREACH(ni, &ic->ic_hash[hash], ni_hash) {
if (IEEE80211_ADDR_EQ(ni->ni_macaddr, macaddr) && ni->ni_chan == chan) {
atomic_add_int(&ni->ni_refcnt, 1);/* mark referenced */
break;
}
}
- mtx_unlock(&ic->ic_nodelock);
+ IEEE80211_NODE_UNLOCK(ic);
return ni;
}
@@ -528,9 +528,9 @@
/* XXX need equivalent of atomic_dec_and_test */
atomic_subtract_int(&ni->ni_refcnt, 1);
if (atomic_cmpset_int(&ni->ni_refcnt, 0, 1)) {
- mtx_lock(&ic->ic_nodelock);
+ IEEE80211_NODE_LOCK(ic);
_ieee80211_free_node(ic, ni);
- mtx_unlock(&ic->ic_nodelock);
+ IEEE80211_NODE_UNLOCK(ic);
}
}
@@ -539,10 +539,10 @@
{
struct ieee80211_node *ni;
- mtx_lock(&ic->ic_nodelock);
+ IEEE80211_NODE_LOCK(ic);
while ((ni = TAILQ_FIRST(&ic->ic_node)) != NULL)
_ieee80211_free_node(ic, ni);
- mtx_unlock(&ic->ic_nodelock);
+ IEEE80211_NODE_UNLOCK(ic);
}
/*
@@ -561,7 +561,7 @@
u_int gen = ic->ic_scangen++; /* NB: ok 'cuz single-threaded*/
restart:
- mtx_lock(&ic->ic_nodelock);
+ IEEE80211_NODE_LOCK(ic);
TAILQ_FOREACH(ni, &ic->ic_node, ni_list) {
if (ni->ni_scangen == gen) /* previously handled */
continue;
@@ -579,7 +579,7 @@
* a lock, as this will result in a LOR between the
* node lock and the driver lock.
*/
- mtx_unlock(&ic->ic_nodelock);
+ IEEE80211_NODE_UNLOCK(ic);
IEEE80211_SEND_MGMT(ic, ni,
IEEE80211_FC0_SUBTYPE_DEAUTH,
IEEE80211_REASON_AUTH_EXPIRE);
@@ -590,7 +590,7 @@
}
if (!TAILQ_EMPTY(&ic->ic_node))
ic->ic_inact_timer = IEEE80211_INACT_WAIT;
- mtx_unlock(&ic->ic_nodelock);
+ IEEE80211_NODE_UNLOCK(ic);
}
void
@@ -598,8 +598,8 @@
{
struct ieee80211_node *ni;
- mtx_lock(&ic->ic_nodelock);
+ IEEE80211_NODE_LOCK(ic);
TAILQ_FOREACH(ni, &ic->ic_node, ni_list)
(*f)(arg, ni);
- mtx_unlock(&ic->ic_nodelock);
+ IEEE80211_NODE_UNLOCK(ic);
}
==== //depot/projects/netperf/sys/net80211/ieee80211_node.h#8 (text+ko) ====
@@ -118,6 +118,14 @@
*ni = NULL; /* guard against use */
}
+#define IEEE80211_NODE_LOCK_INIT(_ic, _name) \
+ mtx_init(&(_ic)->ic_nodelock, _name, "802.11 node table", MTX_DEF)
+#define IEEE80211_NODE_LOCK_DESTROY(_ic) mtx_destroy(&(_ic)->ic_nodelock)
+#define IEEE80211_NODE_LOCK(_ic) mtx_lock(&(_ic)->ic_nodelock)
+#define IEEE80211_NODE_UNLOCK(_ic) mtx_unlock(&(_ic)->ic_nodelock)
+#define IEEE80211_NODE_LOCK_ASSERT(_ic) \
+ mtx_assert(&(_ic)->ic_nodelock, MA_OWNED)
+
struct ieee80211com;
extern void ieee80211_node_attach(struct ifnet *);
==== //depot/projects/netperf/sys/net80211/ieee80211_proto.c#5 (text+ko) ====
@@ -321,7 +321,7 @@
IEEE80211_REASON_ASSOC_LEAVE);
break;
case IEEE80211_M_HOSTAP:
- mtx_lock(&ic->ic_nodelock);
+ IEEE80211_NODE_LOCK(ic);
TAILQ_FOREACH(ni, &ic->ic_node, ni_list) {
if (ni->ni_associd == 0)
continue;
@@ -329,7 +329,7 @@
IEEE80211_FC0_SUBTYPE_DISASSOC,
IEEE80211_REASON_ASSOC_LEAVE);
}
- mtx_unlock(&ic->ic_nodelock);
+ IEEE80211_NODE_UNLOCK(ic);
break;
default:
break;
@@ -343,13 +343,13 @@
IEEE80211_REASON_AUTH_LEAVE);
break;
case IEEE80211_M_HOSTAP:
- mtx_lock(&ic->ic_nodelock);
+ IEEE80211_NODE_LOCK(ic);
TAILQ_FOREACH(ni, &ic->ic_node, ni_list) {
IEEE80211_SEND_MGMT(ic, ni,
IEEE80211_FC0_SUBTYPE_DEAUTH,
IEEE80211_REASON_AUTH_LEAVE);
}
- mtx_unlock(&ic->ic_nodelock);
+ IEEE80211_NODE_UNLOCK(ic);
break;
default:
break;
More information about the p4-projects
mailing list