qcacmn: Fix monitor status buffer double free issue

Currently in monitor mode for KIWI, interrupt for RXDMA2HOST is
enabled to process both monitor status srng and montior destination
srng, but low threshold interrupt for monitor status srng is also
enabled. so when available RX buffer in monitor status srng is less
then low threshold, it is possible that two kind of interrupt from
RXDMA2HOST ring and monitor status ring will call
dp_rx_mon_status_process_tlv() in different context and access to
mon_pdev->rx_status_q at the same time, this will lead to skb
double free issue.

solution:
(1) disable RXDMA2HOST srng interrupt in monitor mode.
(2) enable monitor status srng batch count interrupt for monitor
processing.

Change-Id: I1df8830cb7cc55468e5df5e49045c3d96f7c29a8
CRs-Fixed: 3245393
This commit is contained in:
Jinwei Chen
2022-07-18 05:39:52 -07:00
کامیت شده توسط Madan Koyyalamudi
والد 52cd69199f
کامیت 89bdae0fc0
2فایلهای تغییر یافته به همراه18 افزوده شده و 16 حذف شده

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

@@ -2183,11 +2183,28 @@ struct wlan_srng_cfg wlan_srng_rxdma_monitor_buf_cfg = {
};
/* RXDMA_MONITOR_STATUS ring configuration */
#ifdef DP_CON_MON_MSI_ENABLED
/*
* Configure batch count threshold as 1 to enable interrupt
* when HW updated TP (monitor status buffer DMA is done),
* then host could reap monitor status srng. timer threshold
* based interrupt is only used for low threshold interrupt which
* can not be used for monitor status buffer reaping directly
* unless configure low threshold value to a big value, perhaps
* (number of entries - 2).
*/
struct wlan_srng_cfg wlan_srng_rxdma_monitor_status_cfg = {
.timer_threshold = WLAN_CFG_INT_TIMER_THRESHOLD_RX,
.batch_count_threshold = 1,
.low_threshold = WLAN_CFG_RXDMA_MONITOR_STATUS_RING_SIZE >> 3,
};
#else
struct wlan_srng_cfg wlan_srng_rxdma_monitor_status_cfg = {
.timer_threshold = WLAN_CFG_INT_TIMER_THRESHOLD_RX,
.batch_count_threshold = 0,
.low_threshold = WLAN_CFG_RXDMA_MONITOR_STATUS_RING_SIZE >> 3,
};
#endif
/* TX_MONITOR_BUF ring configuration */
struct wlan_srng_cfg wlan_srng_tx_monitor_buf_cfg = {