• Ursula Braun's avatar
    net/smc: rebuild nonblocking connect · 24ac3a08
    Ursula Braun authored
    The recent poll change may lead to stalls for non-blocking connecting
    SMC sockets, since sock_poll_wait is no longer performed on the
    internal CLC socket, but on the outer SMC socket.  kernel_connect() on
    the internal CLC socket returns with -EINPROGRESS, but the wake up
    logic does not work in all cases. If the internal CLC socket is still
    in state TCP_SYN_SENT when polled, sock_poll_wait() from sock_poll()
    does not sleep. It is supposed to sleep till the state of the internal
    CLC socket switches to TCP_ESTABLISHED.
    
    This problem triggered a redesign of the SMC nonblocking connect logic.
    This patch introduces a connect worker covering all connect steps
    followed by a wake up of socket waiters. It allows to get rid of all
    delays and locks in smc_poll().
    
    Fixes: c0129a06 ("smc: convert to ->poll_mask")
    Signed-off-by: default avatarUrsula Braun <ubraun@linux.ibm.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    24ac3a08
af_smc.c 43.6 KB