qcacmn: Enhance debug info in rx descriptor

Add previously freed nbuf and buffer start address info in rx descriptor.
This helps in debugging use after free access of rx buffers.

Change-Id: I1c883bf049ce75dd0413b85946fe2982648d8004
CRs-Fixed: 2827151
Этот коммит содержится в:
Karthik Kantamneni
2020-11-24 11:42:26 +05:30
коммит произвёл snandini
родитель 9b98e19b51
Коммит c4845219dc

Просмотреть файл

@@ -91,12 +91,16 @@ enum dp_rx_desc_state {
* @replenish_caller: name of the function that last
* replenished the rx desc
* @replenish_ts: last replenish timestamp
* @prev_nbuf: previous nbuf info
* @prev_nbuf_data_addr: previous nbuf data address
*/
struct dp_rx_desc_dbg_info {
char freelist_caller[QDF_MEM_FUNC_NAME_SIZE];
uint64_t freelist_ts;
char replenish_caller[QDF_MEM_FUNC_NAME_SIZE];
uint64_t replenish_ts;
qdf_nbuf_t prev_nbuf;
uint8_t *prev_nbuf_data_addr;
};
#endif /* QCA_HOST_MODE_WIFI_DISABLED */
@@ -121,6 +125,7 @@ struct dp_rx_desc_dbg_info {
* @unmapped used to mark rx_desc an unmapped if the corresponding
* nbuf is already unmapped
* @in_err_state : Nbuf sanity failed for this descriptor.
* @nbuf_data_addr : VA of nbuf data posted
*/
struct dp_rx_desc {
qdf_nbuf_t nbuf;
@@ -130,6 +135,7 @@ struct dp_rx_desc {
uint8_t pool_id;
#ifdef RX_DESC_DEBUG_CHECK
uint32_t magic;
uint8_t *nbuf_data_addr;
struct dp_rx_desc_dbg_info *dbg_info;
#endif
uint8_t in_use:1,
@@ -806,6 +812,9 @@ void dp_rx_desc_update_dbg_info(struct dp_rx_desc *rx_desc,
qdf_str_lcopy(info->freelist_caller, func_name,
QDF_MEM_FUNC_NAME_SIZE);
info->freelist_ts = qdf_get_log_timestamp();
info->prev_nbuf = rx_desc->nbuf;
info->prev_nbuf_data_addr = rx_desc->nbuf_data_addr;
rx_desc->nbuf_data_addr = NULL;
}
}
#else
@@ -851,6 +860,8 @@ void __dp_rx_add_to_free_desc_list(union dp_rx_desc_list_elem_t **head,
{
qdf_assert(head && new);
dp_rx_desc_update_dbg_info(new, func_name, RX_DESC_IN_FREELIST);
new->nbuf = NULL;
new->in_use = 0;
@@ -859,8 +870,6 @@ void __dp_rx_add_to_free_desc_list(union dp_rx_desc_list_elem_t **head,
/* reset tail if head->next is NULL */
if (!*tail || !(*head)->next)
*tail = *head;
dp_rx_desc_update_dbg_info(new, func_name, RX_DESC_IN_FREELIST);
}
uint8_t dp_rx_process_invalid_peer(struct dp_soc *soc, qdf_nbuf_t nbuf,
@@ -1366,6 +1375,7 @@ void dp_rx_desc_prep(struct dp_rx_desc *rx_desc,
rx_desc->magic = DP_RX_DESC_MAGIC;
rx_desc->nbuf = (nbuf_frag_info_t->virt_addr).nbuf;
rx_desc->unmapped = 0;
rx_desc->nbuf_data_addr = (uint8_t *)qdf_nbuf_data(rx_desc->nbuf);
}
/**