From f822e151fff9244c970e997783e9a4656e031443 Mon Sep 17 00:00:00 2001 From: Jinwei Chen Date: Fri, 31 Jul 2020 15:47:09 +0800 Subject: [PATCH] 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 --- core/dp/txrx3.0/dp_rx_thread.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/dp/txrx3.0/dp_rx_thread.c b/core/dp/txrx3.0/dp_rx_thread.c index 34440ff8d8bf..f8996a615c62 100644 --- a/core/dp/txrx3.0/dp_rx_thread.c +++ b/core/dp/txrx3.0/dp_rx_thread.c @@ -24,7 +24,7 @@ #include /* 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);