diff options
author | David S. Miller <davem@davemloft.net> | 2011-03-09 19:55:25 -0800 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-03-09 19:55:25 -0800 |
commit | 7343ff31ebf01691ea4515d3126467434b9d22d6 (patch) | |
tree | 13c8180b8aeb82363c1e7b576372c23fa2d5f955 /net/bridge | |
parent | 03a14ab134f4811ab1475f07b1305ccaf38b690f (diff) | |
download | blackbird-op-linux-7343ff31ebf01691ea4515d3126467434b9d22d6.tar.gz blackbird-op-linux-7343ff31ebf01691ea4515d3126467434b9d22d6.zip |
ipv6: Don't create clones of host routes.
Addresses https://bugzilla.kernel.org/show_bug.cgi?id=29252
Addresses https://bugzilla.kernel.org/show_bug.cgi?id=30462
In commit d80bc0fd262ef840ed4e82593ad6416fa1ba3fc4 ("ipv6: Always
clone offlink routes.") we forced the kernel to always clone offlink
routes.
The reason we do that is to make sure we never bind an inetpeer to a
prefixed route.
The logic turned on here has existed in the tree for many years,
but was always off due to a protecting CPP define. So perhaps
it's no surprise that there is a logic bug here.
The problem is that we canot clone a route that is already a
host route (ie. has DST_HOST set). Because if we do, an identical
entry already exists in the routing tree and therefore the
ip6_rt_ins() call is going to fail.
This sets off a series of failures and high cpu usage, because when
ip6_rt_ins() fails we loop retrying this operation a few times in
order to handle a race between two threads trying to clone and insert
the same host route at the same time.
Fix this by simply using the route as-is when DST_HOST is set.
Reported-by: slash@ac.auone-net.jp
Reported-by: Ernst Sjöstrand <ernstp@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/bridge')
0 files changed, 0 insertions, 0 deletions