qcacld-3.0: Hanlde RX_VDE_DEL_EVENT in dp thread properly

Scenario:
(1) vdev0 is running RX traffic, vdev2 is doing vdev detach, vdev2
will send RX_VDEV_DEL_EVENT to dp thread, but if dp thread is slow
to process thread queue frame in dp_rx_thread_process_nbufq(),
like if Kasan is enabled. RX_VDEV_DEL_EVENT will be delayed and
vdev2 corresbonding stack queue frame can not be flushed
before net_dev is freed, later will hit panic.
(2) vdev2 detach set rx_thread->vdev_del_event but not be
cleared due to qdf_wait_single_event() timeout, later vdev2
attach/detach again, this time as rx_thread->vdev_del_event
is not cleared so it will skip waiting dp thread, vdev2 realted
net_dev freed before dp thread do napi_gro_flush.

solution:
(1) reset rx_thread->vdev_del_event before wait this event.
(2) Increase DP_RX_THREAD_WAIT_TIMEOUT to 1000 ms.

Change-Id: Ibc1d761be3588fc3ee6c383b8779f56b2c9f17cd
CRs-Fixed: 2736887
This commit is contained in:
Jinwei Chen
2020-07-31 15:47:09 +08:00
committed by snandini
父節點 786d8601d5
當前提交 f822e151ff

查看文件

@@ -24,7 +24,7 @@
#include <cds_sched.h>
/* Timeout in ms to wait for a DP rx thread */
#define DP_RX_THREAD_WAIT_TIMEOUT 200
#define DP_RX_THREAD_WAIT_TIMEOUT 1000
#define DP_RX_TM_DEBUG 0
#if DP_RX_TM_DEBUG
@@ -821,6 +821,7 @@ void dp_rx_thread_flush_by_vdev_id(struct dp_rx_thread *rx_thread,
}
qdf_nbuf_queue_head_unlock(&rx_thread->nbuf_queue);
qdf_event_reset(&rx_thread->vdev_del_event);
qdf_set_bit(RX_VDEV_DEL_EVENT, &rx_thread->event_flag);
qdf_wake_up_interruptible(&rx_thread->wait_q);