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:
@@ -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);
|
||||
|
||||
|
Reference in New Issue
Block a user