1
0

qcacmn: Fix deadlock for race condition

When connect from wpa_supplicant and roam from F/W happens at same
time, supplicant hold cm cm_req_lock and wait rsp from scheduler
thread, sheduler thread is blocked to wait for cm_req_lock.

Change-Id: I6b9010972d29be9a32d3b85ee72891ed62b50801
CRs-Fixed: 3087193
Este cometimento está contido em:
Jianmin Zhu
2021-12-02 17:01:03 +08:00
cometido por Madan Koyyalamudi
ascendente df5958c77b
cometimento 50eb6fef18

Ver ficheiro

@@ -1,5 +1,6 @@
/*
* Copyright (c) 2012-2015, 2020-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -29,6 +30,7 @@
#ifdef CONN_MGR_ADV_FEATURE
#include "wlan_blm_api.h"
#include "wlan_cm_roam_api.h"
#include "wlan_tdls_api.h"
#endif
#include <wlan_utility.h>
#include <wlan_mlo_mgr_sta.h>
@@ -978,6 +980,18 @@ static void cm_set_fils_wep_key(struct cnx_mgr *cm_ctx,
cm_set_key(cm_ctx, true, 0, &resp->bssid);
cm_set_key(cm_ctx, false, 0, &broadcast_mac);
}
static void cm_teardown_tdls(struct wlan_objmgr_vdev *vdev)
{
struct wlan_objmgr_psoc *psoc;
psoc = wlan_vdev_get_psoc(vdev);
if (!psoc)
return;
wlan_tdls_teardown_links_sync(psoc);
}
#else
static inline
@@ -1112,6 +1126,8 @@ post_err:
return qdf_status;
}
static inline void cm_teardown_tdls(struct wlan_objmgr_vdev *vdev) {}
#endif /* CONN_MGR_ADV_FEATURE */
static void cm_connect_prepare_scan_filter(struct wlan_objmgr_pdev *pdev,
@@ -2319,6 +2335,9 @@ QDF_STATUS cm_connect_start_req(struct wlan_objmgr_vdev *vdev,
cm_set_crypto_params_from_ie(&connect_req->req);
if (!wlan_vdev_mlme_is_mlo_link_vdev(vdev))
cm_teardown_tdls(vdev);
status = cm_sm_deliver_event(vdev, WLAN_CM_SM_EV_CONNECT_REQ,
sizeof(*connect_req), connect_req);