• Wei Wang's avatar
    xfrm: take refcnt of dst when creating struct xfrm_dst bundle · 52df157f
    Wei Wang authored
    During the creation of xfrm_dst bundle, always take ref count when
    allocating the dst. This way, xfrm_bundle_create() will form a linked
    list of dst with dst->child pointing to a ref counted dst child. And
    the returned dst pointer is also ref counted. This makes the link from
    the flow cache to this dst now ref counted properly.
    As the dst is always ref counted properly, we can safely mark
    DST_NOGC flag so dst_release() will release dst based on refcnt only.
    And dst gc is no longer needed and all dst_free() and its related
    function calls should be replaced with dst_release() or
    dst_release_immediate().
    
    The special handling logic for dst->child in dst_destroy() can be
    replaced with a simple dst_release_immediate() call on the child to
    release the whole list linked by dst->child pointer.
    Previously used DST_NOHASH flag is not needed anymore as well. The
    reason that DST_NOHASH is used in the existing code is mainly to prevent
    the dst inserted in the fib tree to be wrongly destroyed during the
    deletion of the xfrm_dst bundle. So in the existing code, DST_NOHASH
    flag is marked in all the dst children except the one which is in the
    fib tree.
    However, with this patch series to remove dst gc logic and release dst
    only based on ref count, it is safe to release all the children from a
    xfrm_dst bundle as long as the dst children are all ref counted
    properly which is already the case in the existing code.
    So, this patch removes the use of DST_NOHASH flag.
    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>
    52df157f
xfrm_policy.c 80.1 KB