• Jon Maloy's avatar
    tipc: improve poll() for group member socket · eb929a91
    Jon Maloy authored
    The current criteria for returning POLLOUT from a group member socket is
    too simplistic. It basically returns POLLOUT as soon as the group has
    external destinations, something obviously leading to a lot of spinning
    during destination congestion situations. At the same time, the internal
    congestion handling is unnecessarily complex.
    
    We now change this as follows.
    
    - We introduce an 'open' flag in  struct tipc_group. This flag is used
      only to help poll() get the setting of POLLOUT right, and *not* for
      congeston handling as such. This means that a user can choose to
      ignore an  EAGAIN for a destination and go on sending messages to
      other destinations in the group if he wants to.
    
    - The flag is set to false every time we return EAGAIN on a send call.
    
    - The flag is set to true every time any member, i.e., not necessarily
      the member that caused EAGAIN, is removed from the small_win list.
    
    - We remove the group member 'usr_pending' flag. The size of the send
      window and presence in the 'small_win' list is sufficient criteria
      for recognizing congestion.
    
    This solution seems to be a reasonable compromise between 'anycast',
    which is normally not waiting for POLLOUT for a specific destination,
    and the other three send modes, which are.
    Acked-by: default avatarYing Xue <ying.xue@windriver.com>
    Signed-off-by: default avatarJon Maloy <jon.maloy@ericsson.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    eb929a91
socket.c 86.3 KB