]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
net/mlx5e: Disable TLS device offload in kdump mode
authorAlaa Hleihel <alaa@nvidia.com>
Tue, 27 Apr 2021 09:51:41 +0000 (12:51 +0300)
committerSaeed Mahameed <saeedm@nvidia.com>
Thu, 3 Jun 2021 20:10:20 +0000 (13:10 -0700)
Under kdump environment we want to use the smallest possible amount
of resources, that includes setting SQ size to minimum.
However, when running on a device that supports TLS device offload,
then the SQ stop room becomes larger than with non-capable device and
requires increasing the SQ size.

Since TLS device offload is not necessary in kdump mode, disable it to
reduce the memory requirements for capable devices.

With this change, the needed SQ stop room size drops by 33.

Signed-off-by: Alaa Hleihel <alaa@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
drivers/net/ethernet/mellanox/mlx5/core/en/params.c
drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls.c
drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls.h
drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls_tx.c
drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls_txrx.h
drivers/net/ethernet/mellanox/mlx5/core/en_accel/tls.c
drivers/net/ethernet/mellanox/mlx5/core/en_accel/tls.h
drivers/net/ethernet/mellanox/mlx5/core/en_accel/tls_rxtx.c
drivers/net/ethernet/mellanox/mlx5/core/en_accel/tls_stats.c
drivers/net/ethernet/mellanox/mlx5/core/en_main.c

