From: Cosmin Ratiu A driver MACsec SA can exist without a hardware MACsec object. Adding an inactive RX SA or a TX SA while the SecY is non-operational creates the encryption key but skips MACsec object creation. RX SA deactivation also destroys the hardware object while retaining the driver SA and its object ID. TX SA deletion and the SA teardown performed by RX SC and SecY deletion unconditionally destroy the hardware object. This can issue a destroy command with an unallocated zero ID or an ID that has already been destroyed and potentially reused. Failed RX SA activation can leave the same stale-ID state after steering creation unwinds. Track hardware object creation separately from SA activity. Set the ownership flag after successful creation, clear it on destruction and creation unwind, and check it before destroying the object during SA cleanup. This preserves destruction of objects retained by inactive TX SAs while avoiding destruction of unowned objects. Fixes: 8ff0ac5be144 ("net/mlx5: Add MACsec offload Tx command support") Fixes: aae3454e4d4c ("net/mlx5e: Add MACsec offload Rx command support") Signed-off-by: Cosmin Ratiu Reviewed-by: Dragos Tatulea Signed-off-by: Tariq Toukan --- drivers/net/ethernet/mellanox/mlx5/core/en_accel/macsec.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/macsec.c b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/macsec.c index daff53ba7d09..20eec345b36c 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/macsec.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/macsec.c @@ -58,6 +58,7 @@ struct mlx5e_macsec_async_work { struct mlx5e_macsec_sa { bool active; + bool macsec_obj_created; u8 assoc_num; u32 macsec_obj_id; u32 enc_key_id; @@ -331,7 +332,10 @@ static void mlx5e_macsec_cleanup_sa(struct mlx5e_macsec *macsec, struct net_device *netdev, u32 fs_id) { mlx5e_macsec_cleanup_sa_fs(macsec, sa, is_tx, netdev, fs_id); - mlx5e_macsec_destroy_object(macsec->mdev, sa->macsec_obj_id); + if (sa->macsec_obj_created) { + mlx5e_macsec_destroy_object(macsec->mdev, sa->macsec_obj_id); + sa->macsec_obj_created = false; + } } static int mlx5e_macsec_init_sa_fs(struct macsec_context *ctx, @@ -396,6 +400,7 @@ static int mlx5e_macsec_init_sa(struct macsec_context *ctx, if (err) goto destroy_macsec_object; } + sa->macsec_obj_created = true; return 0; -- 2.44.0