From owner-p4-projects@FreeBSD.ORG Wed Dec 1 20:13:42 2004 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 4AA9B16A4D0; Wed, 1 Dec 2004 20:13:42 +0000 (GMT) Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 102C316A4CE for ; Wed, 1 Dec 2004 20:13:42 +0000 (GMT) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id E977843D1D for ; Wed, 1 Dec 2004 20:13:41 +0000 (GMT) (envelope-from sam@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.1/8.13.1) with ESMTP id iB1KDfXq009413 for ; Wed, 1 Dec 2004 20:13:41 GMT (envelope-from sam@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.1/8.13.1/Submit) id iB1KDfuF009410 for perforce@freebsd.org; Wed, 1 Dec 2004 20:13:41 GMT (envelope-from sam@freebsd.org) Date: Wed, 1 Dec 2004 20:13:41 GMT Message-Id: <200412012013.iB1KDfuF009410@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to sam@freebsd.org using -f From: Sam Leffler To: Perforce Change Reviews Subject: PERFORCE change 66208 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 01 Dec 2004 20:13:42 -0000 http://perforce.freebsd.org/chv.cgi?CH=66208 Change 66208 by sam@sam_ebb on 2004/12/01 20:13:14 add a mutex around nt_scangen so we can reuse it when doing arbitary node table scans Affected files ... .. //depot/projects/wifi/sys/net80211/ieee80211_freebsd.h#8 edit .. //depot/projects/wifi/sys/net80211/ieee80211_node.c#20 edit .. //depot/projects/wifi/sys/net80211/ieee80211_node.h#13 edit Differences ... ==== //depot/projects/wifi/sys/net80211/ieee80211_freebsd.h#8 (text+ko) ==== @@ -54,6 +54,18 @@ mtx_assert(&(_nt)->nt_nodelock, MA_OWNED) /* + * Node table scangen locking definitions. + */ +typedef struct mtx ieee80211_scan_lock_t; +#define IEEE80211_SCAN_LOCK_INIT(_nt, _name) \ + mtx_init(&(_nt)->nt_scanlock, _name, "802.11 scangen", MTX_DEF) +#define IEEE80211_SCAN_LOCK_DESTROY(_nt) mtx_destroy(&(_nt)->nt_scanlock) +#define IEEE80211_SCAN_LOCK(_nt) mtx_lock(&(_nt)->nt_scanlock) +#define IEEE80211_SCAN_UNLOCK(_nt) mtx_unlock(&(_nt)->nt_scanlock) +#define IEEE80211_SCAN_LOCK_ASSERT(_nt) \ + mtx_assert(&(_nt)->nt_scanlock, MA_OWNED) + +/* * Per-node power-save queue definitions. */ #define IEEE80211_NODE_SAVEQ_INIT(_ni, _name) do { \ ==== //depot/projects/wifi/sys/net80211/ieee80211_node.c#20 (text+ko) ==== @@ -1324,7 +1324,8 @@ struct ieee80211_node *ni; u_int gen; - gen = nt->nt_scangen++; /* NB: ok 'cuz single-threaded*/ + IEEE80211_SCAN_LOCK(nt); + gen = nt->nt_scangen++; IEEE80211_DPRINTF(ic, IEEE80211_MSG_NODE, "%s: sta scangen %u\n", __func__, gen); restart: @@ -1416,18 +1417,38 @@ } IEEE80211_NODE_UNLOCK(nt); + IEEE80211_SCAN_UNLOCK(nt); + nt->nt_inact_timer = IEEE80211_INACT_WAIT; } void ieee80211_iterate_nodes(struct ieee80211_node_table *nt, ieee80211_iter_func *f, void *arg) { - struct ieee80211_node *ni, *tni; + struct ieee80211com *ic = nt->nt_ic; + struct ieee80211_node *ni; + u_int gen; + + IEEE80211_SCAN_LOCK(nt); + gen = nt->nt_scangen++; + IEEE80211_DPRINTF(ic, IEEE80211_MSG_NODE, + "%s: sta scangen %u\n", __func__, gen); +restart: IEEE80211_NODE_LOCK(nt); - TAILQ_FOREACH_SAFE(ni, &nt->nt_node, ni_list, tni) - (*f)(arg, ni); + TAILQ_FOREACH(ni, &nt->nt_node, ni_list) { + if (ni->ni_scangen != gen) { + ni->ni_scangen = gen; + (void) ieee80211_ref_node(ni); + IEEE80211_NODE_UNLOCK(nt); + (*f)(arg, ni); + ieee80211_free_node(ni); + goto restart; + } + } IEEE80211_NODE_UNLOCK(nt); + + IEEE80211_SCAN_UNLOCK(nt); } void @@ -1778,6 +1799,7 @@ nt->nt_ic = ic; /* XXX need unit */ IEEE80211_NODE_LOCK_INIT(nt, ic->ic_ifp->if_xname); + IEEE80211_SCAN_LOCK_INIT(nt, ic->ic_ifp->if_xname); TAILQ_INIT(&nt->nt_node); nt->nt_name = name; nt->nt_scangen = 1; @@ -1824,6 +1846,7 @@ "%s %s table\n", __func__, nt->nt_name); ieee80211_free_allnodes_locked(nt); + IEEE80211_SCAN_LOCK_DESTROY(nt); IEEE80211_NODE_LOCK_DESTROY(nt); } ==== //depot/projects/wifi/sys/net80211/ieee80211_node.h#13 (text+ko) ==== @@ -206,6 +206,7 @@ TAILQ_HEAD(, ieee80211_node) nt_node; /* information of all nodes */ LIST_HEAD(, ieee80211_node) nt_hash[IEEE80211_NODE_HASHSIZE]; const char *nt_name; /* for debugging */ + ieee80211_scan_lock_t nt_scanlock; /* on nt_scangen */ u_int nt_scangen; /* gen# for timeout scan */ int nt_inact_timer; /* inactivity timer */ int nt_inact_init; /* initial node inact setting */