linux-stable/net/tipc
Jon Paul Maloy c637c10355 tipc: resolve race problem at unicast message reception
TIPC handles message cardinality and sequencing at the link layer,
before passing messages upwards to the destination sockets. During the
upcall from link to socket no locks are held. It is therefore possible,
and we see it happen occasionally, that messages arriving in different
threads and delivered in sequence still bypass each other before they
reach the destination socket. This must not happen, since it violates
the sequentiality guarantee.

We solve this by adding a new input buffer queue to the link structure.
Arriving messages are added safely to the tail of that queue by the
link, while the head of the queue is consumed, also safely, by the
receiving socket. Sequentiality is secured per socket by only allowing
buffers to be dequeued inside the socket lock. Since there may be multiple
simultaneous readers of the queue, we use a 'filter' parameter to reduce
the risk that they peek the same buffer from the queue, hence also
reducing the risk of contention on the receiving socket locks.

This solves the sequentiality problem, and seems to cause no measurable
performance degradation.

A nice side effect of this change is that lock handling in the functions
tipc_rcv() and tipc_bcast_rcv() now becomes uniform, something that
will enable future simplifications of those functions.

Reviewed-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>
2015-02-05 16:00:02 -08:00
..
addr.c tipc: make tipc node address support net namespace 2015-01-12 16:24:33 -05:00
addr.h tipc: make tipc node address support net namespace 2015-01-12 16:24:33 -05:00
bcast.c tipc: resolve race problem at unicast message reception 2015-02-05 16:00:02 -08:00
bcast.h tipc: reduce usage of context info in socket and link 2015-02-05 16:00:01 -08:00
bearer.c tipc: make tipc node address support net namespace 2015-01-12 16:24:33 -05:00
bearer.h tipc: make tipc broadcast link support net namespace 2015-01-12 16:24:33 -05:00
config.c tipc: make tipc node address support net namespace 2015-01-12 16:24:33 -05:00
config.h tipc: involve namespace infrastructure 2015-01-12 16:24:32 -05:00
core.c tipc: make tipc random value aware of net namespace 2015-01-12 16:24:33 -05:00
core.h tipc: make tipc random value aware of net namespace 2015-01-12 16:24:33 -05:00
discover.c tipc: reduce usage of context info in socket and link 2015-02-05 16:00:01 -08:00
discover.h tipc: involve namespace infrastructure 2015-01-12 16:24:32 -05:00
eth_media.c tipc: improve and extend media address conversion functions 2014-05-14 15:19:48 -04:00
ib_media.c tipc: improve and extend media address conversion functions 2014-05-14 15:19:48 -04:00
Kconfig tipc: convert tipc reference table to use generic rhashtable 2015-01-08 19:47:14 -08:00
link.c tipc: resolve race problem at unicast message reception 2015-02-05 16:00:02 -08:00
link.h tipc: resolve race problem at unicast message reception 2015-02-05 16:00:02 -08:00
log.c tipc: remove print_buf and deprecated log buffer code 2012-07-13 19:34:43 -04:00
Makefile tipc: remove node subscription infrastructure 2014-11-26 12:30:16 -05:00
msg.c tipc: resolve race problem at unicast message reception 2015-02-05 16:00:02 -08:00
msg.h tipc: resolve race problem at unicast message reception 2015-02-05 16:00:02 -08:00
name_distr.c tipc: resolve race problem at unicast message reception 2015-02-05 16:00:02 -08:00
name_distr.h tipc: resolve race problem at unicast message reception 2015-02-05 16:00:02 -08:00
name_table.c tipc: make tipc node address support net namespace 2015-01-12 16:24:33 -05:00
name_table.h tipc: name tipc name table support net namespace 2015-01-12 16:24:33 -05:00
net.c tipc: make tipc node address support net namespace 2015-01-12 16:24:33 -05:00
net.h tipc: make tipc node table aware of net namespace 2015-01-12 16:24:32 -05:00
netlink.c tipc: make netlink support net namespace 2015-01-12 16:24:34 -05:00
netlink.h tipc: cleanup core.c and core.h files 2015-01-12 16:24:31 -05:00
node.c tipc: resolve race problem at unicast message reception 2015-02-05 16:00:02 -08:00
node.h tipc: resolve race problem at unicast message reception 2015-02-05 16:00:02 -08:00
server.c tipc: make subscriber server support net namespace 2015-01-12 16:24:33 -05:00
server.h tipc: make subscriber server support net namespace 2015-01-12 16:24:33 -05:00
socket.c tipc: resolve race problem at unicast message reception 2015-02-05 16:00:02 -08:00
socket.h tipc: resolve race problem at unicast message reception 2015-02-05 16:00:02 -08:00
subscr.c tipc: make subscriber server support net namespace 2015-01-12 16:24:33 -05:00
subscr.h tipc: make subscriber server support net namespace 2015-01-12 16:24:33 -05:00
sysctl.c tipc: add name distributor resiliency queue 2014-09-01 17:51:48 -07:00