diff options
author | Om Prakash Singh <omp@nvidia.com> | 2014-06-19 20:55:41 +0530 |
---|---|---|
committer | Mandar Padmawar <mpadmawar@nvidia.com> | 2014-07-10 02:05:16 -0700 |
commit | 2e1dac8152e265109c1d76d9951c4085739292b0 (patch) | |
tree | f141c6ec9842bc114e1aaaf443909a33e0c611db | |
parent | 9244bf2a676ccef4da4448f388db273072a1e52e (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-x | drivers/net/wireless/bcmdhd/dhd_linux.c | 7 | ||||
-rwxr-xr-x | drivers/net/wireless/bcmdhd/wl_cfg80211.c | 10 |
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); |