qcacmn: use spinlock before iterating
Before iterating in pending list, use spinlock to avoid possible race condition. Remove function wlan_serialization_get_active_list_next_node_using_psoc as it not being used and is part of legacy flow which is suppose to be removed eventually. Change-Id: I9e7cbd9db8b5a1c45915bf5291cd5011c276d0e2 CRs-Fixed: 2573425
This commit is contained in:
@@ -79,24 +79,6 @@ wlan_serialization_get_pending_list_next_node_using_psoc(
|
|||||||
struct wlan_objmgr_psoc *psoc,
|
struct wlan_objmgr_psoc *psoc,
|
||||||
struct wlan_serialization_command *prev_cmd,
|
struct wlan_serialization_command *prev_cmd,
|
||||||
uint8_t is_cmd_for_pending_scan_queue);
|
uint8_t is_cmd_for_pending_scan_queue);
|
||||||
/**
|
|
||||||
* wlan_serialization_get_active_list_next_node_using_psoc() - Return next
|
|
||||||
* scan or non-scan pending command from queue
|
|
||||||
* @psoc: pointer to psoc
|
|
||||||
* @prev_cmd: previous command given by caller, find next command after this
|
|
||||||
* @is_cmd_for_active_scan_queue: to find from active scan or non-scan queue
|
|
||||||
*
|
|
||||||
* This API finds the first active pdev, and loops through scan or non-scan
|
|
||||||
* pending queue (based on is_cmd_from_pending_scan_queue flag) and fetches
|
|
||||||
* next pending command after prev_cmd
|
|
||||||
*
|
|
||||||
* Return: pointer to serialization command
|
|
||||||
*/
|
|
||||||
struct wlan_serialization_command*
|
|
||||||
wlan_serialization_get_active_list_next_node_using_psoc(
|
|
||||||
struct wlan_objmgr_psoc *psoc,
|
|
||||||
struct wlan_serialization_command *prev_cmd,
|
|
||||||
uint8_t is_cmd_for_active_scan_queue);
|
|
||||||
/**
|
/**
|
||||||
* wlan_serialization_get_active_list_count() - Return Active list count
|
* wlan_serialization_get_active_list_count() - Return Active list count
|
||||||
* @psoc: pointer to soc
|
* @psoc: pointer to soc
|
||||||
|
@@ -207,12 +207,15 @@ wlan_serialization_peek_head_pending_cmd_using_psoc(
|
|||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wlan_serialization_acquire_lock(&pdev_queue->pdev_queue_lock);
|
||||||
if (QDF_STATUS_SUCCESS != wlan_serialization_get_cmd_from_queue(
|
if (QDF_STATUS_SUCCESS != wlan_serialization_get_cmd_from_queue(
|
||||||
queue,
|
queue,
|
||||||
&nnode)) {
|
&nnode)) {
|
||||||
|
wlan_serialization_release_lock(&pdev_queue->pdev_queue_lock);
|
||||||
ser_err("Can't get command from queue");
|
ser_err("Can't get command from queue");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
wlan_serialization_release_lock(&pdev_queue->pdev_queue_lock);
|
||||||
cmd_list = qdf_container_of(nnode,
|
cmd_list = qdf_container_of(nnode,
|
||||||
struct wlan_serialization_command_list, pdev_node);
|
struct wlan_serialization_command_list, pdev_node);
|
||||||
cmd = &cmd_list->cmd;
|
cmd = &cmd_list->cmd;
|
||||||
@@ -283,37 +286,6 @@ wlan_serialization_get_list_next_node(qdf_list_t *queue,
|
|||||||
return ret_cmd;
|
return ret_cmd;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct wlan_serialization_command*
|
|
||||||
wlan_serialization_get_active_list_next_node_using_psoc(
|
|
||||||
struct wlan_objmgr_psoc *psoc,
|
|
||||||
struct wlan_serialization_command *prev_cmd,
|
|
||||||
uint8_t is_cmd_for_active_scan_queue)
|
|
||||||
{
|
|
||||||
struct wlan_ser_pdev_obj *ser_pdev_obj;
|
|
||||||
qdf_list_t *queue;
|
|
||||||
struct wlan_serialization_pdev_queue *pdev_queue;
|
|
||||||
|
|
||||||
if (!prev_cmd) {
|
|
||||||
ser_err("invalid prev_cmd");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
ser_pdev_obj = wlan_serialization_get_pdev_priv_obj_using_psoc(psoc);
|
|
||||||
if (!ser_pdev_obj) {
|
|
||||||
ser_err("invalid ser_pdev_obj");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (is_cmd_for_active_scan_queue)
|
|
||||||
pdev_queue = &ser_pdev_obj->pdev_q[SER_PDEV_QUEUE_COMP_SCAN];
|
|
||||||
else
|
|
||||||
pdev_queue =
|
|
||||||
&ser_pdev_obj->pdev_q[SER_PDEV_QUEUE_COMP_NON_SCAN];
|
|
||||||
queue = &pdev_queue->active_list;
|
|
||||||
return wlan_serialization_get_list_next_node(queue, prev_cmd,
|
|
||||||
ser_pdev_obj);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct wlan_serialization_command*
|
struct wlan_serialization_command*
|
||||||
wlan_serialization_get_pending_list_next_node_using_psoc(
|
wlan_serialization_get_pending_list_next_node_using_psoc(
|
||||||
struct wlan_objmgr_psoc *psoc,
|
struct wlan_objmgr_psoc *psoc,
|
||||||
@@ -323,6 +295,7 @@ wlan_serialization_get_pending_list_next_node_using_psoc(
|
|||||||
struct wlan_ser_pdev_obj *ser_pdev_obj;
|
struct wlan_ser_pdev_obj *ser_pdev_obj;
|
||||||
qdf_list_t *queue;
|
qdf_list_t *queue;
|
||||||
struct wlan_serialization_pdev_queue *pdev_queue;
|
struct wlan_serialization_pdev_queue *pdev_queue;
|
||||||
|
struct wlan_serialization_command *cmd;
|
||||||
|
|
||||||
if (!prev_cmd) {
|
if (!prev_cmd) {
|
||||||
ser_err("invalid prev_cmd");
|
ser_err("invalid prev_cmd");
|
||||||
@@ -340,6 +313,11 @@ wlan_serialization_get_pending_list_next_node_using_psoc(
|
|||||||
pdev_queue =
|
pdev_queue =
|
||||||
&ser_pdev_obj->pdev_q[SER_PDEV_QUEUE_COMP_NON_SCAN];
|
&ser_pdev_obj->pdev_q[SER_PDEV_QUEUE_COMP_NON_SCAN];
|
||||||
queue = &pdev_queue->pending_list;
|
queue = &pdev_queue->pending_list;
|
||||||
return wlan_serialization_get_list_next_node(queue, prev_cmd,
|
|
||||||
ser_pdev_obj);
|
wlan_serialization_acquire_lock(&pdev_queue->pdev_queue_lock);
|
||||||
|
cmd = wlan_serialization_get_list_next_node(queue, prev_cmd,
|
||||||
|
ser_pdev_obj);
|
||||||
|
wlan_serialization_release_lock(&pdev_queue->pdev_queue_lock);
|
||||||
|
|
||||||
|
return cmd;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user