Date: Tue, 31 Jul 2012 00:24:25 -0700 From: Adrian Chadd <adrian.chadd@gmail.com> To: PseudoCylon <moonlightakkiy@yahoo.ca> Cc: freebsd-wireless@freebsd.org, Kim Culhan <w8hdkim@gmail.com> Subject: Re: ath lor Message-ID: <CAJ-VmomSTcTFVQovOaGB9_7kTh_R9Z2W4bypknHVrtykYz2SMg@mail.gmail.com> In-Reply-To: <CAFZ_MYJP97aO73zLpJF9%2B8MiQVqAHGNngmtOakYDcaikvyq7og@mail.gmail.com> References: <CAFZ_MYKgUkryy4parts3QahAyPA7FY9xUqC98_E7oFW%2BzarA8A@mail.gmail.com> <CAFZ_MYKeOKxT3k7JWHjdH83vbieZ6JpXe0kbXTJy4neEd5Aqew@mail.gmail.com> <CAJ-VmomGBvgLwFEcXbEuYkAj=g%2By8zVo8cT2nSSMdydCk=OhYQ@mail.gmail.com> <CAFZ_MYJP97aO73zLpJF9%2B8MiQVqAHGNngmtOakYDcaikvyq7og@mail.gmail.com>
next in thread | previous in thread | raw e-mail | index | archive | help
Hm, don't do that - do all of the node table and scan generation counter stuff in the loop that populates the list of nodes. Then once you have that list, just call each and unlock. Adrian On 30 July 2012 22:33, PseudoCylon <moonlightakkiy@yahoo.ca> wrote: >> Yeah, That's what I had in mind. >> >> Trouble is, the AID isn't fixed at that value: >> >> vap->iv_max_aid = IEEE80211_AID_DEF; >> >> So likely we should malloc (M_NOWAIT | M_ZERO) a temporary array of >> size iv_max_aid. >> >> Have you seen the scan/node LORs? Are you able to verify that your >> change fixes that? >> > > Not yet. Though, I think we still need to do something with > ieee80211_timeout_stations() and com lock. driver/iterate lock LOR > seems gone. Will post when I find more. > > > Quick update (I haven't run it, yet). I'll set up a repository soon. > > void > ieee80211_iterate_nt(struct node_table *nt, struct ieee80211_node **ni_arr, > u_int *gen) > { > struct ieee80211_node *ni; > int i = 0; > > IEEE80211_NODE_ITERATE_LOCK(nt); > *gen = ++nt->nt_scangen; > > TAILQ_FOREACH(ni, &nt->nt_node, ni_list) > (*(ni_arr + i++)) = ieee80211_ref_node(ni); > > IEEE80211_NODE_ITERATE_UNLOCK(nt); > } > > /* > * Just a wrapper, so we don't have to change every ieee80211_iterate_nodes() > * reference in the source. > * > * A caller may directly call ieee80211_iterate_nt() and do customized stuff. > * Only requirement is to decrement each node's ref count. > */ > void > ieee80211_iterate_nodes(struct ieee80211_node_table *nt, > ieee80211_iter_func *f, void *arg) > { > struct ieee80211_node **ni_arr; > unsigned long size; > u_int gen; > int i; > > size = ni->ni_vap->iv_max_aid * sizeof(*ni_arr); > ni_arr = (struct ieee80211_node **)malloc(size, M_80211_NODE, > M_NOWAIT | M_ZERO); > if (ni_arr == NULL) > return; > > ieee80211_iterate_nt(nt, ni_arr, &gen); > > IEEE80211_NODE_LOCK(nt); > > for (i = 0; i < IEEE80211_AID_DEF; i++) { > if (ni == NULL) /* end of the list */ > break; > if (ni->ni_scangen == gen) > continue; > > ni->ni_scangen = gen; > > IEEE80211_NODE_UNLOCK(nt); > (*f)(arg, *(ni_arr + i)); > /* ieee80211_free_node() locks by itself */ > ieee80211_free_node(ni); > IEEE80211_NODE_LOCK(nt); > > i = 0; > } > > IEEE80211_NODE_UNLOCK(nt); > > free(ni_addr, M_80211_NODE); > }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAJ-VmomSTcTFVQovOaGB9_7kTh_R9Z2W4bypknHVrtykYz2SMg>