skwq_has_sleeper (9) Linux Manual Page
skwq_has_sleeper – check if there are any waiting processes
Synopsis
- bool skwq_has_sleeper(struct socket_wq
* wq);
Arguments
wq
-
- struct socket_wq
Description
Returns true if socket_wq has waiting processes The purpose of the skwq_has_sleeper and sock_poll_wait is to wrap the memory barrier call. They were added due to the race found within the tcp code. Consider following tcp code paths: CPU1 CPU2
sys_select receive packet...... __add_wait_queue update tp->rcv_nxt...... tp->rcv_nxt check sock_def_readable...
{
schedule
rcu_read_lock;
wq = rcu_dereference(sk->sk_wq);
if (wq && waitqueue_active(wq->wait))
wake_up_interruptible(wq->wait)...
}
The race for tcp fires when the __add_wait_queue changes done by CPU1 stay in its cache, and so does the tp->rcv_nxt update on CPU2 side. The CPU1 could then endup calling schedule and sleep forever if there are no more data on the socket.
