Browse Source

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
Jinwei Chen 4 years ago
parent
commit
f822e151ff
1 changed files with 2 additions and 1 deletions
  1. 2 1
      core/dp/txrx3.0/dp_rx_thread.c

+ 2 - 1
core/dp/txrx3.0/dp_rx_thread.c

@@ -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);