• David S. Miller's avatar
    ipv6: Don't create clones of host routes. · 7343ff31
    David S. Miller authored
    Addresses https://bugzilla.kernel.org/show_bug.cgi?id=29252
    Addresses https://bugzilla.kernel.org/show_bug.cgi?id=30462
    
    In commit d80bc0fd ("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: default avatarErnst Sjöstrand <ernstp@gmail.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    7343ff31
route.c 68.4 KB