• Wei Wang's avatar
    ipv4: take dst->__refcnt when caching dst in fib · 0830106c
    Wei Wang authored
    In IPv4 routing code, fib_nh and fib_nh_exception can hold pointers
    to struct rtable but they never increment dst->__refcnt.
    This leads to the need of the dst garbage collector because when user
    is done with this dst and calls dst_release(), it can only decrement
    dst->__refcnt and can not free the dst even it sees dst->__refcnt
    drops from 1 to 0 (unless DST_NOCACHE flag is set) because the routing
    code might still hold reference to it.
    And when the routing code tries to delete a route, it has to put the
    dst to the gc_list if dst->__refcnt is not yet 0 and have a gc thread
    running periodically to check on dst->__refcnt and finally to free dst
    when refcnt becomes 0.
    
    This patch increments dst->__refcnt when
    fib_nh/fib_nh_exception holds reference to this dst and properly release
    the dst when fib_nh/fib_nh_exception has been updated with a new dst.
    
    This patch is a preparation in order to fully get rid of dst gc later.
    Signed-off-by: default avatarWei Wang <weiwan@google.com>
    Acked-by: default avatarMartin KaFai Lau <kafai@fb.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    0830106c
fib_semantics.c 41.3 KB