On Wed, 2013-04-03 at 09:48 -0700, greearb@xxxxxxxxxxxxxxx wrote: > From: Ben Greear <greearb@xxxxxxxxxxxxxxx> > > When one has multiple station VIFS all connected to the same > AP, the rx logic becomes a linear walk of all stations. To > improve performance in this case, hash the station VIFs on > the VIF MAC. This significantly improves performance: 70Mbps > without the patch, 190Mbps with patch, when using 50 stations > receiving TCP traffic. > > Probably not many people doing this, so not worth pushing upstream > at this time. I tend to agree. > +++ b/net/mac80211/sta_info.c > @@ -77,19 +77,42 @@ static int sta_info_hash_del(struct ieee80211_local *local, > s = rcu_dereference_protected(local->sta_hash[STA_HASH(sta->sta.addr)], > lockdep_is_held(&local->sta_mtx)); > if (!s) > - return -ENOENT; > + goto try_lhash; Does this make sense? If the station doesn't exist in the regular hash, it really shouldn't be in the vif hash either, no? > if (rcu_access_pointer(s->hnext)) { > rcu_assign_pointer(s->hnext, sta->hnext); > + goto try_lhash; > + } > + > + /* Remove from the local VIF addr hash */ > +try_lhash: That last goto there seems a bit pointless :) > + s = rcu_dereference_protected(local->sta_vhash[STA_HASH(sta->sdata->vif.addr)], > + lockdep_is_held(&local->sta_mtx)); > + if (!s) > + return -ENONET; You probably want -ENOENT, not -ENONET. > +struct sta_info *sta_info_get_by_vif(struct ieee80211_local *local, > + const u8 *vif_addr, const u8 * sta_addr) { > + struct sta_info *sta; > + > + sta = rcu_dereference_check(local->sta_vhash[STA_HASH(vif_addr)], > + lockdep_is_held(&local->sta_mtx)); > + while (sta) { > + if (ether_addr_equal(sta->sdata->vif.addr, vif_addr) && > + ether_addr_equal(sta->sta.addr, sta_addr)) > + break; > + sta = rcu_dereference_check(sta->vnext, > + lockdep_is_held(&local->sta_mtx)); Almost all of your rcu_dereference_check() invocations should be rcu_dereference_protected(). See include/linux/rcupdate.h :) johannes -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html