ipmr: improve hash scalability
authorNikolay Aleksandrov <nikolay@cumulusnetworks.com>
Thu, 12 Jan 2017 14:53:33 +0000 (15:53 +0100)
committerDavid S. Miller <davem@davemloft.net>
Thu, 12 Jan 2017 21:48:26 +0000 (16:48 -0500)
commit8fb472c09b9df478a062eacc7841448e40fc3c17
treed9f1d2ffceccdfe7cbeb4743c763177dcce95ad7
parentc1ce1560a1ae1a58505c26bc0e46ce1aee982d54
ipmr: improve hash scalability

Recently we started using ipmr with thousands of entries and easily hit
soft lockups on smaller devices. The reason is that the hash function
uses the high order bits from the src and dst, but those don't change in
many common cases, also the hash table  is only 64 elements so with
thousands it doesn't scale at all.
This patch migrates the hash table to rhashtable, and in particular the
rhl interface which allows for duplicate elements to be chained because
of the MFC_PROXY support (*,G; *,*,oif cases) which allows for multiple
duplicate entries to be added with different interfaces (IMO wrong, but
it's been in for a long time).

And here are some results from tests I've run in a VM:
 mr_table size (default, allocated for all namespaces):
  Before                    After
   49304 bytes               2400 bytes

 Add 65000 routes (the diff is much larger on smaller devices):
  Before                    After
   1m42s                     58s

 Forwarding 256 byte packets with 65000 routes (test done in a VM):
  Before                    After
   3 Mbps / ~1465 pps        122 Mbps / ~59000 pps

As a bonus we no longer see the soft lockups on smaller devices which
showed up even with 2000 entries before.

Signed-off-by: Nikolay Aleksandrov <nikolay@cumulusnetworks.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/mroute.h
net/ipv4/ipmr.c