• Ying Xue's avatar
    tipc: fix race/inefficiencies in poll/wait behaviour · f288bef4
    Ying Xue authored
    When an application blocks at poll/select on a TIPC socket
    while requesting a specific event mask, both the filter_rcv() and
    wakeupdispatch() case will wake it up unconditionally whenever
    the state changes (i.e an incoming message arrives, or congestion
    has subsided).  No mask is used.
    
    To avoid this, we populate sk->sk_data_ready and sk->sk_write_space
    with tipc_data_ready and tipc_write_space respectively, which makes
    tipc more in alignment with the rest of the networking code.  These
    pass the exact set of possible events to the waker in fs/select.c
    hence avoiding waking up blocked processes unnecessarily.
    
    In doing so, we uncover another issue -- that there needs to be a
    memory barrier in these poll/receive callbacks, otherwise we are
    subject to the the same race as documented above wq_has_sleeper()
    [in commit a57de0b4 "net: adding memory barrier to the poll and
    receive callbacks"].  So we need to replace poll_wait() with
    sock_poll_wait() and use rcu protection for the sk->sk_wq pointer
    in these two new functions.
    Signed-off-by: default avatarYing Xue <ying.xue@windriver.com>
    Signed-off-by: default avatarPaul Gortmaker <paul.gortmaker@windriver.com>
    f288bef4
socket.c 46.8 KB