diff options
| author | Will Huang <wilhuang@codeaurora.org> | 2018-08-13 17:25:02 +0800 |
|---|---|---|
| committer | nshrivas <nshrivas@codeaurora.org> | 2018-10-08 15:26:54 -0700 |
| commit | cc949404c251bcf0020e23f38c9174b82dc1e218 (patch) | |
| tree | 5e3f97f213a123fbf2f8886c3a0afcf5c6db7858 | |
| parent | 001fdd10be5c3e563573e2821cf46e42ea56efd0 (diff) | |
qcacld-3.0: Fix ACS delayed worker running after adapter stopped
While ACS delayed worker scheduled and is running the function
wlan_hdd_cfg80211_start_acs(), ACS_PENDING has already been cleared by
wlan_hdd_cfg80211_start_pending_acs() before it, so the later coming
stop sap event can't cancel the running delayed worker and free the
sap context which need access by delayed worker.
Fix by clear ACS_PENDING after wlan_hdd_cfg80211_start_acs(), and move
cancel ACS delayed worker before cancel any scan, it can cancel ACS
scan invoke by delayed worker and avoid race condition.
CRs-Fixed: 2289364
Change-Id: Ibd771fc199a0778ac1d8f1f04ba22b49014437de
| -rw-r--r-- | core/hdd/src/wlan_hdd_cfg80211.c | 2 | ||||
| -rw-r--r-- | core/hdd/src/wlan_hdd_main.c | 9 |
2 files changed, 5 insertions, 6 deletions
diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index 26d16b9ffa81..e61ef00b2e4b 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -1940,8 +1940,8 @@ static void wlan_hdd_cfg80211_start_pending_acs(struct work_struct *work) hdd_adapter_t *adapter = container_of(work, hdd_adapter_t, acs_pending_work.work); - clear_bit(ACS_PENDING, &adapter->event_flags); wlan_hdd_cfg80211_start_acs(adapter); + clear_bit(ACS_PENDING, &adapter->event_flags); } /** diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c index 3387a7be70ee..bd1d50deaca2 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -4956,6 +4956,10 @@ QDF_STATUS hdd_stop_adapter(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter, break; case QDF_SAP_MODE: + if (test_bit(ACS_PENDING, &adapter->event_flags)) { + cds_flush_delayed_work(&adapter->acs_pending_work); + clear_bit(ACS_PENDING, &adapter->event_flags); + } hdd_ipa_flush(hdd_ctx); case QDF_P2P_GO_MODE: @@ -4968,11 +4972,6 @@ QDF_STATUS hdd_stop_adapter(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter, cds_flush_work(&hdd_ctx->sap_start_work); hdd_debug("Canceled the pending SAP restart work"); cds_change_sap_restart_required_status(false); - if (test_bit(ACS_PENDING, &adapter->event_flags)) { - cds_flush_delayed_work( - &adapter->acs_pending_work); - clear_bit(ACS_PENDING, &adapter->event_flags); - } } cds_flush_work(&adapter->sap_stop_bss_work); |
