qcacmn: Handle ingress reo list overflow

Handle overflow of management Rx reorder ingress list.

CRs-Fixed: 3402355
Change-Id: I2e7ab5b672e6cb2db2cb1e47d3854ad55d6b540a
This commit is contained in:
Edayilliam Jayadev
2023-02-13 19:04:05 +05:30
کامیت شده توسط Madan Koyyalamudi
والد 52c0ba9a7a
کامیت 0571d2f7bf
2فایلهای تغییر یافته به همراه46 افزوده شده و 5 حذف شده

مشاهده پرونده

@@ -2432,6 +2432,9 @@ mgmt_rx_reo_move_entries_ingress_to_egress_list
struct mgmt_rx_reo_list_entry *ingress_list_entry;
struct mgmt_rx_reo_list_entry *latest_frame_ready_to_deliver = NULL;
uint16_t num_frames_ready_to_deliver = 0;
uint32_t num_overflow_frames = 0;
uint32_t ingress_list_max_size;
uint32_t ingress_list_cur_size;
if (!ingress_list) {
mgmt_rx_reo_err("Ingress list is null");
@@ -2447,7 +2450,19 @@ mgmt_rx_reo_move_entries_ingress_to_egress_list
qdf_spin_lock_bh(&reo_ingress_list->list_lock);
ingress_list_cur_size = qdf_list_size(&reo_ingress_list->list);
ingress_list_max_size = reo_ingress_list->max_list_size;
if (mgmt_rx_reo_list_overflowed(reo_ingress_list))
num_overflow_frames =
ingress_list_cur_size - ingress_list_max_size;
qdf_list_for_each(&reo_ingress_list->list, ingress_list_entry, node) {
if (num_overflow_frames > 0) {
ingress_list_entry->status |=
STATUS_INGRESS_LIST_OVERFLOW;
num_overflow_frames--;
}
if (!mgmt_rx_reo_is_entry_ready_to_send_up(ingress_list_entry))
break;
@@ -2480,6 +2495,8 @@ mgmt_rx_reo_move_entries_ingress_to_egress_list
&temp_list_frames_ready_to_deliver);
qdf_assert_always(QDF_IS_STATUS_SUCCESS(status));
qdf_assert_always(qdf_list_size(&reo_ingress_list->list) <=
reo_ingress_list->max_list_size);
qdf_assert_always(qdf_list_size(&reo_egress_list->list) <=
reo_egress_list->max_list_size);
@@ -2891,8 +2908,15 @@ mgmt_rx_reo_update_ingress_list(struct mgmt_rx_reo_ingress_list *ingress_list,
frame_desc->queued_list = MGMT_RX_REO_LIST_TYPE_INGRESS;
overflow = (qdf_list_size(&reo_ingress_list->list) >
reo_ingress_list->max_list_size);
qdf_assert_always(!overflow);
reo_ingress_list->max_list_size);
if (overflow) {
qdf_list_t *ingress_list_ptr = &reo_ingress_list->list;
reo_ingress_list->overflow_count++;
mgmt_rx_reo_err_rl("Ingress overflow, cnt:%llu size:%u",
reo_ingress_list->overflow_count,
qdf_list_size(ingress_list_ptr));
}
if (new->wait_count.total_count == 0)
frame_desc->zero_wait_count_rx = true;

مشاهده پرونده

@@ -36,9 +36,9 @@
#include <wlan_objmgr_psoc_obj.h>
#include <wlan_mlo_mgr_public_structs.h>
#define MGMT_RX_REO_INGRESS_LIST_MAX_SIZE (256)
#define MGMT_RX_REO_INGRESS_LIST_TIMEOUT_US (500 * USEC_PER_MSEC)
#define MGMT_RX_REO_INGRESS_LIST_AGEOUT_TIMER_PERIOD_MS (250)
#define MGMT_RX_REO_INGRESS_LIST_MAX_SIZE (512)
#define MGMT_RX_REO_INGRESS_LIST_TIMEOUT_US (250 * USEC_PER_MSEC)
#define MGMT_RX_REO_INGRESS_LIST_AGEOUT_TIMER_PERIOD_MS (50)
#define MGMT_RX_REO_EGRESS_LIST_MAX_SIZE (256)
@@ -246,6 +246,7 @@ struct mgmt_rx_reo_frame_info {
* @list: Linked list
* @list_lock: Spin lock to protect the list
* @max_list_size: Maximum size of the reorder list
* @overflow_count: Number of times list overflow occurred
* @last_inserted_frame: Information about the last frame inserted to the list
* @last_released_frame: Information about the last frame released from the list
*/
@@ -253,6 +254,7 @@ struct mgmt_rx_reo_list {
qdf_list_t list;
qdf_spinlock_t list_lock;
uint32_t max_list_size;
uint64_t overflow_count;
struct mgmt_rx_reo_frame_info last_inserted_frame;
struct mgmt_rx_reo_frame_info last_released_frame;
};
@@ -847,6 +849,21 @@ struct mgmt_rx_reo_frame_descriptor {
struct mgmt_rx_reo_frame_info last_delivered_frame;
};
/**
* mgmt_rx_reo_list_overflowed() - Helper API to check whether mgmt rx reorder
* list overflowed
* @reo_list: Pointer to management rx reorder list
*
* Return: true or false
*/
static inline bool
mgmt_rx_reo_list_overflowed(struct mgmt_rx_reo_list *reo_list)
{
qdf_assert_always(reo_list);
return (qdf_list_size(&reo_list->list) > reo_list->max_list_size);
}
/**
* mgmt_rx_reo_get_context_from_ingress_list() - Helper API to get pointer to
* management rx reorder context from pointer to management rx reo ingress list