Merge "qcacmn: Add objmgr check for pdev leaks API"
This commit is contained in:

committed by
Gerrit - the friendly Code Review server

commit
3dcbc895e0
@@ -633,9 +633,13 @@ static QDF_STATUS htc_issue_packets(HTC_TARGET *target,
|
|||||||
("hif_send Failed status:%d\n",
|
("hif_send Failed status:%d\n",
|
||||||
status));
|
status));
|
||||||
}
|
}
|
||||||
qdf_nbuf_unmap(target->osdev,
|
|
||||||
GET_HTC_PACKET_NET_BUF_CONTEXT(pPacket),
|
/* only unmap if we mapped in this function */
|
||||||
QDF_DMA_TO_DEVICE);
|
if (IS_TX_CREDIT_FLOW_ENABLED(pEndpoint))
|
||||||
|
qdf_nbuf_unmap(target->osdev,
|
||||||
|
GET_HTC_PACKET_NET_BUF_CONTEXT(pPacket),
|
||||||
|
QDF_DMA_TO_DEVICE);
|
||||||
|
|
||||||
if (!pEndpoint->async_update) {
|
if (!pEndpoint->async_update) {
|
||||||
LOCK_HTC_TX(target);
|
LOCK_HTC_TX(target);
|
||||||
}
|
}
|
||||||
|
@@ -1436,6 +1436,14 @@ QDF_STATUS wlan_objmgr_print_ref_all_objects_per_psoc(
|
|||||||
QDF_STATUS wlan_objmgr_psoc_set_user_config(struct wlan_objmgr_psoc *psoc,
|
QDF_STATUS wlan_objmgr_psoc_set_user_config(struct wlan_objmgr_psoc *psoc,
|
||||||
struct wlan_objmgr_psoc_user_config *user_config_data);
|
struct wlan_objmgr_psoc_user_config *user_config_data);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wlan_objmgr_psoc_check_for_pdev_leaks() - Assert no pdevs attached to @psoc
|
||||||
|
* @psoc: The psoc to check
|
||||||
|
*
|
||||||
|
* Return: None
|
||||||
|
*/
|
||||||
|
void wlan_objmgr_psoc_check_for_pdev_leaks(struct wlan_objmgr_psoc *psoc);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* wlan_objmgr_psoc_check_for_vdev_leaks() - Assert no vdevs attached to @psoc
|
* wlan_objmgr_psoc_check_for_vdev_leaks() - Assert no vdevs attached to @psoc
|
||||||
* @psoc: The psoc to check
|
* @psoc: The psoc to check
|
||||||
|
@@ -2005,6 +2005,55 @@ QDF_STATUS wlan_objmgr_psoc_set_user_config(struct wlan_objmgr_psoc *psoc,
|
|||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void wlan_objmgr_psoc_check_for_pdev_leaks(struct wlan_objmgr_psoc *psoc)
|
||||||
|
{
|
||||||
|
struct wlan_objmgr_psoc_objmgr *_psoc;
|
||||||
|
int pdev_id;
|
||||||
|
int ref_id;
|
||||||
|
|
||||||
|
QDF_BUG(psoc);
|
||||||
|
if (!psoc)
|
||||||
|
return;
|
||||||
|
|
||||||
|
wlan_psoc_obj_lock(psoc);
|
||||||
|
_psoc = &psoc->soc_objmgr;
|
||||||
|
if (!_psoc->wlan_pdev_count) {
|
||||||
|
wlan_psoc_obj_unlock(psoc);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
obj_mgr_err("objmgr pdev leaks detected for psoc %u!", _psoc->psoc_id);
|
||||||
|
obj_mgr_err("--------------------------------------------------------");
|
||||||
|
obj_mgr_err("Pdev Id Refs Module");
|
||||||
|
obj_mgr_err("--------------------------------------------------------");
|
||||||
|
|
||||||
|
for (pdev_id = 0; pdev_id < WLAN_UMAC_MAX_PDEVS; pdev_id++) {
|
||||||
|
struct wlan_objmgr_pdev *pdev = _psoc->wlan_pdev_list[pdev_id];
|
||||||
|
qdf_atomic_t *ref_id_dbg;
|
||||||
|
|
||||||
|
if (!pdev)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
wlan_pdev_obj_lock(pdev);
|
||||||
|
ref_id_dbg = pdev->pdev_objmgr.ref_id_dbg;
|
||||||
|
for (ref_id = 0; ref_id < WLAN_REF_ID_MAX; ref_id++) {
|
||||||
|
int32_t refs = qdf_atomic_read(&ref_id_dbg[ref_id]);
|
||||||
|
|
||||||
|
if (refs <= 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
obj_mgr_err("%7u %4u x %s",
|
||||||
|
pdev_id, refs, string_from_dbgid(ref_id));
|
||||||
|
}
|
||||||
|
wlan_pdev_obj_unlock(pdev);
|
||||||
|
}
|
||||||
|
|
||||||
|
wlan_psoc_obj_unlock(psoc);
|
||||||
|
|
||||||
|
QDF_DEBUG_PANIC();
|
||||||
|
}
|
||||||
|
qdf_export_symbol(wlan_objmgr_psoc_check_for_pdev_leaks);
|
||||||
|
|
||||||
void wlan_objmgr_psoc_check_for_vdev_leaks(struct wlan_objmgr_psoc *psoc)
|
void wlan_objmgr_psoc_check_for_vdev_leaks(struct wlan_objmgr_psoc *psoc)
|
||||||
{
|
{
|
||||||
struct wlan_objmgr_psoc_objmgr *_psoc;
|
struct wlan_objmgr_psoc_objmgr *_psoc;
|
||||||
|
@@ -219,10 +219,12 @@ struct pdev_scan_info {
|
|||||||
* struct scan_vdev_obj - scan vdev obj
|
* struct scan_vdev_obj - scan vdev obj
|
||||||
* @pno_match_evt_received: pno match received
|
* @pno_match_evt_received: pno match received
|
||||||
* @pno_in_progress: pno in progress
|
* @pno_in_progress: pno in progress
|
||||||
|
* @is_vdev_delete_in_progress: flag to indicate if vdev del is in progress
|
||||||
*/
|
*/
|
||||||
struct scan_vdev_obj {
|
struct scan_vdev_obj {
|
||||||
bool pno_match_evt_received;
|
bool pno_match_evt_received;
|
||||||
bool pno_in_progress;
|
bool pno_in_progress;
|
||||||
|
bool is_vdev_delete_in_progress;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -369,8 +369,9 @@ scm_scan_start_req(struct scheduler_msg *msg)
|
|||||||
{
|
{
|
||||||
struct wlan_serialization_command cmd = {0, };
|
struct wlan_serialization_command cmd = {0, };
|
||||||
enum wlan_serialization_status ser_cmd_status;
|
enum wlan_serialization_status ser_cmd_status;
|
||||||
struct scan_start_request *req;
|
struct scan_start_request *req = NULL;
|
||||||
struct wlan_scan_obj *scan_obj;
|
struct wlan_scan_obj *scan_obj;
|
||||||
|
struct scan_vdev_obj *scan_vdev_priv_obj;
|
||||||
QDF_STATUS status = QDF_STATUS_SUCCESS;
|
QDF_STATUS status = QDF_STATUS_SUCCESS;
|
||||||
|
|
||||||
if (!msg) {
|
if (!msg) {
|
||||||
@@ -388,7 +389,8 @@ scm_scan_start_req(struct scheduler_msg *msg)
|
|||||||
scan_obj = wlan_vdev_get_scan_obj(req->vdev);
|
scan_obj = wlan_vdev_get_scan_obj(req->vdev);
|
||||||
if (!scan_obj) {
|
if (!scan_obj) {
|
||||||
scm_debug("Couldn't find scan object");
|
scm_debug("Couldn't find scan object");
|
||||||
return QDF_STATUS_E_NULL_VALUE;
|
status = QDF_STATUS_E_NULL_VALUE;
|
||||||
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
cmd.cmd_type = WLAN_SER_CMD_SCAN;
|
cmd.cmd_type = WLAN_SER_CMD_SCAN;
|
||||||
@@ -409,6 +411,18 @@ scm_scan_start_req(struct scheduler_msg *msg)
|
|||||||
req, req->scan_req.scan_req_id, req->scan_req.scan_id,
|
req, req->scan_req.scan_req_id, req->scan_req.scan_id,
|
||||||
req->scan_req.vdev_id);
|
req->scan_req.vdev_id);
|
||||||
|
|
||||||
|
scan_vdev_priv_obj = wlan_get_vdev_scan_obj(req->vdev);
|
||||||
|
if (!scan_vdev_priv_obj) {
|
||||||
|
scm_debug("Couldn't find scan priv object");
|
||||||
|
status = QDF_STATUS_E_NULL_VALUE;
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
if (scan_vdev_priv_obj->is_vdev_delete_in_progress) {
|
||||||
|
scm_err("Can't allow scan on vdev_id:%d",
|
||||||
|
wlan_vdev_get_id(req->vdev));
|
||||||
|
status = QDF_STATUS_E_NULL_VALUE;
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
ser_cmd_status = wlan_serialization_request(&cmd);
|
ser_cmd_status = wlan_serialization_request(&cmd);
|
||||||
scm_info("wlan_serialization_request status:%d", ser_cmd_status);
|
scm_info("wlan_serialization_request status:%d", ser_cmd_status);
|
||||||
|
|
||||||
@@ -427,21 +441,22 @@ scm_scan_start_req(struct scheduler_msg *msg)
|
|||||||
*/
|
*/
|
||||||
scm_post_internal_scan_complete_event(req,
|
scm_post_internal_scan_complete_event(req,
|
||||||
SCAN_REASON_INTERNAL_FAILURE);
|
SCAN_REASON_INTERNAL_FAILURE);
|
||||||
/* cmd can't be serviced.
|
goto err;
|
||||||
* release vdev reference and free scan_start_request memory
|
|
||||||
*/
|
|
||||||
wlan_objmgr_vdev_release_ref(req->vdev, WLAN_SCAN_ID);
|
|
||||||
scm_scan_free_scan_request_mem(req);
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
QDF_ASSERT(0);
|
QDF_ASSERT(0);
|
||||||
status = QDF_STATUS_E_INVAL;
|
status = QDF_STATUS_E_INVAL;
|
||||||
/* cmd can't be serviced.
|
goto err;
|
||||||
* release vdev reference and free scan_start_request memory
|
}
|
||||||
*/
|
|
||||||
|
return status;
|
||||||
|
err:
|
||||||
|
/*
|
||||||
|
* cmd can't be serviced.
|
||||||
|
* release vdev reference and free scan_start_request memory
|
||||||
|
*/
|
||||||
|
if (req) {
|
||||||
wlan_objmgr_vdev_release_ref(req->vdev, WLAN_SCAN_ID);
|
wlan_objmgr_vdev_release_ref(req->vdev, WLAN_SCAN_ID);
|
||||||
scm_scan_free_scan_request_mem(req);
|
scm_scan_free_scan_request_mem(req);
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
|
@@ -590,4 +590,19 @@ void ucfg_scan_set_bt_activity(struct wlan_objmgr_psoc *psoc,
|
|||||||
* Return: true if enabled else false.
|
* Return: true if enabled else false.
|
||||||
*/
|
*/
|
||||||
bool ucfg_scan_get_bt_activity(struct wlan_objmgr_psoc *psoc);
|
bool ucfg_scan_get_bt_activity(struct wlan_objmgr_psoc *psoc);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ucfg_scan_set_vdev_del_in_progress() - API to mark vdev delete in progress
|
||||||
|
* @vdev: pointer to vdev object
|
||||||
|
*
|
||||||
|
* Return: none
|
||||||
|
*/
|
||||||
|
void ucfg_scan_set_vdev_del_in_progress(struct wlan_objmgr_vdev *vdev);
|
||||||
|
/**
|
||||||
|
* ucfg_scan_clear_vdev_del_in_progress() - API to reset vdev delete in progress
|
||||||
|
* @vdev: pointer to vdev object
|
||||||
|
*
|
||||||
|
* Return: none
|
||||||
|
*/
|
||||||
|
void ucfg_scan_clear_vdev_del_in_progress(struct wlan_objmgr_vdev *vdev);
|
||||||
#endif
|
#endif
|
||||||
|
@@ -2178,6 +2178,38 @@ bool ucfg_scan_get_bt_activity(struct wlan_objmgr_psoc *psoc)
|
|||||||
return scan_obj->bt_a2dp_enabled;
|
return scan_obj->bt_a2dp_enabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ucfg_scan_set_vdev_del_in_progress(struct wlan_objmgr_vdev *vdev)
|
||||||
|
{
|
||||||
|
struct scan_vdev_obj *scan_vdev_obj;
|
||||||
|
|
||||||
|
if (!vdev) {
|
||||||
|
scm_err("invalid vdev");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
scan_vdev_obj = wlan_get_vdev_scan_obj(vdev);
|
||||||
|
if (!scan_vdev_obj) {
|
||||||
|
scm_err("null scan_vdev_obj");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
scan_vdev_obj->is_vdev_delete_in_progress = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ucfg_scan_clear_vdev_del_in_progress(struct wlan_objmgr_vdev *vdev)
|
||||||
|
{
|
||||||
|
struct scan_vdev_obj *scan_vdev_obj;
|
||||||
|
|
||||||
|
if (!vdev) {
|
||||||
|
scm_err("invalid vdev");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
scan_vdev_obj = wlan_get_vdev_scan_obj(vdev);
|
||||||
|
if (!scan_vdev_obj) {
|
||||||
|
scm_err("null scan_vdev_obj");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
scan_vdev_obj->is_vdev_delete_in_progress = false;
|
||||||
|
}
|
||||||
|
|
||||||
QDF_STATUS
|
QDF_STATUS
|
||||||
ucfg_scan_set_global_config(struct wlan_objmgr_psoc *psoc,
|
ucfg_scan_set_global_config(struct wlan_objmgr_psoc *psoc,
|
||||||
enum scan_config config, uint32_t val)
|
enum scan_config config, uint32_t val)
|
||||||
|
@@ -9294,7 +9294,7 @@ static QDF_STATUS send_stats_ext_req_cmd_tlv(wmi_unified_t wmi_handle,
|
|||||||
QDF_STATUS ret;
|
QDF_STATUS ret;
|
||||||
wmi_req_stats_ext_cmd_fixed_param *cmd;
|
wmi_req_stats_ext_cmd_fixed_param *cmd;
|
||||||
wmi_buf_t buf;
|
wmi_buf_t buf;
|
||||||
uint16_t len;
|
size_t len;
|
||||||
uint8_t *buf_ptr;
|
uint8_t *buf_ptr;
|
||||||
|
|
||||||
len = sizeof(*cmd) + WMI_TLV_HDR_SIZE + preq->request_data_len;
|
len = sizeof(*cmd) + WMI_TLV_HDR_SIZE + preq->request_data_len;
|
||||||
|
Reference in New Issue
Block a user