net/mlx5: Check IPsec TX flow steering namespace in advance
authorLeon Romanovsky <leonro@nvidia.com>
Sun, 6 Mar 2022 13:21:22 +0000 (15:21 +0200)
committerSaeed Mahameed <saeedm@nvidia.com>
Wed, 4 May 2022 05:59:14 +0000 (22:59 -0700)
Ensure that flow steering is usable as early as possible, to understand
if crypto IPsec is supported or not.

Reviewed-by: Raed Salem <raeds@nvidia.com>
Reviewed-by: Saeed Mahameed <saeedm@nvidia.com>
Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
drivers/net/ethernet/mellanox/mlx5/core/en/fs.h
drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.c
drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.h
drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec_fs.c

index 678ffbb48a25f92cdfabeb5afb2987c6909cd830..4130a871de6111bf3d4b280a79492f9993627613 100644 (file)
@@ -164,7 +164,6 @@ struct mlx5e_ptp_fs;
 
 struct mlx5e_flow_steering {
        struct mlx5_flow_namespace      *ns;
-       struct mlx5_flow_namespace      *egress_ns;
 #ifdef CONFIG_MLX5_EN_RXNFC
        struct mlx5e_ethtool_steering   ethtool;
 #endif
index b6e430d53fae5725b66b64c6ce1ced50ea3d2f76..40700bf61924409c88b5bc5871ba6e671b29c5a4 100644 (file)
@@ -415,6 +415,7 @@ int mlx5e_ipsec_init(struct mlx5e_priv *priv)
 
        hash_init(ipsec->sadb_rx);
        spin_lock_init(&ipsec->sadb_rx_lock);
+       ipsec->mdev = priv->mdev;
        ipsec->en_priv = priv;
        ipsec->wq = alloc_ordered_workqueue("mlx5e_ipsec: %s", 0,
                                            priv->netdev->name);
index a0e9dade09e92128a777dfa25325e03a8a68487b..bbf48d4616f9e5de08433d7665efba749c603074 100644 (file)
@@ -61,6 +61,7 @@ struct mlx5e_accel_fs_esp;
 struct mlx5e_ipsec_tx;
 
 struct mlx5e_ipsec {
+       struct mlx5_core_dev *mdev;
        struct mlx5e_priv *en_priv;
        DECLARE_HASHTABLE(sadb_rx, MLX5E_IPSEC_SADB_RX_BITS);
        spinlock_t sadb_rx_lock; /* Protects sadb_rx */
index 029a9a70ba0e7af91b9b1441db1ab679ea29ac63..55fb6d4cf4ae0387723e0fc2bfa36cf6d7171ab8 100644 (file)
@@ -35,6 +35,7 @@ struct mlx5e_accel_fs_esp {
 };
 
 struct mlx5e_ipsec_tx {
+       struct mlx5_flow_namespace *ns;
        struct mlx5_flow_table *ft;
        struct mutex mutex; /* Protect IPsec TX steering */
        u32 refcnt;
@@ -338,15 +339,9 @@ static int tx_create(struct mlx5e_priv *priv)
        struct mlx5_flow_table *ft;
        int err;
 
-       priv->fs.egress_ns =
-               mlx5_get_flow_namespace(priv->mdev,
-                                       MLX5_FLOW_NAMESPACE_EGRESS_KERNEL);
-       if (!priv->fs.egress_ns)
-               return -EOPNOTSUPP;
-
        ft_attr.max_fte = NUM_IPSEC_FTE;
        ft_attr.autogroup.max_num_groups = 1;
-       ft = mlx5_create_auto_grouped_flow_table(priv->fs.egress_ns, &ft_attr);
+       ft = mlx5_create_auto_grouped_flow_table(ipsec->tx_fs->ns, &ft_attr);
        if (IS_ERR(ft)) {
                err = PTR_ERR(ft);
                netdev_err(priv->netdev, "fail to create ipsec tx ft err=%d\n", err);
@@ -658,9 +653,15 @@ int mlx5e_accel_ipsec_fs_init(struct mlx5e_ipsec *ipsec)
 {
        struct mlx5e_accel_fs_esp_prot *fs_prot;
        struct mlx5e_accel_fs_esp *accel_esp;
+       struct mlx5_flow_namespace *ns;
        enum accel_fs_esp_type i;
        int err = -ENOMEM;
 
+       ns = mlx5_get_flow_namespace(ipsec->mdev,
+                                    MLX5_FLOW_NAMESPACE_EGRESS_KERNEL);
+       if (!ns)
+               return -EOPNOTSUPP;
+
        ipsec->tx_fs = kzalloc(sizeof(*ipsec->tx_fs), GFP_KERNEL);
        if (!ipsec->tx_fs)
                return -ENOMEM;
@@ -670,6 +671,7 @@ int mlx5e_accel_ipsec_fs_init(struct mlx5e_ipsec *ipsec)
                goto err_rx;
 
        mutex_init(&ipsec->tx_fs->mutex);
+       ipsec->tx_fs->ns = ns;
 
        accel_esp = ipsec->rx_fs;
        for (i = 0; i < ACCEL_FS_ESP_NUM_TYPES; i++) {