wq_has_sleeper — check if there are any waiting processes
| bool wq_has_sleeper ( | struct socket_wq * wq ); | 
Returns true if socket_wq has waiting processes
The purpose of the wq_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.
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.