[BLUETOOTH] rfcomm_worker(): fix wakeup race
authorAndrew Morton <akpm@linux-foundation.org>
Thu, 26 Apr 2007 08:41:01 +0000 (01:41 -0700)
committerDavid S. Miller <davem@davemloft.net>
Thu, 26 Apr 2007 08:41:01 +0000 (01:41 -0700)
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>
net/bluetooth/rfcomm/core.c

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