Эх сурвалжийг харах

[BLUETOOTH] rfcomm_worker(): fix wakeup race

Set TASK_INTERRUPTIBLE prior to testing the flag to avoid missed wakeups.

Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Acked-by: Marcel Holtmann <marcel@holtmann.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Andrew Morton 18 жил өмнө
parent
commit
74da9d88bf

+ 2 - 2
net/bluetooth/rfcomm/core.c

@@ -1851,18 +1851,18 @@ static void rfcomm_worker(void)
 	BT_DBG("");
 	BT_DBG("");
 
 
 	while (!atomic_read(&terminate)) {
 	while (!atomic_read(&terminate)) {
+		set_current_state(TASK_INTERRUPTIBLE);
 		if (!test_bit(RFCOMM_SCHED_WAKEUP, &rfcomm_event)) {
 		if (!test_bit(RFCOMM_SCHED_WAKEUP, &rfcomm_event)) {
 			/* No pending events. Let's sleep.
 			/* No pending events. Let's sleep.
 			 * Incoming connections and data will wake us up. */
 			 * Incoming connections and data will wake us up. */
-			set_current_state(TASK_INTERRUPTIBLE);
 			schedule();
 			schedule();
 		}
 		}
+		set_current_state(TASK_RUNNING);
 
 
 		/* Process stuff */
 		/* Process stuff */
 		clear_bit(RFCOMM_SCHED_WAKEUP, &rfcomm_event);
 		clear_bit(RFCOMM_SCHED_WAKEUP, &rfcomm_event);
 		rfcomm_process_sessions();
 		rfcomm_process_sessions();
 	}
 	}
-	set_current_state(TASK_RUNNING);
 	return;
 	return;
 }
 }