mac80211: mesh: drop redundant rcu_read_lock/unlock calls

The callers of these functions are all within RCU locked sections

Signed-off-by: Felix Fietkau <nbd@nbd.name>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
Felix Fietkau 2019-03-16 18:06:30 +01:00 committed by Johannes Berg
parent abaea61c79
commit ef618b1bd6
2 changed files with 8 additions and 20 deletions

View File

@ -1130,16 +1130,13 @@ int mesh_nexthop_resolve(struct ieee80211_sub_if_data *sdata,
struct mesh_path *mpath; struct mesh_path *mpath;
struct sk_buff *skb_to_free = NULL; struct sk_buff *skb_to_free = NULL;
u8 *target_addr = hdr->addr3; u8 *target_addr = hdr->addr3;
int err = 0;
/* Nulls are only sent to peers for PS and should be pre-addressed */ /* Nulls are only sent to peers for PS and should be pre-addressed */
if (ieee80211_is_qos_nullfunc(hdr->frame_control)) if (ieee80211_is_qos_nullfunc(hdr->frame_control))
return 0; return 0;
rcu_read_lock(); if (!mesh_nexthop_lookup(sdata, skb))
err = mesh_nexthop_lookup(sdata, skb); return 0;
if (!err)
goto endlookup;
/* no nexthop found, start resolving */ /* no nexthop found, start resolving */
mpath = mesh_path_lookup(sdata, target_addr); mpath = mesh_path_lookup(sdata, target_addr);
@ -1147,8 +1144,7 @@ int mesh_nexthop_resolve(struct ieee80211_sub_if_data *sdata,
mpath = mesh_path_add(sdata, target_addr); mpath = mesh_path_add(sdata, target_addr);
if (IS_ERR(mpath)) { if (IS_ERR(mpath)) {
mesh_path_discard_frame(sdata, skb); mesh_path_discard_frame(sdata, skb);
err = PTR_ERR(mpath); return PTR_ERR(mpath);
goto endlookup;
} }
} }
@ -1161,13 +1157,10 @@ int mesh_nexthop_resolve(struct ieee80211_sub_if_data *sdata,
info->flags |= IEEE80211_TX_INTFL_NEED_TXPROCESSING; info->flags |= IEEE80211_TX_INTFL_NEED_TXPROCESSING;
ieee80211_set_qos_hdr(sdata, skb); ieee80211_set_qos_hdr(sdata, skb);
skb_queue_tail(&mpath->frame_queue, skb); skb_queue_tail(&mpath->frame_queue, skb);
err = -ENOENT;
if (skb_to_free) if (skb_to_free)
mesh_path_discard_frame(sdata, skb_to_free); mesh_path_discard_frame(sdata, skb_to_free);
endlookup: return -ENOENT;
rcu_read_unlock();
return err;
} }
/** /**
@ -1187,13 +1180,10 @@ int mesh_nexthop_lookup(struct ieee80211_sub_if_data *sdata,
struct sta_info *next_hop; struct sta_info *next_hop;
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
u8 *target_addr = hdr->addr3; u8 *target_addr = hdr->addr3;
int err = -ENOENT;
rcu_read_lock();
mpath = mesh_path_lookup(sdata, target_addr); mpath = mesh_path_lookup(sdata, target_addr);
if (!mpath || !(mpath->flags & MESH_PATH_ACTIVE)) if (!mpath || !(mpath->flags & MESH_PATH_ACTIVE))
goto endlookup; return -ENOENT;
if (time_after(jiffies, if (time_after(jiffies,
mpath->exp_time - mpath->exp_time -
@ -1208,12 +1198,10 @@ int mesh_nexthop_lookup(struct ieee80211_sub_if_data *sdata,
memcpy(hdr->addr1, next_hop->sta.addr, ETH_ALEN); memcpy(hdr->addr1, next_hop->sta.addr, ETH_ALEN);
memcpy(hdr->addr2, sdata->vif.addr, ETH_ALEN); memcpy(hdr->addr2, sdata->vif.addr, ETH_ALEN);
ieee80211_mps_set_frame_flags(sdata, next_hop, hdr); ieee80211_mps_set_frame_flags(sdata, next_hop, hdr);
err = 0; return 0;
} }
endlookup: return -ENOENT;
rcu_read_unlock();
return err;
} }
void mesh_path_timer(struct timer_list *t) void mesh_path_timer(struct timer_list *t)

View File

@ -217,7 +217,7 @@ static struct mesh_path *mpath_lookup(struct mesh_table *tbl, const u8 *dst,
{ {
struct mesh_path *mpath; struct mesh_path *mpath;
mpath = rhashtable_lookup_fast(&tbl->rhead, dst, mesh_rht_params); mpath = rhashtable_lookup(&tbl->rhead, dst, mesh_rht_params);
if (mpath && mpath_expired(mpath)) { if (mpath && mpath_expired(mpath)) {
spin_lock_bh(&mpath->state_lock); spin_lock_bh(&mpath->state_lock);