-
- Downloads
sched: fix race in wake_lock()
wake_lock() prevents a race with the target thread waking up after wake_lock()
and attempting to take the mutex by itself, by changing the thread status
to sending_lock.
However, it doesn't prevent the reverse race:
t1 t2
========================= ======================
wait_for()
mutex::unlock()
thread::wait()
t1->wake()
mutex::lock()
mutex::lock() [A]
thread::wait()
t1->wake_lock() [B]
After [A], t1 is waiting on the mutex, and after [B], it is waiting twice,
which is impossible and aborts on an assertion failure.
Fix by detecting that we're already waiting in send_lock() aborting the
send_lock().
Signed-off-by:
Avi Kivity <avi@cloudius-systems.com>
Please register or sign in to comment