mirror of
https://github.com/torvalds/linux.git
synced 2024-11-24 13:11:40 +00:00
tipc: ensure correct broadcast send buffer release when peer is lost
After a new receiver peer has been added to the broadcast transmission link, we allow immediate transmission of new broadcast packets, trusting that the new peer will not accept the packets until it has received the previously sent unicast broadcast initialiation message. In the same way, the sender must not accept any acknowledges until it has itself received the broadcast initialization from the peer, as well as confirmation of the reception of its own initialization message. Furthermore, when a receiver peer goes down, the sender has to produce the missing acknowledges from the lost peer locally, in order ensure correct release of the buffers that were expected to be acknowledged by the said peer. In a highly stressed system we have observed that contact with a peer may come up and be lost before the above mentioned broadcast initial- ization and confirmation have been received. This leads to the locally produced acknowledges being rejected, and the non-acknowledged buffers to linger in the broadcast link transmission queue until it fills up and the link goes into permanent congestion. In this commit, we remedy this by temporarily setting the corresponding broadcast receive link state to ESTABLISHED and the 'bc_peer_is_up' state to true before we issue the local acknowledges. This ensures that those acknowledges will always be accepted. The mentioned state values are restored immediately afterwards when the link is reset. 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>
This commit is contained in:
parent
2d18ac4ba7
commit
a71eb72035
@ -349,6 +349,8 @@ void tipc_link_remove_bc_peer(struct tipc_link *snd_l,
|
||||
u16 ack = snd_l->snd_nxt - 1;
|
||||
|
||||
snd_l->ackers--;
|
||||
rcv_l->bc_peer_is_up = true;
|
||||
rcv_l->state = LINK_ESTABLISHED;
|
||||
tipc_link_bc_ack_rcv(rcv_l, ack, xmitq);
|
||||
tipc_link_reset(rcv_l);
|
||||
rcv_l->state = LINK_RESET;
|
||||
|
Loading…
Reference in New Issue
Block a user