index 69cdc4e41a46e97e04c9349baff281a6b5440b1f..150c8e82c73867027cb7818939f5b5d9c6dc8f9e 100644 (file)
@@ -614,7 +614,7 @@ static u8 mlx5e_build_icosq_log_wq_sz(struct mlx5e_params *params,
 
 static u8 mlx5e_build_async_icosq_log_wq_sz(struct mlx5_core_dev *mdev)
 {
-       if (mlx5_accel_is_ktls_rx(mdev))
+       if (mlx5e_accel_is_ktls_rx(mdev))
                return MLX5E_PARAMS_DEFAULT_LOG_SQ_SIZE;
 
        return MLX5E_PARAMS_MINIMUM_LOG_SQ_SIZE;
@@ -643,7 +643,7 @@ static void mlx5e_build_async_icosq_param(struct mlx5_core_dev *mdev,
 
        mlx5e_build_sq_param_common(mdev, param);
        param->stop_room = mlx5e_stop_room_for_wqe(1); /* for XSK NOP */
-       param->is_tls = mlx5_accel_is_ktls_rx(mdev);
+       param->is_tls = mlx5e_accel_is_ktls_rx(mdev);
        if (param->is_tls)
                param->stop_room += mlx5e_stop_room_for_wqe(1); /* for TLS RX resync NOP */
        MLX5_SET(sqc, sqc, reg_umr, MLX5_CAP_ETH(mdev, reg_umr_sq));
index 95293ee0d38da0ec000aae324a7c2b78ca292615..d93aadbf10da85f5806a247ec05b0afca06085da 100644 (file)
@@ -59,12 +59,15 @@ void mlx5e_ktls_build_netdev(struct mlx5e_priv *priv)
        struct net_device *netdev = priv->netdev;
        struct mlx5_core_dev *mdev = priv->mdev;
 
-       if (mlx5_accel_is_ktls_tx(mdev)) {
+       if (!mlx5e_accel_is_ktls_tx(mdev) && !mlx5e_accel_is_ktls_rx(mdev))
+               return;
+
+       if (mlx5e_accel_is_ktls_tx(mdev)) {
                netdev->hw_features |= NETIF_F_HW_TLS_TX;
                netdev->features    |= NETIF_F_HW_TLS_TX;
        }
 
-       if (mlx5_accel_is_ktls_rx(mdev))
+       if (mlx5e_accel_is_ktls_rx(mdev))
                netdev->hw_features |= NETIF_F_HW_TLS_RX;
 
        netdev->tlsdev_ops = &mlx5e_ktls_ops;
@@ -89,7 +92,7 @@ int mlx5e_ktls_init_rx(struct mlx5e_priv *priv)
 {
        int err;
 
-       if (!mlx5_accel_is_ktls_rx(priv->mdev))
+       if (!mlx5e_accel_is_ktls_rx(priv->mdev))
                return 0;
 
        priv->tls->rx_wq = create_singlethread_workqueue("mlx5e_tls_rx");
@@ -109,7 +112,7 @@ int mlx5e_ktls_init_rx(struct mlx5e_priv *priv)
 
 void mlx5e_ktls_cleanup_rx(struct mlx5e_priv *priv)
 {
-       if (!mlx5_accel_is_ktls_rx(priv->mdev))
+       if (!mlx5e_accel_is_ktls_rx(priv->mdev))
                return;
 
        if (priv->netdev->features & NETIF_F_HW_TLS_RX)
index aaa579bf9a3992babfa0579ed244f7de5dd5508a..5833deb2354ca10e1f75a3a6c0f02f12211cbe7f 100644 (file)
@@ -15,6 +15,25 @@ int mlx5e_ktls_set_feature_rx(struct net_device *netdev, bool enable);
 struct mlx5e_ktls_resync_resp *
 mlx5e_ktls_rx_resync_create_resp_list(void);
 void mlx5e_ktls_rx_resync_destroy_resp_list(struct mlx5e_ktls_resync_resp *resp_list);
+
+static inline bool mlx5e_accel_is_ktls_tx(struct mlx5_core_dev *mdev)
+{
+       return !is_kdump_kernel() &&
+               mlx5_accel_is_ktls_tx(mdev);
+}
+
+static inline bool mlx5e_accel_is_ktls_rx(struct mlx5_core_dev *mdev)
+{
+       return !is_kdump_kernel() &&
+               mlx5_accel_is_ktls_rx(mdev);
+}
+
+static inline bool mlx5e_accel_is_ktls_device(struct mlx5_core_dev *mdev)
+{
+       return !is_kdump_kernel() &&
+               mlx5_accel_is_ktls_device(mdev);
+}
+
 #else
 
 static inline void mlx5e_ktls_build_netdev(struct mlx5e_priv *priv)
@@ -44,6 +63,11 @@ mlx5e_ktls_rx_resync_create_resp_list(void)
 
 static inline void
 mlx5e_ktls_rx_resync_destroy_resp_list(struct mlx5e_ktls_resync_resp *resp_list) {}
+
+static inline bool mlx5e_accel_is_ktls_tx(struct mlx5_core_dev *mdev) { return false; }
+static inline bool mlx5e_accel_is_ktls_rx(struct mlx5_core_dev *mdev) { return false; }
+static inline bool mlx5e_accel_is_ktls_device(struct mlx5_core_dev *mdev) { return false; }
+
 #endif
 
 #endif /* __MLX5E_TLS_H__ */
index 51bdf71073f31f691515e39b392f352a87c49044..2c0a9344338a5ef468562731e11bccea800021d7 100644 (file)
@@ -23,10 +23,13 @@ mlx5e_ktls_dumps_num_wqes(struct mlx5e_params *params, unsigned int nfrags,
        return nfrags + DIV_ROUND_UP(sync_len, MLX5E_SW2HW_MTU(params, params->sw_mtu));
 }
 
-u16 mlx5e_ktls_get_stop_room(struct mlx5e_params *params)
+u16 mlx5e_ktls_get_stop_room(struct mlx5_core_dev *mdev, struct mlx5e_params *params)
 {
        u16 num_dumps, stop_room = 0;
 
+       if (!mlx5e_accel_is_ktls_tx(mdev))
+               return 0;
+
        num_dumps = mlx5e_ktls_dumps_num_wqes(params, MAX_SKB_FRAGS, TLS_MAX_PAYLOAD_SIZE);
 
        stop_room += mlx5e_stop_room_for_wqe(MLX5E_TLS_SET_STATIC_PARAMS_WQEBBS);
index 8f79335057dca0be949ffa1de8ab66cfaa537915..08c9d5134479663125a8473d3783a6a5e2db78a1 100644 (file)
@@ -14,7 +14,7 @@ struct mlx5e_accel_tx_tls_state {
        u32 tls_tisn;
 };
 
-u16 mlx5e_ktls_get_stop_room(struct mlx5e_params *params);
+u16 mlx5e_ktls_get_stop_room(struct mlx5_core_dev *mdev, struct mlx5e_params *params);
 
 bool mlx5e_ktls_handle_tx_skb(struct tls_context *tls_ctx, struct mlx5e_txqsq *sq,
                              struct sk_buff *skb, int datalen,
index d6b21b899dbcce5355c9a12ad3001303287f3d2b..b8fc863aa68d58c7d20f3a237d6436a87ced4541 100644 (file)
@@ -192,13 +192,13 @@ void mlx5e_tls_build_netdev(struct mlx5e_priv *priv)
        struct net_device *netdev = priv->netdev;
        u32 caps;
 
-       if (mlx5_accel_is_ktls_device(priv->mdev)) {
+       if (mlx5e_accel_is_ktls_device(priv->mdev)) {
                mlx5e_ktls_build_netdev(priv);
                return;
        }
 
        /* FPGA */
-       if (!mlx5_accel_is_tls_device(priv->mdev))
+       if (!mlx5e_accel_is_tls_device(priv->mdev))
                return;
 
        caps = mlx5_accel_tls_device_caps(priv->mdev);
@@ -224,7 +224,7 @@ int mlx5e_tls_init(struct mlx5e_priv *priv)
 {
        struct mlx5e_tls *tls;
 
-       if (!mlx5_accel_is_tls_device(priv->mdev))
+       if (!mlx5e_accel_is_tls_device(priv->mdev))
                return 0;
 
        tls = kzalloc(sizeof(*tls), GFP_KERNEL);
index 4c9274d390da1d9345474a2a5efc06319b3d3ab3..3fd6fd69bbd0c93a1b5189e1cbdaf3793c9e381d 100644 (file)
@@ -103,11 +103,18 @@ int mlx5e_tls_get_count(struct mlx5e_priv *priv);
 int mlx5e_tls_get_strings(struct mlx5e_priv *priv, uint8_t *data);
 int mlx5e_tls_get_stats(struct mlx5e_priv *priv, u64 *data);
 
+static inline bool mlx5e_accel_is_tls_device(struct mlx5_core_dev *mdev)
+{
+       return !is_kdump_kernel() &&
+               mlx5_accel_is_tls_device(mdev);
+}
+
 #else
 
 static inline void mlx5e_tls_build_netdev(struct mlx5e_priv *priv)
 {
-       if (mlx5_accel_is_ktls_device(priv->mdev))
+       if (!is_kdump_kernel() &&
+           mlx5_accel_is_ktls_device(priv->mdev))
                mlx5e_ktls_build_netdev(priv);
 }
 
@@ -117,6 +124,7 @@ static inline void mlx5e_tls_cleanup(struct mlx5e_priv *priv) { }
 static inline int mlx5e_tls_get_count(struct mlx5e_priv *priv) { return 0; }
 static inline int mlx5e_tls_get_strings(struct mlx5e_priv *priv, uint8_t *data) { return 0; }
 static inline int mlx5e_tls_get_stats(struct mlx5e_priv *priv, u64 *data) { return 0; }
+static inline bool mlx5e_accel_is_tls_device(struct mlx5_core_dev *mdev) { return false; }
 
 #endif
 
index 82dc09aaa7fc3e2fadf49103830d4d3b941b39cd..7a700f913582fb64cbf757307019934bdf8f1a56 100644 (file)
@@ -273,7 +273,7 @@ bool mlx5e_tls_handle_tx_skb(struct net_device *netdev, struct mlx5e_txqsq *sq,
        if (WARN_ON_ONCE(tls_ctx->netdev != netdev))
                goto err_out;
 
-       if (mlx5_accel_is_ktls_tx(sq->mdev))
+       if (mlx5e_accel_is_ktls_tx(sq->mdev))
                return mlx5e_ktls_handle_tx_skb(tls_ctx, sq, skb, datalen, state);
 
        /* FPGA */
@@ -378,11 +378,11 @@ void mlx5e_tls_handle_rx_skb_metadata(struct mlx5e_rq *rq, struct sk_buff *skb,
 
 u16 mlx5e_tls_get_stop_room(struct mlx5_core_dev *mdev, struct mlx5e_params *params)
 {
-       if (!mlx5_accel_is_tls_device(mdev))
+       if (!mlx5e_accel_is_tls_device(mdev))
                return 0;
 
-       if (mlx5_accel_is_ktls_device(mdev))
-               return mlx5e_ktls_get_stop_room(params);
+       if (mlx5e_accel_is_ktls_device(mdev))
+               return mlx5e_ktls_get_stop_room(mdev, params);
 
        /* FPGA */
        /* Resync SKB. */
index 29463bdb77159c1a5b8813f31dd95a60838a448e..ffc84f9b41b05e6c73bd18d146745a621e0bd600 100644 (file)
@@ -58,7 +58,7 @@ static const struct counter_desc *get_tls_atomic_stats(struct mlx5e_priv *priv)
 {
        if (!priv->tls)
                return NULL;
-       if (mlx5_accel_is_ktls_device(priv->mdev))
+       if (mlx5e_accel_is_ktls_device(priv->mdev))
                return mlx5e_ktls_sw_stats_desc;
        return mlx5e_tls_sw_stats_desc;
 }
@@ -67,7 +67,7 @@ int mlx5e_tls_get_count(struct mlx5e_priv *priv)
 {
        if (!priv->tls)
                return 0;
-       if (mlx5_accel_is_ktls_device(priv->mdev))
+       if (mlx5e_accel_is_ktls_device(priv->mdev))
                return ARRAY_SIZE(mlx5e_ktls_sw_stats_desc);
        return ARRAY_SIZE(mlx5e_tls_sw_stats_desc);
 }
index b1981dc9cc7b57e7ca4b733afe2df0f2fb8aeb32..0d59639f8ac0681a25ec010efeafe254bf16221b 100644 (file)
@@ -857,7 +857,7 @@ int mlx5e_open_rq(struct mlx5e_params *params, struct mlx5e_rq_param *param,
        if (err)
                goto err_destroy_rq;
 
-       if (mlx5e_is_tls_on(rq->priv) && !mlx5_accel_is_ktls_device(mdev))
+       if (mlx5e_is_tls_on(rq->priv) && !mlx5e_accel_is_ktls_device(mdev))
                __set_bit(MLX5E_RQ_STATE_FPGA_TLS, &rq->state); /* must be FPGA */
 
        if (MLX5_CAP_ETH(mdev, cqe_checksum_full))