Bläddra i källkod

qcacmn: Release the platform_info spin lock before del_timer_sync

In qdf_mc_timer_stop_sync acquires the platform_info spinlock
and call's the del_tymer_sync. del_timer_sync waits for callbacks
to execute all CPU's. But callback scheduler_mc_timer_callback
tries to acquire the platform_info lock to execute. This can
lead to deadlock.

Change-Id: Ib21ee5b57e11d1c98e1308ee5318fb47d78a6ba2
CRs-Fixed: 2453603
Bala Venkatesh 6 år sedan
förälder
incheckning
94b9ce4320
1 ändrade filer med 3 tillägg och 4 borttagningar
  1. 3 4
      qdf/linux/src/qdf_mc_timer.c

+ 3 - 4
qdf/linux/src/qdf_mc_timer.c

@@ -745,10 +745,10 @@ QDF_STATUS qdf_mc_timer_stop(qdf_mc_timer_t *timer)
 
 	timer->state = QDF_TIMER_STATE_STOPPED;
 
-	del_timer(&(timer->platform_info.timer));
-
 	qdf_spin_unlock_irqrestore(&timer->platform_info.spinlock);
 
+	del_timer(&(timer->platform_info.timer));
+
 	qdf_try_allowing_sleep(timer->type);
 
 	return QDF_STATUS_SUCCESS;
@@ -787,9 +787,8 @@ QDF_STATUS qdf_mc_timer_stop_sync(qdf_mc_timer_t *timer)
 
 	timer->state = QDF_TIMER_STATE_STOPPED;
 
-	del_timer_sync(&(timer->platform_info.timer));
-
 	qdf_spin_unlock_irqrestore(&timer->platform_info.spinlock);
+	del_timer_sync(&(timer->platform_info.timer));
 
 	qdf_try_allowing_sleep(timer->type);