tipc: remove joining group member from congested list
When we receive a JOIN message from a peer member, the message may contain an advertised window value ADV_IDLE that permits removing the member in question from the tipc_group::congested list. However, since the removal has been made conditional on that the advertised window is *not* ADV_IDLE, we miss this case. This has the effect that a sender sometimes may enter a state of permanent, false, broadcast congestion. We fix this by unconditinally removing the member from the congested list before calling tipc_member_update(), which might potentially sort it into the list again. Signed-off-by: Jon Maloy <jon.maloy@ericsson.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
1c8e77fb36
Коммит
bb25c3855a
|
@ -689,10 +689,8 @@ void tipc_group_proto_rcv(struct tipc_group *grp, bool *usr_wakeup,
|
||||||
msg_set_grp_bc_seqno(ehdr, m->bc_syncpt);
|
msg_set_grp_bc_seqno(ehdr, m->bc_syncpt);
|
||||||
__skb_queue_tail(inputq, m->event_msg);
|
__skb_queue_tail(inputq, m->event_msg);
|
||||||
}
|
}
|
||||||
if (m->window < ADV_IDLE)
|
list_del_init(&m->congested);
|
||||||
tipc_group_update_member(m, 0);
|
tipc_group_update_member(m, 0);
|
||||||
else
|
|
||||||
list_del_init(&m->congested);
|
|
||||||
return;
|
return;
|
||||||
case GRP_LEAVE_MSG:
|
case GRP_LEAVE_MSG:
|
||||||
if (!m)
|
if (!m)
|
||||||
|
|
Загрузка…
Ссылка в новой задаче