Search Linux Wireless

Re: [RFC 1/2] mac80211: Add vif hash for multi-station RX performance.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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




[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Wireless Personal Area Network]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Hiking]     [MIPS Linux]     [ARM Linux]     [Linux RAID]

  Powered by Linux