summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOm Prakash Singh <omp@nvidia.com>2014-06-19 20:55:41 +0530
committerMandar Padmawar <mpadmawar@nvidia.com>2014-07-10 02:05:16 -0700
commit2e1dac8152e265109c1d76d9951c4085739292b0 (patch)
treef141c6ec9842bc114e1aaaf443909a33e0c611db
parent9244bf2a676ccef4da4448f388db273072a1e52e (diff)
net: wireless: bcmdhd: fix rtnl_lock deadlock while AGO creation
problem: during p2p interface add/remove stress, race condition is happening for rtnl_lock between cfg80211_event_work and dhd driver. due to which system's net stack is going in to deadlock state. solution: to register p2p interface make use of register_netdevice instead of register_netdev which doesn't require rtnl_lock and remove rtnl_unlock/lock that was added to make sure register_netdev doesn't block on rtnl_lock. Bug 1515721 Change-Id: Iceba835b986561fce9e707ef9cc92e3265689abb Signed-off-by: Om Prakash Singh <omp@nvidia.com> Reviewed-on: http://git-master/r/426983 (cherry picked from commit 29ff3759b1352d1c7c8278b6b123c3b3317917b8) Reviewed-on: http://git-master/r/435718 GVS: Gerrit_Virtual_Submit Reviewed-by: Anshul Jain (SW) <anshulj@nvidia.com> Tested-by: Anshul Jain (SW) <anshulj@nvidia.com>
-rwxr-xr-xdrivers/net/wireless/bcmdhd/dhd_linux.c7
-rwxr-xr-xdrivers/net/wireless/bcmdhd/wl_cfg80211.c10
2 files changed, 6 insertions, 11 deletions
diff --git a/drivers/net/wireless/bcmdhd/dhd_linux.c b/drivers/net/wireless/bcmdhd/dhd_linux.c
index 83d7bb3879f6..1b9ba22253e0 100755
--- a/drivers/net/wireless/bcmdhd/dhd_linux.c
+++ b/drivers/net/wireless/bcmdhd/dhd_linux.c
@@ -4776,7 +4776,12 @@ dhd_net_attach(dhd_pub_t *dhdp, int ifidx)
memcpy(net->dev_addr, temp_addr, ETHER_ADDR_LEN);
net->ifindex = 0;
- if ((err = register_netdev(net)) != 0) {
+ if (ifidx == 0)
+ err = register_netdev(net);
+ else
+ err = register_netdevice(net);
+
+ if (err != 0) {
DHD_ERROR(("couldn't register the net device, err %d\n", err));
goto fail;
}
diff --git a/drivers/net/wireless/bcmdhd/wl_cfg80211.c b/drivers/net/wireless/bcmdhd/wl_cfg80211.c
index 6a383babaed1..4de074a70c02 100755
--- a/drivers/net/wireless/bcmdhd/wl_cfg80211.c
+++ b/drivers/net/wireless/bcmdhd/wl_cfg80211.c
@@ -1309,10 +1309,6 @@ wl_cfg80211_add_virtual_iface(struct wiphy *wiphy,
wl->p2p->vif_created = true;
wl_set_mode_by_netdev(wl, _ndev, mode);
net_attach = wl_to_p2p_bss_private(wl, P2PAPI_BSSCFG_CONNECTION);
- if (rtnl_is_locked()) {
- rtnl_unlock();
- rollback_lock = true;
- }
if (net_attach && !net_attach(wl->pub, _ndev->ifindex)) {
wl_alloc_netinfo(wl, _ndev, vwdev, mode, PM_ENABLE);
val = 1;
@@ -1338,14 +1334,8 @@ wl_cfg80211_add_virtual_iface(struct wiphy *wiphy,
/* reinitialize completion to clear previous count */
INIT_COMPLETION(wl->iface_disable);
} else {
- /* put back the rtnl_lock again */
- if (rollback_lock)
- rtnl_lock();
goto fail;
}
- /* put back the rtnl_lock again */
- if (rollback_lock)
- rtnl_lock();
return ndev_to_cfgdev(_ndev);
} else {
wl_clr_p2p_status(wl, IF_ADD);