mlxsw: spectrum_router: Hold a reference on RIF's netdev
authorIdo Schimmel <idosch@mellanox.com>
Wed, 19 Dec 2018 06:08:50 +0000 (06:08 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 19 Dec 2018 20:28:07 +0000 (12:28 -0800)
Previous patches tried to make RIF deletion more robust and avoid
use-after-free situations.

As another precaution, hold a reference on a RIF's netdev and release it
when the RIF is deleted.

Signed-off-by: Ido Schimmel <idosch@mellanox.com>
Reviewed-by: Petr Machata <petrm@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c

index 08b60d4b949279707fe5ddfcfdae7189ac9b4145..673950933daceede107ec0e04022be6f5a14d5eb 100644 (file)
@@ -6302,6 +6302,7 @@ mlxsw_sp_rif_create(struct mlxsw_sp *mlxsw_sp,
                err = -ENOMEM;
                goto err_rif_alloc;
        }
+       dev_hold(rif->dev);
        rif->mlxsw_sp = mlxsw_sp;
        rif->ops = ops;
 
@@ -6340,6 +6341,7 @@ err_configure:
        if (fid)
                mlxsw_sp_fid_put(fid);
 err_fid_get:
+       dev_put(rif->dev);
        kfree(rif);
 err_rif_alloc:
 err_rif_index_alloc:
@@ -6367,6 +6369,7 @@ static void mlxsw_sp_rif_destroy(struct mlxsw_sp_rif *rif)
        if (fid)
                /* Loopback RIFs are not associated with a FID. */
                mlxsw_sp_fid_put(fid);
+       dev_put(rif->dev);
        kfree(rif);
        vr->rif_count--;
        mlxsw_sp_vr_put(mlxsw_sp, vr);