diff options
author | Jon Maloy <jon.maloy@ericsson.com> | 2018-01-08 21:03:31 +0100 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-01-09 12:35:58 -0500 |
commit | eb929a91b213d2a72c5a8b4af9a1acf63bfb8287 (patch) | |
tree | 9562eb2a8fc216296ce455d4b124ada6b13ca965 /net/tipc/group.h | |
parent | 232d07b74a33b9f5d48516dc1d8ce41723ada593 (diff) | |
download | op-kernel-dev-eb929a91b213d2a72c5a8b4af9a1acf63bfb8287.zip op-kernel-dev-eb929a91b213d2a72c5a8b4af9a1acf63bfb8287.tar.gz |
tipc: improve poll() for group member socket
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: Ying Xue <ying.xue@windriver.com>
Signed-off-by: Jon Maloy <jon.maloy@ericsson.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/tipc/group.h')
-rw-r--r-- | net/tipc/group.h | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/net/tipc/group.h b/net/tipc/group.h index dee7947..f4a596e 100644 --- a/net/tipc/group.h +++ b/net/tipc/group.h @@ -67,9 +67,9 @@ void tipc_group_update_bc_members(struct tipc_group *grp, int len, bool ack); bool tipc_group_cong(struct tipc_group *grp, u32 dnode, u32 dport, int len, struct tipc_member **m); bool tipc_group_bc_cong(struct tipc_group *grp, int len); +bool tipc_group_is_open(struct tipc_group *grp); void tipc_group_update_rcv_win(struct tipc_group *grp, int blks, u32 node, u32 port, struct sk_buff_head *xmitq); u16 tipc_group_bc_snd_nxt(struct tipc_group *grp); void tipc_group_update_member(struct tipc_member *m, int len); -int tipc_group_size(struct tipc_group *grp); #endif |