• Eric Dumazet's avatar
    net: fix route cache rebuilds · 98376387
    Eric Dumazet authored
    We added an automatic route cache rebuilding in commit 1080d709
    but had to correct few bugs. One of the assumption of original patch,
    was that entries where kept sorted in a given way.
    
    This assumption is known to be wrong (commit 1ddbcb00 gave an
    explanation of this and corrected a leak) and expensive to respect.
    
    Paweł Staszewski reported to me one of his machine got its routing cache
    disabled after few messages like :
    
    [ 2677.850065] Route hash chain too long!
    [ 2677.850080] Adjust your secret_interval!
    [82839.662993] Route hash chain too long!
    [82839.662996] Adjust your secret_interval!
    [155843.731650] Route hash chain too long!
    [155843.731664] Adjust your secret_interval!
    [155843.811881] Route hash chain too long!
    [155843.811891] Adjust your secret_interval!
    [155843.858209] vlan0811: 5 rebuilds is over limit, route caching
    disabled
    [155843.858212] Route hash chain too long!
    [155843.858213] Adjust your secret_interval!
    
    This is because rt_intern_hash() might be fooled when computing a chain
    length, because multiple entries with same keys can differ because of
    TOS (or mark/oif) bits.
    
    In the rare case the fast algorithm see a too long chain, and before
    taking expensive path, we call a helper function in order to not count
    duplicates of same routes, that only differ with tos/mark/oif bits. This
    helper works with data already in cpu cache and is not be very
    expensive, despite its O(N^2) implementation.
    
    Paweł Staszewski sucessfully tested this patch on his loaded router.
    Reported-and-tested-by: default avatarPaweł Staszewski <pstaszewski@itcare.pl>
    Signed-off-by: default avatarEric Dumazet <eric.dumazet@gmail.com>
    Acked-by: default avatarNeil Horman <nhorman@tuxdriver.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    98376387
route.c 84.1 KB