Message ID | 20191106111217.23178-1-tuong.t.lien@dektech.com.au |
---|---|
State | Accepted |
Delegated to: | David Miller |
Headers | show |
Series | [net-next] tipc: eliminate the dummy packet in link synching | expand |
From: Tuong Lien <tuong.t.lien@dektech.com.au> Date: Wed, 6 Nov 2019 18:12:17 +0700 > When preparing tunnel packets for the link failover or synchronization, > as for the safe algorithm, we added a dummy packet on the pair link but > never sent it out. In the case of failover, the pair link will be reset > anyway. But for link synching, it will always result in retransmission > of the dummy packet after that. > We have also observed that such the retransmission at the early stage > when a new node comes in a large cluster will take some time and hard > to be done, leading to the repeated retransmit failures and the link is > reset. > > Since in commit 4929a932be33 ("tipc: optimize link synching mechanism") > we have already built a dummy 'TUNNEL_PROTOCOL' message on the new link > for the synchronization, there's no need for the dummy on the pair one, > this commit will skip it when the new mechanism takes in place. In case > nothing exists in the pair link's transmq, the link synching will just > start and stop shortly on the peer side. > > The patch is backward compatible. > > Acked-by: Jon Maloy <jon.maloy@ericsson.com> > Tested-by: Hoang Le <hoang.h.le@dektech.com.au> > Signed-off-by: Tuong Lien <tuong.t.lien@dektech.com.au> Applied, thanks Tuong.
diff --git a/net/tipc/link.c b/net/tipc/link.c index 999eab592de8..7e36b7ba61a9 100644 --- a/net/tipc/link.c +++ b/net/tipc/link.c @@ -1728,21 +1728,6 @@ void tipc_link_tnl_prepare(struct tipc_link *l, struct tipc_link *tnl, return; __skb_queue_head_init(&tnlq); - __skb_queue_head_init(&tmpxq); - __skb_queue_head_init(&frags); - - /* At least one packet required for safe algorithm => add dummy */ - skb = tipc_msg_create(TIPC_LOW_IMPORTANCE, TIPC_DIRECT_MSG, - BASIC_H_SIZE, 0, l->addr, tipc_own_addr(l->net), - 0, 0, TIPC_ERR_NO_PORT); - if (!skb) { - pr_warn("%sunable to create tunnel packet\n", link_co_err); - return; - } - __skb_queue_tail(&tnlq, skb); - tipc_link_xmit(l, &tnlq, &tmpxq); - __skb_queue_purge(&tmpxq); - /* Link Synching: * From now on, send only one single ("dummy") SYNCH message * to peer. The SYNCH message does not contain any data, just @@ -1768,6 +1753,20 @@ void tipc_link_tnl_prepare(struct tipc_link *l, struct tipc_link *tnl, return; } + __skb_queue_head_init(&tmpxq); + __skb_queue_head_init(&frags); + /* At least one packet required for safe algorithm => add dummy */ + skb = tipc_msg_create(TIPC_LOW_IMPORTANCE, TIPC_DIRECT_MSG, + BASIC_H_SIZE, 0, l->addr, tipc_own_addr(l->net), + 0, 0, TIPC_ERR_NO_PORT); + if (!skb) { + pr_warn("%sunable to create tunnel packet\n", link_co_err); + return; + } + __skb_queue_tail(&tnlq, skb); + tipc_link_xmit(l, &tnlq, &tmpxq); + __skb_queue_purge(&tmpxq); + /* Initialize reusable tunnel packet header */ tipc_msg_init(tipc_own_addr(l->net), &tnlhdr, TUNNEL_PROTOCOL, mtyp, INT_H_SIZE, l->addr);