Rechercher une page de manuel
wq_has_sleeper
Langue: en
Version: October 2010 (fedora - 01/12/10)
Section: 9 (Appels noyau Linux)
NAME
wq_has_sleeper - check if there are any waiting processesSYNOPSIS
- bool wq_has_sleeper(struct socket_wq * wq);
ARGUMENTS
wq
- struct socket_wq
DESCRIPTION
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.
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.
COPYRIGHT
Contenus ©2006-2024 Benjamin Poulain
Design ©2006-2024 Maxime Vantorre