• Petr Machata's avatar
    mlxsw: spectrum_router: Move VRF refcounting · 28a04c7b
    Petr Machata authored
    When creating a new RIF, bumping RIF count of the containing VR is the
    last thing to be done. Symmetrically, when destroying a RIF, RIF count
    is first dropped and only then the rest of the cleanup proceeds.
    
    That's a problem for loopback RIFs. Those hold two VR references: one
    for overlay and one for underlay. mlxsw_sp_rif_destroy() releases the
    overlay one, and the deconfigure() callback the underlay one. But if
    both overlay and underlay are the same, and if there are no other
    artifacts holding the VR alive, this put actually destroys the VR. Later
    on, when mlxsw_sp_rif_destroy() calls mlxsw_sp_vr_put() for the same VR,
    the VR will already have been released and the kernel crashes with NULL
    pointer dereference.
    
    The underlying problem is that the RIF under destruction ends up
    referencing the overlay VR much longer than it claims: all the way until
    the call to mlxsw_sp_vr_put(). So line up the reference counting
    properly to reflect this. Make corresponding changes in
    mlxsw_sp_rif_create() as well for symmetry.
    
    Fixes: 6ddb7426 ("mlxsw: spectrum_router: Introduce loopback RIFs")
    Signed-off-by: default avatarPetr Machata <petrm@mellanox.com>
    Reviewed-by: default avatarIdo Schimmel <idosch@mellanox.com>
    Signed-off-by: default avatarJiri Pirko <jiri@mellanox.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    28a04c7b
spectrum_router.c 159 KB