• Florian Westphal's avatar
    mptcp: rework poll+nospace handling · 8edf0864
    Florian Westphal authored
    MPTCP maintains a status bit, MPTCP_SEND_SPACE, that is set when at
    least one subflow and the mptcp socket itself are writeable.
    
    mptcp_poll returns EPOLLOUT if the bit is set.
    
    mptcp_sendmsg makes sure MPTCP_SEND_SPACE gets cleared when last write
    has used up all subflows or the mptcp socket wmem.
    
    This reworks nospace handling as follows:
    
    MPTCP_SEND_SPACE is replaced with MPTCP_NOSPACE, i.e. inverted meaning.
    This bit is set when the mptcp socket is not writeable.
    The mptcp-level ack path schedule will then schedule the mptcp worker
    to allow it to free already-acked data (and reduce wmem usage).
    
    This will then wake userspace processes that wait for a POLLOUT event.
    
    sendmsg will set MPTCP_NOSPACE only when it has to wait for more
    wmem (blocking I/O case).
    
    poll path will set MPTCP_NOSPACE in case the mptcp socket is
    not writeable.
    
    Normal tcp-level notification (SOCK_NOSPACE) is only enabled
    in case the subflow socket has no available wmem.
    Signed-off-by: default avatarFlorian Westphal <fw@strlen.de>
    Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
    Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    8edf0864
protocol.c 73.2 KB