]> git.baikalelectronics.ru Git - kernel.git/commit
tipc: fix problems with multipoint-to-point flow control
authorJon Maloy <jon.maloy@ericsson.com>
Fri, 29 Dec 2017 18:48:02 +0000 (19:48 +0100)
committerDavid S. Miller <davem@davemloft.net>
Wed, 3 Jan 2018 02:52:07 +0000 (21:52 -0500)
commitefb7a104081e77f9996d26c17eb7d27d6d38dd66
tree29dabfb3413a022ecf3328491c103b19bf9e1b75
parentba55ab35d1c0718435fe98d4b8590262ba2d578b
tipc: fix problems with multipoint-to-point flow control

In commit e43019d071ec ("tipc: add multipoint-to-point flow control") we
introduced a protocol for preventing buffer overflow when many group
members try to simultaneously send messages to the same receiving member.

Stress test of this mechanism has revealed a couple of related bugs:

- When the receiving member receives an advertisement REMIT message from
  one of the senders, it will sometimes prematurely activate a pending
  member and send it the remitted advertisement, although the upper
  limit for active senders has been reached. This leads to accumulation
  of illegal advertisements, and eventually to messages being dropped
  because of receive buffer overflow.

- When the receiving member leaves REMITTED state while a received
  message is being read, we miss to look at the pending queue, to
  activate the oldest pending peer. This leads to some pending senders
  being starved out, and never getting the opportunity to profit from
  the remitted advertisement.

We fix the former in the function tipc_group_proto_rcv() by returning
directly from the function once it becomes clear that the remitting
peer cannot leave REMITTED state at that point.

We fix the latter in the function tipc_group_update_rcv_win() by looking
up and activate the longest pending peer when it becomes clear that the
remitting peer now can leave REMITTED state.

Signed-off-by: Jon Maloy <jon.maloy@ericsson.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/tipc/group.c